Convolution Là Gì

  -  

Cách 1: Thí nghiệm giải pháp xử lý hình ảnh trực quan liêu trên setosa.io

Hãy vào website site nàyhttp://setosa.io/ev/image-kernels/để hưởng thụ với kernel khác nhau kết quả Áp sạc ra đang khác nhau thế nào. Nếu hiểu được thử nghiệm này, quá trình tiếp theo sau các bạn sẽ thấy rất dễ ợt.

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

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

Thứ nhất hãy thử nghiệm cùng với ma trận image đầu vào đầy đủ nhỏ dại để tính tân oán bằng tay thủ công với kiểm tra tác dụng đã!Bên trái là ma trận đầu vào, rất có thể là ảnh. Bên đề xuất là kernel là một ma trận dùng để biến đổi ma trận nguồn vào trong 2 vòng lặp lồng nhau convolution.Từ trái qua đề nghị, từ bỏ trên xuống dưới di chuyển hành lang cửa số có size bằng với kernel trên ma trận đầu vào, thực hiện phép nhân từng bộ phận thuộc vị trí ngơi nghỉ ma trận cửa số cùng với kernel rồi tính tổng ra giá trị scalar điền vào ma trận kết quả. Đây hotline là dot productChạy hết một hàngchạy mặt hàng tiếp theo cùng kết quả cuối cùngChạy xuống hàng tiếp sau cùng công dụng cuối cùngCó vài ba vấn đề cần giữ ý:Tích chập biến đổi những điểm hình ảnh nằm kề nhau trong ma trận cửa sổMa trận kernel bao gồm mặt hàng với 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 sản phẩm, một cộtKhông độc nhất thiết đề xuất bằng nhau, nlỗi thường thì kernel là ma trận vuôngKết trái sau tích chập convolution sẽ ảnh hưởng hụt đi vài ba sản phẩm với cột. lấy 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 hàng, 3 cột.

Xem thêm: Tra Từ: Hôn Thú Là Gì - Con Ngoài Giá Thú Là Gì

Cách 3: Code demo nghiệm

Đây là code thuở đầu không tối ưu, dùng những vòng lặp lồng nhau, đặc biệt là dễ dàng nắm bắt. Định nghĩa convolve_nest_loop trong tệp tin 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ẻ để hiệu quả dot hàng hóa trả về ghi vào vị trí vai trung phong chính giữama trận hành lang cửa số !line 8, 9: H, W là 1 trong những nửa sản phẩm với nửa cột sau thời điểm các loại đi đường nằm bao gồm giữaline 11: out là ma trận công dụng, bao gồm kích cỡ bằng ma trận nguồn vào, được khởi chế tạo ban đầu là toàn giá trị 0.line 13, 14: Hai vòng lặp ko kể thuộc biến chuyển đếm i mang lại hàng, j đến cột. Biến đếm i, j thay đổi để dịch rời ma trận cửa sổ.line 16, 17: Hai vòng lặp k, l triển khai phxay dot hàng hóa thân ma trận cửa sổ với kernelTại sao vòng lặp i, j ko bằng đầu từ 0 mà lại bắt đầu từ H, W? Hãy thử nhìn vào hình minh hoạ và tự vấn đáp nhé.Hãy chạy test file nàyhttps://github.com/hoidapthutuchaiquan.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 trái ra được là ma trận thuộc form size bởi ma trận đầu vào tuy thế bao quanh viền toàn là số 0, thực chất những phần tử này sẽ không được ghi quý hiếm vào vào phép tích chập.

Xem thêm: Binance Coin ( Bnb Là Gì ? Chiến Thuật Đầu Tư Hiệu Quả Nhất Với Bnb Năm 2021

<<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

lô ghích code này rất có thể cầm cố bằng numpy tensordot. Code ngọn với chạy nkhô nóng 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 độ nkhô giòn 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)))

Bước 5: quăng quật padding zero sinh sống ma trận đầu ra output hoặc thêm padding zero sinh hoạt ma trận đầu vào

Trong tệp tin convolute_lib.py gồm một vài hàm :def convolve_nest_loop(img, kernel): sử dụng 2 nested loop nhằm tính dot productdef convolve_np(img, kernel): nạm 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ố hàng cùng cột hụt đidef convolve_np4(img, kernel): thêm padding zero vào ma trận đầu vào nhằm đầu ra có kích thước bằng ma trận đầu vàoFile thực hành làhttps://github.com/hoidapthutuchaiquan.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 kích thước ma trận sau chuyển đổi. Trong các bài bác tiếp theo sau tôi vẫn giải thích cơ chế của pool layer vào Convolution Network, pool layer new thực thụ thu nhỏ 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 test hàm convolute

Để đánh giá hàm convolute gồm thiết kế đúng hay không hãy áp 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 tất .Kết quả ma trận Áp sạc ra đề xuất tương đương hết 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 hotline 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 dễ dàng rò rỉ, mấy vòng lặp for là cách xử lý ngon lành. Tuy nhiên trong ứng dụng thực tế, tăng speed xử trí hàm này mới là chuyện đáng bànTtốt vị chỉ phát âm nhiều paper cách làm toán thù trừu tượng, mình chọn cách thiết kế nhằm kiểm bệnh. Tất nhiên tôi cũng xem thêm từ rất nhiều người sáng tác không giống, trong lúc lập trình sẵn đúc rút được nhiều điều thú vị nlỗi cách xử trí padding zero, về 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 đề nghị cùng thêm một ở giá trị stop...Trong bài bác sau, mình sử dụng tlỗi viện convolution code nghỉ ngơi bài này để tạo nên một loạt cảm giác xử trí ảnh vô cùng cool.Dùng convolution, bạn sẽ biến đổi bức ảnh siêu make up. Hình như hoàn toàn có thể nối chuỗi những hàm convolution.