Xử lý ảnh - Convolution là gì?
OpenCV - tut 8: Convolution
Convolution là khái niệm quan trọng và sử dụng nhiều nhất trong xử lý ảnh / thị giác máy tính. Correlation / Convolution sẽ còn có liên quan đến các mô hình mạng học sâu (deep learning). Vì vậy, bạn hãy tìm hiểu thêm để nắm rõ khái niệm, cách thức hoạt động của toán tử này nhé này nhé.
Tương quan (correlation) là gì?
Correlation là toán tử mà ta áp dụng sliding window với phép biến đổi dot product trên mỗi vùng ảnh.
Ví dụ correlation 1D:
Data: [3 4 6 7 15 2 -3 4 -6]
Kernel: [-1 1 2]
Output: [13 16 31 12 -19 3 -5] (không có padding)
Giải thích:
- Output[0] = 3x(-1) + 4x1 + 6x2 = 13
- Output[1] = 4x(-1) + 6x1 + 7x2 = 16
- …
- Output[6] = (-3)x(-1) + 4x1 + (-6)x2 = -5
Ví dụ correlation 2D:
Image:
2 6 8 4 2
7 3 6 1 11
8 7 4 6 2
1 2 3 4 7
Kernel:
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
Ouput: áp dụng phép correlation kernel lên image (không padding)
5.67 5.00 4.89
4.56 4.00 4.89
Giải thích:
- Ouput[0][0] = 2x(1/9) + 6x(1/9) + 8x(1/9) + 7x(1/9) + 3x(1/9) + 6x(1/9) + 8x(1/9) + 7x(1/9) + 4x(1/9) = 51/9 = ~5.67
- …
- Các bạn tính tương tự cho các giá trị còn lại trong ảnh Output
Tích chập (convolution) là gì?
Convolution (tích chập) là toán tử mà ta thực hiện xoay cửa sổ 180 độ (flip over, tức flip 2 lần lần lượt theo trục x và y) rồi sau đó áp dụng phép correlation (tương quan).
Ví dụ convolution 1D:
Data: [3 4 6 7 15 2 -3 4 -6]
Kernel: [-1 1 2]
Output: [4 7 4 27 29 -3 4] (không có padding)
Giải thích:
- Xoay kernel 180 độ thành kernel': [2 1 -1]
- Áp dụng correlation của cửa sổ [2 1 -1] lên data.
Ý nghĩa của correlation / convolution?
- Correlation là toán tử tìm sự tương quan của cửa sổ trên ảnh gốc. Bạn để ý rằng, vùng pixel trên ảnh gốc có mẫu (pattern) càng giống với cửa sổ (kernel) thì giá trị tại điểm tương ứng của ảnh đầu ra càng lớn. Bạn hãy xem lại ví dụ correlation 1D sẽ thấy rõ điều này, vùng 3 pixel có phân bố càng giống kernel (-1 1 2 –> giá trị lớn dần và pixel cuối lớn nhất gấp đôi) thì giá trị đầu ra càng lớn, đây chính là ý nghĩa của tích vô hướng.
- Điểm khác biệt lớn nhất của convolution với correlation đó là convolution có tính chất kết hợp: \(K2*(K1*I) = (K2*K1)*I\). Điều này thể hiện rằng thay vì ta lấy ảnh gốc I convolve với kernel K1, sau đó lấy ảnh kết quả convolve với K2 THÌ ta có thể thực hiện lấy kernel K1 convole với K2 thành 1 kernel nào đó, sau đó lấy kernel kết quả này áp dụng cho ảnh gốc I. Chính nhờ tính chất này mà khi thiết kế kernel, thay vì thiết kế nhiều phép convolve tuần tự ta có thể kết hợp chúng lại thành 1 kernel duy nhất. Chi phí tính toán của convolution / correlation là tương đối lớn.
Một số kernel thông dụng
- Kernel đạo hàm ảnh ((-1, 0, 1)) theo trục x: ta lấy giá trị pixel bên phải trừ bên trái. Giá trị pixel trên ảnh kết quả lớn (màu trắng) thể hiện tại điểm đó trên ảnh gốc có sự biến đổi màu sắc lớn theo trục x. Tương tự ta có kernel đạo hàm ảnh theo trục y: ((-1), (0), (1)).
- Kernel làm mở ảnh, ví dụ kích thước 3x3: ((1/9, 1/9, 1/9), (1/9, 1/9, 1/9), (1/9, 1/9, 1/9)). Tổng quá hóa kernel có kích thước MxM thì mỗi phần tử trong kernel có giá trị đều là \(\frac{1}{M^2}\). Phép làm mờ bằng cách áp dụng ma trận có tính chất như trên có tên là box blur (có thể bạn sẽ thấy đâu đó ở những bộ lọc trong ứng dụng xử lý ảnh như photoshop chẳng hạn).
- …
Giải thích về kernel làm sáng và mờ ảnh ở bài post sliding window:
- Kernel biến đổi mức sáng 1x1 làm ảnh sáng lên (mức sáng về gần 255): (3)
- Kernel làm mờ ảnh box blur 3x3: ((1/9, 1/9, 1/9), (1/9, 1/9, 1/9), (1/9, 1/9, 1/9))
- Kernel kết hợp của kernel làm sáng và làm mờ phía trên bằng cách convolve kernel 1x1 lên kernel 3x3 ta được: ((1/3, 1/3, 1/3), (1/3, 1/3, 1/3), (1/3, 1/3, 1/3))
- Áp dụng kernel kết hợp ta được hiệu ứng như ảnh kết quả ở post trước:
img_7_lighten_blur.jpg
Bonus: toán tử correlation / convolution trong Deep Learning giờ ra sao?
- Toán tử correlation / convolution đã được tối ưu hóa tính toán cực kỳ nhanh trên card đồ họa GPU, nhờ các core tính toán song song trên phần cứng đã được tối hóa. Hiện tại tiên phong trong lĩnh vực sản xuất card đồ họa đó là Nvidia. Card đồ họa tạm ổn để bạn có thể bước vào con đường nghiên cứu deep learning đó là card GTX1080 (11GB RAM GPU), trị giá khoảng $1000.
- Cốt lõi của deep learning trong xử lý ảnh đó là mạng convolutional neural network (CNN), các giá trị của kernel được học (learn) trong các lần lan truyền ngược sau khi tính toán hàm lỗi (loss). Trong khi các phương pháp truyền thống (kiểu cũ), kernel được thiết kế thủ công (handcraft) dựa trên những kiến thức xử lý ảnh nền tảng và thực nghiệm.
- Chính vì vậy, bản chất của deep learning là mô hình sau khi được huấn luyện sẽ học được các bộ kernel (1 bộ kernel là 1 lớp convolution 2d) tốt nhất cho việc trích đặc trưng hình ảnh.
- Để sử dụng tốt deep learning, người ta cần có kiến trúc mạng (net architecture) tốt, hàm lỗi (loss function) đủ mạnh, dữ liệu (data) đủ nhiều và bộ siêu tham số (hyper parameter) hợp lý để huấn luyện ra được mô hình mạnh mẽ.
- Convolution / correlation vẫn đang được dùng rất nhiều trong xử lý ảnh, kể cả deep learning tại thời điểm này.
Cảm ơn bạn đã theo dõi bài viết. Hãy kết nối với tớ nhé!
- Minh: https://www.facebook.com/minhng.info
- Khám phá xử lý ảnh - GVGroup: https://www.facebook.com/groups/ip.gvgroup
Khám phá xử lý ảnh - GVGroup
Danh sách bài viết series OpenCV:
- Hashtag #OpenCV
- Tut 1: Xử lý ảnh - OpenCV đọc ghi hình ảnh (code Python và C++)
- Tut 1.1: Xử lý ảnh - Cấu trúc dữ liệu ảnh trong OpenCV. Pixel là gì?
- Tut 1.2: Xử lý ảnh - Chuyển đổi ảnh OpenCV sang Pillow và ngược lại
- Tut 2: Xử lý ảnh - OpenCV resize, crop và padding hình ảnh (code Python và C++)
- Tut 3: Xử lý ảnh - OpenCV biến đổi mức sáng hình ảnh (code Python)
- Tut 4: Xử lý ảnh - OpenCV vùng quan tâm (ROI) là gì? (code Python)
- Tut 4.1: Xử lý ảnh - OpenCV: vẽ văn bản, đường thẳng, mũi tên, hình chữ nhật, hình tròn, ellipse, đa giác
- Tut 4.2: Xử lý ảnh - Pha trộn ảnh trong OpenCV (blending)
- Tut 5: Xử lý ảnh - OpenCV ảnh nhị phân
- Tut 6: Xử lý ảnh - OpenCV cân bằng sáng (histogram equalization)
- Tut 7: Xử lý ảnh - OpenCV kỹ thuật cửa sổ trượt (sliding window)
- Tut 8: Xử lý ảnh - Convolution là gì?
- Tut 9: Xử lý ảnh - Làm mờ ảnh (blur)
- Tut 10: Xử lý ảnh - Gradient của ảnh là gì?
- Tut 11: Xử lý ảnh - Phát hiện cạnh Canny (Canny Edge Detection)
- Tut 12: Xử lý ảnh - Phát hiện đường thẳng bằng Hough Transform (Hough Line)
- Tut 13: Xử lý ảnh - Hiện thực phát hiện đoạn thẳng dùng Hough Transform (Hough Line)
- Tut 14: Xử lý ảnh - Giải thuật phân vùng Region Growing trên ảnh màu
- Tut 15: Xử lý ảnh - Giải thuật Background Subtraction trên ảnh màu
- Tut 16: Xử lý ảnh - Frame Subtraction để phát hiện chuyển động trong video
- Tut 17: Xử lý ảnh - HOG - Histograms of Oriented Gradients
- Tut 18: Xử lý ảnh - HOG - Huấn luyện mô hình phân loại người
- Tut 19: Xử lý ảnh - HOG - Phát hiện người
- Tut 20: Xử lý ảnh - Tổng hợp kinh nghiệm xử lý ảnh (End)
- Tut 21: Xử lý ảnh - Hiện thực trích đặc trưng Local Binary Patterns (LBP)
- Tut 22: Xử lý ảnh - Trích đặc trưng Gabor filters