Hiện nay, phần lớn các thuật toán xử lý hình ảnh đều được xây dựng dựa trên Convolutional Neural Network (CNN). Do đó, trong bài này chúng ta sẽ cùng tìm hiểu về nguyên lý hoạt động chung của CNN. Ở các bài tiếp theo, chúng sẽ sẻ tìm hiểu về các biến thể khác của CNN và mô hình kiến trúc của các biến thể này.

CNN được sử dụng với vai trò data reduction and information extraction nhằm trích xuất các thông tin quan trọng, giảm thiểu các thông tin không cần thiết, qua đó giúp tiết kiệm thời gian trong quá trình huấn luyện mô hình và nâng cao chất lượng của mô hình. Tương tự như Feed Forward Neural Network thì CNN cũng là một mạng Neuron được hình thành từ nhiều Layers khác nhau. Tuy nhiên các Layers trong CNN được gọi là Convolutional layers vì nó sử dụng thuật toán Convolution thay vì Weighted sum như trong Feed Forward Neural Network. Ở đây, chúng ta có thể hiểu Convolution là việc sử dụng một Sliding window để tính toán giá trị output từ một Matrix đầu vào như mô tả trong hình duới đây [1].Trong hình trên, ta coi Matrix đầu vào là một ảnh đen trắng với 25 pixels. Mỗi một pixel có giá trị là 0 (đen) hoặc 1 (trắng). Tiếp theo, ta sử dụng Sliding window với kích thước 3×3 để tính output bằng cách nhân từng vùng của Matrix với Slice window rồi tính tổng của phép nhân đó. Ở đây, ta dịch chuyển Sliding window theo từng đơn vị một, tuy nhiên ta cũng có thể dịch chuyển 2 đơn vị (Stride = 2) hoặc 3 đơn vị (Stride = 3),… theo cả hai chiều ngang và dọc. Thông thường, trong CNN chúng ta gọi Sliding window là Kernel, Filter hoặc Feature Detector và kích thước của các Sliding window thường là 3×3, 5×5 hoặc 7×7. Mục đích của việc sử dụng Filter (Sliding window) là để phát hiện các patterns trong dữ liệu đầu vào như edge, objects, shape …. Ví dụ như hình dưới đây mô tả cách mà một Filter 3×3 có thể phát hiện Vertical Edge của một image [2].

Chúng ta thấy nửa bên trái của bức ảnh có màu trắng còn nửa bên phải có màu đen. Do đó Vertical edge chính là phần ở giữa, phân tách vùng màu trắng vời vùng màu đen. Filter ta sử dụng ở đây có kích cỡ 3×3 với giá trị 1 là màu trắng, 0 là màu xám còn -1 là màu đen. Khi đó, ở kết quả Output ta có thể phát hiện Vertical edge với màu trắng nổi lên giữa màu xám ở hai bên.

Tương tự như vậy, bằng cách sử dụng một Filter với một giá trị hợp lý, ta có thể phát hiện được một pattern nhất định trong dữ liệu đầu vào. Ở đây, giá trị của Filter được coi là các parameters và được học thông qua quá trình huấn luyện Model.

Tuy nhiên, trong thực tế, các hình ảnh thường có dạng 3-dimension (Height x Width x Chanel) thay vì 2-dimension (Height x Width) như ở trên. Do đó thì các Filter cũng phải ở dạng 3-dimension với số lượng Chanel bằng với số lượng Chanel của dữ liệu đầu vào. Khi đó, việc thực hiện Convolution cũng được tiến hành tương tự nhưng theo từng Chanel rồi sau đó ta cộng tổng kết quả của các Chanel lại với nhau.

Ngoài ra, ta cũng có thể sử dụng nhiều Filter để phát hiện các Patterns khác nhau. Ví dụ như Filter 1 để phát hiện Vertical edge còn Filter 2 để phát hiện Horizontal edge,.. Khi đó, ta cũng thu được kết quả ở dạng 3-dimension. Sau đó, ta thêm giá trị Bias vào kết quả đầu ra của mỗi Filter (mỗi một Filter có thể có giá trị bias khác nhau) rồi sử dụng một activation function để tính toán kết quả cuối cùng. Khi đó, kết quả này cũng chính là Output của một Convolutional Layer [3].

Thông thường, một Model sẽ có nhiều Convolutional Layers và mỗi Convolutional Layer lại có nhiệm vụ phát hiện một Pattern nhất định. Tuy nhiên, Layer sau thường được dùng để phát hiện Pattern ở mức độ cao hơn Layer trước. Ví dụ như Layer 1 để phát hiện các Edge trong một hình ảnh, Layer2 sử dụng các Edge này để phát hiện các Shape của Object và Layer 3 lại sử dụng các Shape này để phát hiện các bộ phận như mắt, mũi, miệng,..

Ngoài ra, chúng ta thường kết hợp các Convolutional Layers với Pooling Layers và Fully Connected Layers để tạo thành một Model với độ chính xác cao hơn. Ở đây, Pooling Layer được sử dụng để giảm kích thước ở từng Layer, từ đó tăng tốc độ xử lý và làm giảm thời gian huấn luyện. Ngoài ra, Pooling Layer còn giúp nâng cao hiệu quả của việc phát hiện các Pattern.

Thông thường, có hai dạng Pooling chính là Max Pooling và Average Pooling. Trong đó, Max Pooling chọn giá trị lớn nhất làm giá trị đầu ra còn Average Pooling thì chọn giá trị trung bình cộng. Trong hình dưới, ta sử dụng Filter với kích thước 2×2 và stride=2 để tính giá trị Pooling.

Như vậy, một Model sử dụng CNN thường có cấu trúc tổng quát như sau:

Lưu ý:

– Đối với Pooling layer, chúng ta chỉ có hyper-parameters do người dùng thiết lập lúc đầu là Filter size, Stride và Filter type (Max hoặc Avg Pooling) mà không có các parameters được học trong quá trình huấn luyện. Do đó, trong nhiều trường hợp chúng ta thường coi Convolutional Layer + Pooling layer là 1 Layer.

– Trước khi kết nối với Fully connected layer, chúng ta cần phải thực hiện Flatten để chuyển dữ liệu từ dạng 3-dimension thành 2-dimension.

– Khi xây dựng một CNN Model, chúng ta nên tham khảo các Model có sẵn để chọn các Hyper-parameters một cách hợp lý. Tuy nhiên, các Convolutional Layer ở Layer tiếp theo thường có giá trị Height và Width giảm dần còn giá trị Chanel thì tăng lên.

[1] http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

[2]https://www.coursera.org/lecture/convolutional-neural-networks/simple-convolutional-network-example-A9lXL

[3] https://indoml.com/2018/03/07/student-notes-convolutional-neural-networks-cnn-introduction/

Tháng Một 11, 2022
ITechSeeker