TÍCH CHẬP

Hiệu đính thêm lại nội dung bài viết. Sau khi đăng lên, một số chuyên gia góp ý thực ra thuật toán vận dụng vào CNN là cross correlation chứ chưa hẳn là convolution. đa phần thiết kế viên viết thư viện Deep Learning có chút ít nhầm lẫn hoặc thân quen miệng giữa 2 thuật toán thù này vị chúng tương đối tương đương nhau. Nếu Kernel matrix đối xứng trên với dưới, trái và đề xuất thì tác dụng Convolution cùng Correlation đồng nhất nhau.

Bạn đang xem: Tích chập

Tđê mê khảo thêm ở đây nhéDo convolutional neural networks flip the kernel?https://www.youtube.com/watch?v=MQm6ZP1F6mshttps://www.youtube.com/watch?v=C3EEy8adxvc

Convolution là một kỹ thuật quan trọng cách xử trí hình ảnh (digital image processing). Nó xuất hiện trong hầu hết các thuật toán có tác dụng mờ (Gausian Blur), xuất xắc nắm rõ các đường (edge detector). Trong dìm dạng ảnh (deep learning image processing), convolution layer là một tầng biến hóa ma trận đầu vào đểlàm rõ cùng bóc tách ra các tính năng của hình ảnh mà lại vẫn bảo toàn tính tương quan không gian giữa cổng output với nguồn vào.

*
Mạng Deep Learning gồm nhiều Convolution layer với Pooling layer

Convolution tuyệt còn được gọi là tích chập cũng khá được sử dụng trong phép đổi khác Fourrier tuy thế sẽ chuyển đổi tự miền thời gian sang trọng tần số hoặc ngược trở lại.

Bước 1: Thí nghiệm giải pháp xử lý hình ảnh trực quan lại trên setosa.io

Hãy vào web site nàyhttp://setosa.io/ev/image-kernels/nhằm những hiểu biết với kernel khác nhau kết quả cổng output sẽ không giống nhau như thế nào. Nếu hiểu được xem sét này, quá trình tiếp sau bạn sẽ thấy vô cùng dễ ợt.

Bước 2: Thí nghiệm với ma trận đủ nhỏ

Trước hết hãy thử nghiệm cùng với ma trận image nguồn vào đầy đủ nhỏ tuổi nhằm tính toán thủ công cùng kiểm soát kết quả đã!

Bên trái là ma trận nguồn vào, rất có thể là hình họa. Bên cần là kernel là 1 ma trận dùng làm chuyển đổi ma trận đầu vào trong 2 vòng lặp lồng nhau convolution.Từ trái qua cần, từ bỏ bên trên xuống bên dưới di chuyển cửa sổ bao gồm size bằng cùng với kernel bên trên ma trận đầu vào, tiến hành phnghiền nhân từng bộ phận thuộc địa chỉ nghỉ ngơi ma trận cửa ngõ số cùng với kernel rồi tính tổng ra cực hiếm scalar điền vào ma trận công dụng. Đây điện thoại tư vấn là dot product

*

*
Chạy không còn một hàng
*
Chạy xuống mặt hàng tiếp sau và kết quả cuối cùng

Có vài ba vấn đề cần lưu giữ ý:

Tích chập thay đổi những điểm ảnh ở kề nhau vào ma trận cửa ngõ sổMa trận kernel bao gồm sản phẩm cùng cột là số lẻ để quý giá dot hàng hóa gán được vào ô ở chính giữa, ma trận đầu dôi một hàng, một cộtKhông độc nhất thiết cần đều nhau, nhỏng thường thì kernel là ma trận vuôngKết quả sau tích chập convolution sẽ ảnh hưởng hụt đi vài ba mặt hàng với cột. Ví dụ kernel matrix là (3x3), thì hụt 2 sản phẩm, 2 cột, kernel matrix (4, 4) sẽ hụt 3 mặt hàng, 3 cột.

Xem thêm: Autocad Civil 3D 2015 Software Crack Download, Download Autocad Civil 3D 2015 Free

Bước 3: Code thử nghiệm

Đây là code thuở đầu chưa buổi tối ưu, dùng nhiều vòng lặp lồng nhau, đặc biệt là dễ hiểu. Định nghĩa convolve_nest_loop trong file convolute_lib.py

def convolve_nest_loop(img, kernel): img_height = img.shape<0> img_width = img.shape<1> kernel_height = kernel.shape<0> kernel_width = kernel.shape<1> H = (kernel_height - 1) // 2 W = (kernel_width - 1) // 2 out = np.zeros((img_height, img_width)) for i in np.arange(H, img_height - H): for j in np.arange(W, img_width - W): sum = 0 for k in np.arange(-H, H + 1): for l in np.arange(-W, W + 1): a = img w = kernel sum += (w * a) out = sum return outline 5, 6: kernel_height, kernel_width luôn là số lẻ nhằm tác dụng dot sản phẩm trả về ghi vào vị trí chổ chính giữa chủ yếu giữama trận cửa sổ !line 8, 9: H, W là 1 trong những nửa hàng với nửa cột sau khoản thời gian một số loại đi con đường nằm bao gồm giữaline 11: out là ma trận kết quả, có kích thước bởi ma trận đầu vào, được khởi tạo thuở đầu là toàn quý giá 0.line 13, 14: Hai vòng lặp kế bên cùng phát triển thành đếm i cho hàng, j đến cột. Biến đếm i, j biến hóa nhằm dịch rời ma trận cửa sổ.line 16, 17: Hai vòng lặp k, l triển khai phép dot sản phẩm giữa ma trận cửa sổ cùng với kernelTại sao vòng lặp i, j ko bởi đầu trường đoản cú 0 và lại bước đầu tự H, W? Hãy demo nhìn vào hình minh hoạ cùng từ bỏ trả lời nhé.Hãy chạy test file nàyhttps://github.com/gamesbaidoithuong.com/CythonOpenCV/blob/master/Convolution/Convolute_Basic1.py

import numpy as npimport convolute_lib as cnnin_img = np.array(<<1, 0, 0, 1, 0>, <0, 1, 1, 0, 1>, <1, 0, 1, 0, 1>, <1, 0, 0, 1, 1>, <0, 1, 1, 0, 1> >)kernel = np.array(<<1, 0, 0>, <0, 1, 1>, <1, 0, 1>>)out_img = cnn.convolve_nest_loop(in_img, kernel)with np.printoptions(suppress=True): print(out_img)Kết trái ra được là ma trận thuộc kích cỡ bởi ma trận nguồn vào nhưng mà bao bọc viền toàn là số 0, thực ra các phần tử này sẽ không được ghi giá trị vào vào phxay tích chập.

<<0. 0. 0. 0. 0.> <0. 5. 1. 3. 0.> <0. 2. 3. 3. 0.> <0. 2. 2. 5. 0.> <0. 0. 0. 0. 0.>>

Bước 4: nạm 2 vòng lặp bởi np.tensordot

xúc tích và ngắn gọn code này rất có thể gắng bởi numpy tensordot. Code ngọn và chạy nhanh hao hơn

sum = 0for k in np.arange(-H, H + 1): for l in np.arange(-W, W + 1): a = img w = kernel sum += (w * a) out = sumTốc độ nhanh hơn 3-5 lần với tensordot. Xem hàmdef convolve_np(img, kernel) nhé

for i in np.arange(H, img_height - H): for j in np.arange(W, img_width - W): out = np.tensordot(img, kernel, axes=((0, 1), (0, 1)))

Cách 5: bỏ padding zero sinh sống ma trận đầu ra hoặc thêm padding zero ngơi nghỉ ma trận đầu vào

Trong tệp tin convolute_lib.py tất cả một vài hàm :

def convolve_nest_loop(img, kernel): cần sử dụng 2 nested loop để tính dot productdef convolve_np(img, kernel): chũm nested loop bằng tensordotdef convolve_np2(img, kernel): vứt bỏ padding zero làm việc ma trận cổng đầu ra, số hàng với cột hụt đidef convolve_np4(img, kernel): thêm padding zero vào ma trận đầu vào nhằm cổng output tất cả kích thước bằng ma trận đầu vào

File thực hành thực tế làhttps://github.com/gamesbaidoithuong.com/CythonOpenCV/blob/master/Convolution/Convolute_Basic.py

Chúng ta chỉ tập trung vàodef convolve_np4(img, kernel): do nó không thay đổi kích thước ma trận sau biến hóa. Trong những bài tiếp sau tôi sẽ lý giải bề ngoài của pool layer trong Convolution Network, pool layer bắt đầu thực thụ thu nhỏ tuổi lại kích thước của ma trận.

def convolve_np4(img, kernel): img_height = img.shape<0> img_width = img.shape<1> kernel_height = kernel.shape<0> kernel_width = kernel.shape<1> H = (kernel_height - 1) // 2 W = (kernel_width - 1) // 2 out = np.zeros((img_height, img_width)) img = cv2.copyMakeBorder(img, H, H, W, W, cv2.BORDER_REPLICATE) for i in np.arange(H, img_height + 1): for j in np.arange(W, img_width + 1): out = np.tensordot(img, kernel, axes=((0, 1), (0, 1))) return out

Bước 6: kiểm thử hàm convolute

Để soát sổ hàm convolute có xây dựng đúng hay không hãy sử dụng kernel là ma trận identity,phần tửbao gồm giữabởi 1, còn sót lại bằng 0 vớ .Kết quả ma trận Áp sạc ra đề nghị như thể không còn ma trận đầu vào là được.

Line 3 import thư viện convolute_lib vừa viếtLine 12 định nghĩ ma trận identityLine 17 hotline hàmconvolve_np4

import numpy as npimport convolute_lib as cnnin_img = np.array(<<1, 0, 0, 1, 0>, <0, 1, 1, 0, 1>, <1, 0, 1, 0, 1>, <1, 0, 0, 1, 1>, <0, 1, 1, 0, 1> >)identity = np.array(( <0, 0, 0>, <0, 1, 0>, <0, 0, 0>))out_img = cnn.convolve_np4(in_img, identity)with np.printoptions(suppress=True): print(out_img)

Kết luận

Convolution, tích chập thực chất cũng dễ dàng và đơn giản rò rỉ, mấy vòng lặp for là cách xử lý ngon cơm. Tuy nhiên vào vận dụng thực tế, tăng tốc độ xử lý hàm này new là chuyện xứng đáng bànTgiỏi vị chỉ phát âm các paper công thức tân oán trừu tượng, bản thân chọn lựa cách thiết kế để kiểm triệu chứng. Tất nhiên tôi cũng xem thêm từ nhiều người sáng tác khác, trong những khi thiết kế đúc rút được không ít điều thú vui nlỗi cách xử trí padding zero, tối ưu tốc độ triển khai, tại vì sao trong 2 vòng lặp dịch ma trận cửa sổ của hàm convolve_np4 lại phải cộng thêm một ở cực hiếm stop...Trong bài bác sau, mình thực hiện thư viện convolution code nghỉ ngơi bài bác này để tạo thành hàng loạt cảm giác cách xử lý ảnh rất cool.
*
Dùng convolution, các bạn sẽ chuyển đổi bức ảnh hết sức ảo diệu. Trong khi hoàn toàn có thể nối chuỗi các hàm convolution.