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

Bạn đang xem: Tích chập là gì

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

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

*
Mạng Deep Learning với nhiều Convolution layer cùng Pooling layer

Convolution hay có cách gọi khác là tích chập cũng rất được sử dụng trong phxay biến hóa Fourrier dẫu vậy vẫn thay đổi trường đoản cú miền thời gian quý phái tần số hoặc ngược trở lại.

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

Hãy vào website site nàyhttp://setosa.io/ev/image-kernels/để thưởng thức với kernel không giống nhau tác dụng đầu ra đang khác nhau như thế nào. Nếu đọc được phân tích này, các bước tiếp sau bạn sẽ thấy siêu dễ ợt.

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

Thứ nhất thử nghiệm cùng với ma trận image đầu vào đủ nhỏ để tính toán thủ công bằng tay và khám nghiệm hiệu quả đã!

Bên trái là ma trận đầu vào, có thể là hình họa. Bên đề nghị là kernel là một trong những ma trận dùng để đổi khác ma trận đầu vào trong 2 vòng lặp lồng nhau convolution.Từ trái qua bắt buộc, từ bỏ bên trên xuống bên dưới dịch rời cửa sổ bao gồm kích thước bằng với kernel trên ma trận đầu vào, thực hiện phép nhân từng phần tử cùng địa chỉ ở ma trận cửa ngõ số với kernel rồi tính tổng ra giá trị scalar điền vào ma trận công dụng. Đây call là dot product

*

*
Chạy không còn một hàng
*
Chạy xuống hàng tiếp sau cùng tác dụng cuối cùng

Có vài ba điểm cần lưu ý:

Tích chập đổi khác những điểm hình ảnh nằm kề nhau vào ma trận cửa ngõ sổMa trận kernel tất cả hàng cùng cột là số lẻ để quý hiếm dot product gán được vào ô ở trung tâm, ma trận đầu dôi một sản phẩm, một cộtKhông duy nhất thiết yêu cầu cân nhau, như thông thường kernel là ma trận vuôngKết quả sau tích chập convolution có khả năng sẽ bị hụt đi vài ba mặt hàng và cột. ví dụ như kernel matrix là (3x3), thì hụt 2 mặt hàng, 2 cột, kernel matrix (4, 4) vẫn hụt 3 mặt hàng, 3 cột.

Xem thêm: Novice Là Gì - Nghĩa Của Từ Novice Trong Tiếng Việt

Cách 3: Code demo nghiệm

Đây là code ban đầu không buổi tối ưu, cần sử dụng nhiều vòng lặp lồng nhau, đặc biệt là dễ nắm bắt. Định nghĩa convolve_nest_loop vào 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ẻ để tác dụng dot hàng hóa trả về ghi vào địa điểm trọng tâm thiết yếu giữama trận hành lang cửa số !line 8, 9: H, W là 1 trong nửa mặt hàng và nửa cột sau khi các loại đi con đường ở bao gồm giữaline 11: out là ma trận tác dụng, gồm kích thước bởi ma trận đầu vào, được khởi tạo nên ban sơ là toàn giá trị 0.line 13, 14: Hai vòng lặp xung quanh thuộc trở nên đếm i cho mặt hàng, j mang đến cột. Biến đếm i, j biến hóa để dịch chuyển ma trận cửa sổ.line 16, 17: Hai vòng lặp k, l tiến hành phép dot product thân ma trận cửa sổ cùng với kernelTại sao vòng lặp i, j không bằng đầu từ bỏ 0 và lại bước đầu trường đoản cú H, W? Hãy test quan sát vào hình minh hoạ với từ vấn đáp nhé.Hãy chạy test file nàyhttps://github.com/xemlienminh360.net/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 tuy vậy bao phủ viền toàn là số 0, thực tế các phần tử này không được ghi cực hiếm 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.>>

Cách 4: vậy 2 vòng lặp bởi np.tensordot

xúc tích và ngắn gọn code này hoàn toàn có thể cố bằng numpy tensordot. Code ngọn và chạy nhanh 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 độ nkhô nóng 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: vứt 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 có 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): cố nested loop bởi tensordotdef convolve_np2(img, kernel): đào thải padding zero sống ma trận đầu ra, số sản phẩm với cột hụt đidef convolve_np4(img, kernel): thêm padding zero vào ma trận nguồn vào nhằm áp ra output bao gồm kích cỡ bằng ma trận đầu vào

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

Chúng ta chỉ tập trung vàodef convolve_np4(img, kernel): vì chưng nó giữ nguyên kích cỡ ma trận sau biến đổi. Trong các bài xích tiếp theo tôi đang lý giải qui định của pool layer vào Convolution Network, pool layer bắt đầu thực sự thu nhỏ dại lại kích 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

Để bình chọn 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ửchính giữabằng 1, còn lại bằng 0 tất .Kết quả ma trận cổng đầu ra buộc phải tương đương 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 nghĩ về ma trận identityLine 17 call 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 tế cũng đơn giản và dễ dàng rò rỉ, mấy vòng lặp for là cách xử lý ngon lành. Tuy nhiên vào ứng dụng thực tiễn, tăng tốc cách xử lý hàm này new là cthị xã đáng bànTxuất xắc do chỉ gọi những paper bí quyết toán trừu tượng, mình chọn lựa cách lập trình để kiểm hội chứng. Tất nhiên tôi cũng tham khảo từ rất nhiều người sáng tác không giống, trong những lúc lập trình sẵn đúc rút được không ít điều thú vui nlỗi giải pháp xử lý padding zero, về tối ưu tốc độ thực thi, tại sao trong 2 vòng lặp dịch ma trận hành lang cửa số của hàm convolve_np4 lại nên cộng thêm 1 sinh sống quý giá stop...Trong bài sau, mình sử dụng tlỗi viện convolution code sinh hoạt bài bác này nhằm tạo ra một loạt hiệu ứng giải pháp xử lý hình họa siêu cool.
*
Dùng convolution, bạn sẽ thay đổi bức ảnh khôn cùng 3D. Bên cạnh đó rất có thể nối chuỗi các hàm convolution.

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *