CONVOLUTION LÀ GÌ

  -  

Cách 1: Thí nghiệm xử lý hình ảnh trực quan tiền bên trên setosa.io

Hãy vào website site nàyhttp://setosa.io/ev/image-kernels/nhằm từng trải cùng với kernel khác nhau kết quả áp ra output vẫn khác biệt ra sao. Nếu phát âm được thử nghiệm này, quá trình tiếp sau bạn sẽ thấy khôn cùng dễ dãi.

Bạn đang xem: Convolution là gì

Cách 2: Thí nghiệm với ma trận đầy đủ nhỏ

Trước hết thử nghiệm cùng với ma trận image đầu vào đủ bé dại nhằm tính toán thủ công bằng tay với đánh giá hiệu quả đã!Bên trái là ma trận nguồn vào, rất có thể là hình họa. Bên nên là kernel là 1 trong ma trận dùng làm biến hóa ma trận đầu vào vào 2 vòng lặp lồng nhau convolution.Từ trái qua nên, từ bỏ bên trên xuống bên dưới di chuyển cửa sổ bao gồm form size bằng cùng với kernel bên trên ma trận nguồn vào, tiến hành phnghiền nhân từng thành phần cùng địa chỉ ngơi nghỉ ma trận cửa ngõ số cùng với kernel rồi tính tổng ra quý hiếm scalar điền vào ma trận công dụng. Đây Gọi là dot productChạy không còn một hàngchạy sản phẩm tiếp theo sau và tác dụng cuối cùngChạy xuống mặt hàng tiếp theo sau cùng công dụng cuối cùngCó vài ba điểm cần lưu giữ ý:Tích chập chuyển đổi các điểm hình ảnh nằm kề nhau trong ma trận cửa ngõ sổMa trận kernel gồm mặt hàng cùng cột là số lẻ để quý giá dot hàng hóa gán được vào ô ở vị trí chính giữa, ma trận đầu dôi một hàng, một cộtKhông độc nhất thiết buộc phải bằng nhau, nlỗi thường thì kernel là ma trận vuôngKết quả sau tích chập convolution sẽ bị hụt đi vài mặt hàng và cột. Ví dụ kernel matrix là (3x3), thì hụt 2 mặt hàng, 2 cột, kernel matrix (4, 4) sẽ hụt 3 mặt hàng, 3 cột.

Xem thêm: Achieved Là Gì - Nghĩa Của Từ Achieve

Bước 3: Code test nghiệm

Đây là code ban đầu không buổi tối ưu, sử dụng những vòng lặp lồng nhau, quan trọng đặc biệt là dễ dàng nắm bắt. Định nghĩa convolve_nest_loop vào file convolute_lib.pydef 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 luôn là số lẻ nhằm công dụng dot sản phẩm trả về ghi vào địa điểm trọng điểm bao gồm giữama trận cửa sổ !line 8, 9: H, W là 1 trong nửa mặt hàng cùng nửa cột sau khoản thời gian nhiều loại đi mặt đường ở chủ yếu giữaline 11: out là ma trận tác dụng, có form size bằng ma trận đầu vào, được khởi tạo ra ban đầu là toàn quý hiếm 0.line 13, 14: Hai vòng lặp ngoài thuộc vươn lên là đếm i mang đến hàng, j đến cột. Biến đếm i, j biến hóa để dịch chuyển ma trận hành lang cửa số.line 16, 17: Hai vòng lặp k, l tiến hành phxay dot sản phẩm thân ma trận cửa sổ cùng với kernelTại sao vòng lặp i, j ko bởi đầu tự 0 mà lại ban đầu từ H, W? Hãy demo quan sát vào hình minc hoạ và từ bỏ vấn đáp nhé.Hãy chạy thử tệp tin nàyhttps://github.com/isys.com.vn/CythonOpenCV/blob/master/Convolution/Convolute_Basic1.pyimport 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 quả ra được là ma trận cùng size bởi ma trận đầu vào tuy vậy xung quanh viền toàn là số 0, thực ra những phần tử này không được ghi quý hiếm vào vào phnghiền tích chập.

Xem thêm: Siêu Nhân Đại Chiến Manga Đại Chiến), Siêu Nhân Đại Chiến (Game

<<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ằng np.tensordot

súc tích code này có thể cố kỉnh bằng numpy tensordot. Code ngọn gàng cùng chạy nhanh khô hơnsum = 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 cổng đầu ra hoặc thêm padding zero nghỉ ngơi ma trận đầu vào

Trong file convolute_lib.py có một trong những hàm :def convolve_nest_loop(img, kernel): sử dụng 2 nested loop nhằm tính dot productdef convolve_np(img, kernel): thay nested loop bởi tensordotdef convolve_np2(img, kernel): thải trừ padding zero sinh sống ma trận Áp sạc ra, số sản phẩm và cột hụt đidef convolve_np4(img, kernel): thêm padding zero vào ma trận nguồn vào để cổng output có kích thước bằng ma trận đầu vàoFile thực hành làhttps://github.com/isys.com.vn/CythonOpenCV/blob/master/Convolution/Convolute_Basic.pyChúng ta chỉ tập trung vàodef convolve_np4(img, kernel): bởi nó giữ nguyên form size ma trận sau biến hóa. Trong các bài tiếp sau tôi đang phân tích và lý giải qui định của pool layer trong Convolution Network, pool layer new đích thực thu nhỏ lại size 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

Cách 6: kiểm demo hàm convolute

Để khám nghiệm 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ằng 1, còn lại bằng 0 vớ .Kết quả ma trận áp ra output đề nghị như thể không còn ma trận đầu vào là được.Line 3 import tlỗi viện convolute_lib vừa viếtLine 12 định suy nghĩ ma trận identityLine 17 Điện thoại tư vấn hàmconvolve_np4import 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 ra cũng đơn giản và dễ dàng 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 tiễn, tăng tốc độ cách xử trí hàm này bắt đầu là cthị xã đáng bànTxuất xắc vị chỉ phát âm các paper phương pháp toán thù trừu tượng, bản thân chọn lựa cách thiết kế nhằm kiểm chứng. Tất nhiên mình cũng tìm hiểu thêm từ khá nhiều người sáng tác không giống, trong những lúc xây dựng rút ra được không ít điều thú vui nhỏng cách xử lý padding zero, tối ưu tốc độ triển khai, tại vì sao vào 2 vòng lặp dịch ma trận hành lang cửa số của hàm convolve_np4 lại đề nghị cộng thêm một nghỉ ngơi quý hiếm stop...Trong bài sau, bản thân thực hiện tlỗi viện convolution code sinh sống bài xích này nhằm tạo nên một loạt cảm giác xử trí hình họa rất cool.Dùng convolution, bạn sẽ thay đổi bức ảnh hết sức biến hóa. Ngoài ra hoàn toàn có thể nối chuỗi các hàm convolution.