Hướng dẫn python 2d convolution from scratch - python 2d chập từ đầu
Show
Động lực trên kho lưu trữTôi đã cố gắng tìm thuật toán tích chập với sự giãn nở, được thực hiện từ đầu trên một con trăn thuần túy, nhưng không thể tìm thấy gì. Có rất nhiều CNN tự viết trên internet và trên github, v.v. của bất kỳ hình thức nào có thể điều chỉnh trên cả hai tham số trục, chẳng hạn như sải chân, đệm và quan trọng nhất là sự giãn nở. Cái cuối cùng không thể được tìm thấy theo nghĩa đen ở bất cứ đâu! Đây là lý do tại sao kho lưu trữ này và hình ảnh này đã xuất hiện. Ai cần cái này?Nếu bạn đã từng muốn hiểu làm thế nào thuật toán có vẻ đơn giản này có thể thực sự được thực hiện trong mã, kho lưu trữ này là dành cho bạn. Hóa ra, không dễ để gắn tất cả các tham số với nhau trong mã để làm cho nó chung chung, rõ ràng và rõ ràng (và tối ưu về mặt tính toán). Hãy sử dụng nó như bạn muốn. Nội dung
Giải trìnhÝ tưởng trong NutshellChi tiết về thực hiện (sớm) Cách sử dụng
Dữ liệu hình ảnh hoặc đầu vào là một số ma trận; Cách sử dụngVí dụ với ma trận và kernel của bạnVí dụ với hình ảnh và bộ lọc của bạn matrix = np.array([[1, 4, 4, 2, 1, 0, 0, 1, 0, 0, 3, 3, 3, 4], [0, 2, 0, 2, 0, 3, 4, 4, 2, 1, 1, 3, 0, 4], [1, 1, 0, 0, 3, 4, 2, 4, 4, 2, 3, 0, 0, 4], [4, 0, 1, 2, 0, 2, 0, 3, 3, 3, 0, 4, 1, 0], [3, 0, 0, 3, 3, 3, 2, 0, 2, 1, 1, 0, 4, 2], [2, 4, 3, 1, 1, 0, 2, 1, 3, 4, 4, 0, 2, 3], [2, 4, 3, 3, 2, 1, 4, 0, 3, 4, 1, 2, 0, 0], [2, 1, 0, 1, 1, 2, 2, 3, 0, 0, 1, 2, 4, 2], [3, 3, 1, 1, 1, 1, 4, 4, 2, 3, 2, 2, 2, 3]]) Chạy thử nghiệm kernel = np.array([[0, 1, 3, 3, 2], [0, 1, 3, 1, 3], [1, 1, 2, 0, 2], [2, 2, 3, 2, 0], [1, 3, 1, 2, 0]]) Trích dẫn from convolution import conv2d feature_map = conv2d(matrix, kernel, stride=(2, 1), dilation=(1, 2), padding=(0, 0)) Trong tích chập 2D, chúng tôi di chuyển một số ma trận nhỏ được gọi là kernel qua hình ảnh 2D (một số ma trận) và nhân phần yếu tố của nó lên trên mỗi ma trận phụ, sau đó tổng hợp các phần tử của ma trận phụ thu được thành một pixel của bản đồ tính năng được gọi là bản đồ. Chúng tôi di chuyển nó từ bên trái sang phải và từ trên xuống dưới. Vào cuối chập, chúng ta thường bao phủ toàn bộ bề mặt hình ảnh, nhưng điều đó không được đảm bảo với các tham số phức tạp hơn. GIF này (nguồn) dưới đây trình bày hoàn hảo bản chất của tích chập 2D: Ma trận màu xanh lá cây là hình ảnh, màu vàng là hạt nhân và san hô đỏ là bản đồ tính năng: Hãy làm rõ nó và đưa ra một định nghĩa cho mọi thuật ngữ được sử dụng:Dữ liệu hình ảnh hoặc đầu vào là một số ma trận; import imageio import matplotlib.pyplot as plt import numpy as np gaussian_blur = np.array([ [1, 2, 1], [2, 4, 2], [1, 2, 1] ]) / 16 image = imageio.imread('files/pic.jpg') plt.imshow(image) Kernel là một ma trận nhỏ mà chúng ta nhân với các ma trận phụ của hình ảnh; filtered_image = apply_filter_to_image(image, gaussian_blur) plt.imshow(filtered_image) Stride là kích thước của bước của slide. Ví dụ: khi sải chân bằng 1, chúng ta di chuyển trên 1 pixel trên mỗi bước, khi 2, thì chúng ta di chuyển trên 2 pixel, v.v. Hình ảnh này có thể giúp bạn tìm ra nó;
Chạy thử nghiệmpython -m unittest tests.py Trích dẫnTrong tích chập 2D, chúng tôi di chuyển một số ma trận nhỏ được gọi là kernel qua hình ảnh 2D (một số ma trận) và nhân phần yếu tố của nó lên trên mỗi ma trận phụ, sau đó tổng hợp các phần tử của ma trận phụ thu được thành một pixel của bản đồ tính năng được gọi là bản đồ. Chúng tôi di chuyển nó từ bên trái sang phải và từ trên xuống dưới. Vào cuối chập, chúng ta thường bao phủ toàn bộ bề mặt hình ảnh, nhưng điều đó không được đảm bảo với các tham số phức tạp hơn. GIF này (nguồn) dưới đây trình bày hoàn hảo bản chất của tích chập 2D: Ma trận màu xanh lá cây là hình ảnh, màu vàng là hạt nhân và san hô đỏ là bản đồ tính năng:
Hãy làm rõ nó và đưa ra một định nghĩa cho mọi thuật ngữ được sử dụng: Làm thế nào để bạn thực hiện một tích chập 2D trong Python?Để bắt đầu phương thức tích chập 2D, chúng tôi sẽ có tiêu đề phương thức sau: def convolve2d (hình ảnh, kernel, padding = 0, sải bước = 1): sao cho hình ảnh và kernel được chỉ định bởi người dùng và đệm mặc định xung quanh hình ảnh là 0 và Stride mặc định là 1.def convolve2D(image, kernel, padding=0, strides=1): Such that the image and kernel are specified by the user and the default padding around the image is 0 and default stride is 1.
Làm thế nào để bạn thực hiện tích chập trong 2D?Con chập 2D là một hoạt động khá đơn giản trong tim: bạn bắt đầu với một hạt nhân, chỉ đơn giản là một ma trận nhỏ của trọng lượng. Hạt nhân này trượt qua dữ liệu đầu vào 2D, thực hiện phép nhân phần tử theo phần đầu vào hiện tại, và sau đó tổng kết các kết quả thành một pixel đầu ra duy nhất.
Làm thế nào để bạn tạo một hình ảnh chập?Để thực hiện tích chập trên một hình ảnh, nên thực hiện các bước sau ... Lật mặt nạ (theo chiều ngang và chiều dọc) chỉ một lần .. Trượt mặt nạ vào hình ảnh .. Nhân các phần tử tương ứng và sau đó thêm chúng .. Lặp lại quy trình này cho đến khi tất cả các giá trị của hình ảnh đã được tính toán .. Làm thế nào để convolve làm việc python?Phương thức Convolve () này trả về tích chập tuyến tính của hai mảng hoặc vectơ đơn, và toán tử toán học này thường được sử dụng trong xử lý tín hiệu như trong trường hợp này, các giao dịch không có mảng và mảng hoạt động như một tín hiệu sử dụng hai tín hiệu khác nhau (mỗi chiều một chiều) để có được ...returns the linear convolution of two single-dimensional arrays or vectors, and this mathematical operator is generally used in signal processing as in this case, the numpy deals with array and arrays act as a signal was using two different signals (each of one dimensional) to obtain discrete ... |