Hướng dẫn convolution in python without numpy - chập trong python không có numpy

Tôi cần viết một kết hợp ma trận mà không sử dụng bất kỳ chức năng tích hợp nào để giúp đỡ. Tôi đang chụp một hình ảnh và biến nó thành Greyscale, và sau đó tôi phải vượt qua một ma trận lọc qua nó. Một trong những ma trận bộ lọc tôi phải sử dụng là:

[[-1,0,1],
[-1,0,1],
[-1,0,1]]

Tôi hiểu cách kết hợp hoạt động, tôi chỉ không hiểu cách áp dụng kết hợp với mã. Đây là mã tôi đang sử dụng để có được mảng màu xám của tôi:

import numpy
from scipy import misc
mylist = []
for i in myfile:
    mylist.append(i)

for i in mylist:
    q = i
    print(q)
    image = misc.imread(q[0:-1])
    threshold()
image = misc.imread('image1.png')


def averageArr(pixel): #make the pixel color values more realistic
    return 0.299*pixel[:,:,0] + 0.587*pixel[:,:,1] + 0.114*pixel[:,:,2]

def threshold():
    picture = averageArr(image)
    for i in range(0,picture.shape[0]): #begin thresholding 
        for j in range(0,picture.shape[1]):
            myList.append(i,j)
    misc.imsave('image1.png') #save the image file

Tôi lấy các giá trị từ hàm và thêm chúng vào một danh sách, và sau đó tôi phải lặp lại danh sách, nhưng tôi không chắc làm thế nào để làm điều đó. Tôi có thể sử dụng Scipy và Numpy để đọc và sắp xếp ma trận, nhưng chức năng tích chập thực tế phải được viết.

GIỚI THIỆU

Kết hợp với các hạt khác nhau (3x3, 5x5) được sử dụng để áp dụng hiệu ứng cho một hình ảnh là mài, làm mờ, phác thảo hoặc dập nổi.

Hình ảnh là một loạt các số được biểu thị dưới dạng một mảng có chiều rộng bằng các pixel chiều cao và mỗi pixel được liên kết với ba giá trị float dao động từ 0 đến 255. Ba số này đại diện cho màu đỏ, màu xanh lá cây và màu xanh lam của Cho pixel, sự kết hợp của ba người ghi lại màu sắc của nó.

Nếu hình ảnh là thang độ xám, một giá trị duy nhất có thể được sử dụng trên mỗi pixel, với 0 nghĩa là màu đen và 255 có nghĩa là màu trắng. Việc tích chập có được bằng cách đặt hạt nhân trước mọi khu vực của hình ảnh, giống như một cửa sổ trượt, sau đó thực hiện sản phẩm phần tử của các giá trị trong hạt nhân của chúng ta bởi các giá trị trong hình nó chồng lên nhau và tổng hợp nó :

Nếu chúng ta có một hình ảnh màu thông thường với 3 kênh thì kernel của chúng ta cũng nên có 3 kênh như hình dưới đây.

Đối với blog này, tôi chủ yếu sẽ sử dụng hình ảnh thang độ xám có kích thước [1,1,10,10] và hạt nhân của kích thước [1,1,3,3].

Cách tiếp cận

Chúng tôi đã giành được mã Code The Constrolution như một vòng lặp vì nó sẽ rất kém hiệu quả. Thay vào đó, chúng tôi sẽ vector hóa hình ảnh của chúng tôi để hoạt động tích chập chỉ trở thành một sản phẩm ma trận. Điều này có nghĩa là lấy từng cửa sổ trường tiếp nhận và viết các số vào một cột như hình bên dưới. This means taking each receptive field window and write the numbers in a column as shown below.

*Lưu ý chỉ 10 cột trường tiếp nhận được hiển thị trong hình ảnh trên.

Vector hóa tương tự có thể được thực hiện cho hình ảnh màu có 3 kênh như hình dưới đây.

Vectorization cho hình ảnh màu.

Hãy để mã hóa này!

Vì vậy, hãy để thử thực hiện lớp chập từ đầu bằng cách sử dụng Numpy!

Đầu tiên chúng tôi sẽ viết một lớp conv_module sẽ có luồng mã cơ bản, ở đây chuyển tiếp không được triển khai và vượt qua yêu cầu phương thức BWD phải được xác định. Thứ hai, chúng tôi sẽ sử dụng tích chập lớp được kế thừa từ Conv_Module và sau đó ghi đè lớp chuyển tiếp và nó cũng chứa phương thức BWD theo yêu cầu của Pass lùi.Conv_Module which will have basic code flow, here forward pass is not implemented and backward pass requires bwd method to be defined.
Secondly we will be using a class Convolution which inherit from Conv_Module and then overrides forward class and it also contains bwd method required by backward pass.

Hình ảnh
import numpy as np
import matplotlib.pyplot as plt
img=np.random.rand(1,1,10,10)
ker=np.random.rand(1,1,3,3)
input hình ảnh và hình ảnh hạt nhân

Trên IMG, KER đại diện cho hình ảnh/kernel mà chúng tôi sẽ sử dụng để thực hiện. Đặt tên quy ước là một cái gì đó giống như [b, d, h, w] trong đó b là kích thước hàng loạt, d là số lượng kênh hoặc độ sâu, h là chiều cao & w là chiều rộng. Chúng tôi sẽ khởi tạo là 0.img, ker represents the image/kernel we will be using for our implementation. Naming convention is something like [B,D,H,W] where B is he batch size, D is the number of channels or depth, H is Height & W is width.
Default padding and stride is 1, b is the bias which we will initialise as 0 .

Conv_Module

Có chức năng chính của numpy chúng ta sẽ sử dụng is1) np.repeat () 2) np.tile () 3) np.add.at ()
1) np.repeat()
2) np.tile()
3) np.add.at()

Chuyển tiếp qua

Hầu hết các địa điểm đã được bình luận trong mã để hiểu rõ hơn. Vào cuối đoạn mã mã blog này được đính kèm, tôi sẽ trải qua mã nhưng chủ yếu tính toán chỉ mục và vượt qua mà tôi cảm thấy là các khía cạnh chính.

Chiều cao đầu ra (self.out_h) & chiều rộng (self.out_w) sẽ tương tự như chiều cao và chiều rộng đầu vào, tức là 10,10 khi chúng ta đang sử dụng cùng một phần đệm. Sử dụng đệm pad_img được tạo xung quanh hình ảnh gốc.

Tính toán chỉ số

Để lưu trữ trường tiếp nhận làm vectơ, chỉ số được yêu cầu. Ở đây tôi có liên quan đến chỉ số đầu tiên, J liên quan đến chỉ số thứ hai của trường tiếp nhận và K là kích thước kênh. self.i được tính là tổng của i0 và i1, tương tự Self.j được tính bằng tổng của J0 và J1.i is related to first index , j in related to second index of the receptive field and k is channel dimension. self.i is calculated as the sum of i0 and i1, similarly self.j is calculated as the sum of j0 and j1.

Chỉ số tương ứng với từng trường tiếp nhận. Công thức vượt qua

Sử dụng hình ảnh I, J, K chỉ mục được lưu trữ ở dạng vector hóa, sau đó, điều này được nhân lên bởi các trọng số để có được đầu ra của Pass Pass (Convolve). Dưới đây là hình dung của đầu ra từ vượt qua.

Bỏ qua

Trong quá trình vượt qua, ba độ dốc được yêu cầu để tính toán: -a) độ dốc đối với BIAS.b) độ dốc đối với trọng lượng.c) gradient đối với hình ảnh đầu vào.
a) gradient with respect to bias.
b) gradient with respect to weight.
c) gradient with respect to input image.

Công thức tính toán độ dốc WRT cho các tham số khác nhau.

DB là độ dốc tính toán WRT thành sai lệch, DW là độ dốc tính toán WRT thành trọng số và x là gradient tính toán WRT thành đầu vào.

Các số 0 trống có kích thước [1,1,12,12] được tạo và sử dụng các giá trị chỉ mục chứa đầy các giá trị gradient.

Trực quan hóa của gradient wrt để đầu vào hình ảnh. Thời gian được thực hiện để tính toán tiến và lùi.

Như chúng ta có thể thấy rằng đường chuyền chuyển tiếp yêu cầu trung bình 376 và đường chuyền lùi đòi hỏi phải có giá trị trung bình 113. Toàn bộ đoạn mã tích chập ở bên dưới

Lớp học tích chập

Sự kết luận

Vì tích chập là khối cơ bản cho bất kỳ kiến ​​trúc nào, việc thực hiện nó mà không có bất kỳ vòng lặp nào tiết kiệm rất nhiều thời gian tính toán. Hãy chia sẻ, để lại nhận xét của bạn nếu bạn thích nó.Share, Leave your comment if you liked it.

Làm thế nào để bạn sử dụng tích chập trong Python?

Các bước thực hiện:..
Bước1: Mở máy tính xách tay Google Colab. Google Colab đã được sử dụng để thực hiện. ....
Bước 2: Nhập thư viện. Nhập CV2 Nhập Numpy dưới dạng Nhập NP matplotlib.Pyplot dưới dạng plt ..
Bước 3: Đọc một hình ảnh và vẽ nó. ....
Bước 4: Tạo hạt nhân và áp dụng chập ..

Convolve Python là gì?

Convolve () là một phương thức thư viện Numpy tích hợp được sử dụng để trả về sự tích chập tuyến tính, rời rạc của hai vectơ một chiều.Phương thức Numpy Convolve () chấp nhận ba đối số là V1, V2 và Chế độ và trả về sự tích chập tuyến tính của các vectơ một chiều V1 và V2.a built-in numpy library method used to return discrete, linear convolution of two one-dimensional vectors. The numpy convolve() method accepts three arguments which are v1, v2, and mode, and returns discrete the linear convolution of v1 and v2 one-dimensional vectors.

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à tích chập giống như sản phẩm dot?

Câu trả lời đơn giản là tích chập rời rạc tương đương với việc lấy sản phẩm chấm giữa các trọng số của bộ lọc và các giá trị bên dưới bộ lọc, và, về mặt hình học, các sản phẩm DOT đo độ tương tự vectơ.discrete convolution is equivalent to taking a dot product between the filter weights and the values underneath the filter, and, geometrically, dot products measure vector similarity.