我想做一些类似于过滤的事情,虽然不同,我无法找到任何快速实现。就像在卷积中一样,我想在一个数组中滑动一个带有滤波器的窗口,但是不是进行分段乘法(在窗口和滤波器之间)和求和,而是想要采用分段差异,将其平方然后求和。
我尝试的是一种蛮力方法,通过在python中编写一个函数,使用每个过滤器在图像上循环,但是正如你可以猜到的那样,即使用numba加速也远没有效率。代码如下:
def convolve(inputs, kernels):
# valid padding
batch = inputs.shape[0]
rows = inputs.shape[1]
cols = inputs.shape[2]
channels = inputs.shape[3]
n_kernels = kernels.shape[-1]
m_f = kernels.shape[0]
n_f = kernels.shape[1]
div = m_f * n_f
out = np.empty((batch, rows - m_f + 1, cols - n_f + 1, n_kernels), np.float32)
temp = np.empty((m_f, n_f, channels), np.float32)
for b in range(batch):
for i in range(rows - m_f + 1):
for j in range(cols - n_f + 1):
for k in range(n_kernels):
out[b, i, j, k] = np.sum(np.square(inputs[b, i:i + m_f, j:j + n_f, :] - kernels[:, :, :, k])) / div
return out
在python中是否有效实现此操作?或者您可能有任何提示我如何在python / cython / pure c中有效地实现这一点?