当前位置: 首页 > 面试题库 >

Python中最快的2D卷积或图像过滤器

颛孙昆
2023-03-14
问题内容

几个用户询问在numpy的或SciPy的[图像卷积的速度或存储器消耗1,2,3,4 ]。从回答和我使用Numpy的经验来看,与Matlab或IDL相比,我认为这可能是numpy的主要缺点。

到目前为止,没有一个答案能解决整个问题,所以这里是:“用Python计算2D卷积最快的方法是什么?”
常见的python模块是公平的游戏:numpy,scipy和PIL(其他?)。为了比较具有挑战性,我想提出以下规则:

  1. 输入矩阵分别为2048x2048和32x32。
  2. 单精度或双精度浮点都可以接受。
  3. 将输入矩阵转换为适当格式所花费的时间不算在内-仅是卷积步骤。
  4. 用输出替换输入矩阵是可以接受的(任何python库都支持吗?)
  5. 可以直接对常见C库进行DLL调用-lapack或scalapack
  6. PyCUDA就可以了。使用自定义GPU硬件是不公平的。

问题答案:

这实际上取决于您要执行的操作…很多时候,您不需要完全通用的(阅读:更慢)的2D卷积…(即,如果滤波器是可分离的,则可以使用两个1D卷积来代替…这就是为什么各种scipy.ndimage.gaussian,,scipy.ndimage.uniform比实现为通用nD卷积的同一事物要快得多的原因。)

无论如何,作为比较点:

t = timeit.timeit(stmt='ndimage.convolve(x, y, output=x)', number=1,
setup="""
import numpy as np
from scipy import ndimage
x = np.random.random((2048, 2048)).astype(np.float32)
y = np.random.random((32, 32)).astype(np.float32)
""")
print t

这在我的机器上花费6.9秒…

比较一下 fftconvolve

t = timeit.timeit(stmt="signal.fftconvolve(x, y, mode='same')", number=1,
setup="""
import numpy as np
from scipy import signal
x = np.random.random((2048, 2048)).astype(np.float32)
y = np.random.random((32, 32)).astype(np.float32)
""")
print t

这大约需要10.8秒。但是,在输入大小不同的情况下,使用fft进行卷积可能会更快(尽管目前看来我似乎还没有一个很好的例子……)。



 类似资料:
  • 上下文:我试图用Java创建一个动画。动画是简单地采取一个图像,并使它出现从最暗的像素到最亮。 问题:定义像素转换的内部算法不是我的问题。我对Java和一般计算都是新手。我做了一些研究,知道有很多API有助于图像筛选/转换。我的问题是表现,理解它。 对于实现,我创建了一个方法,它执行以下操作: 接收BufferedImage。 获取BufferedImage的WritableRaster。 使用s

  • 问题内容: scipy(或另一个流行的库)中是否内置了基于FFT的2D互相关或卷积函数? 有如下功能: -“大数据执行的直接方法将很慢” -“使用精确计算(即不使用FFT)将数组与给定内核相关联。” ,我不太了解,但似乎有误 numarray有一个带switch的函数,但是我想numarray被折叠成numpy了,我找不到是否包含此函数。 问题答案: 我发现,因为还马格努斯指出,但它的时候并没有意

  • 我正在构建一个卷积网络图像分类的目的,我的网络受到VGG conv网络的启发,但我更改了每层的层数和过滤器,因为我的图像数据集非常简单。 然而,我想知道为什么VGG中的Fitler数总是2:64的幂- 我猜这是因为每个池将输出大小除以2 x 2,因此需要将过滤器的数量乘以2。 但我仍然想知道,这一选择背后的真正原因是什么;这是为了优化吗?分配计算是否更容易?我应该在我的人际网络中保持这种逻辑吗。

  • 我正在尝试运行一个CNN(卷积神经网络),具有1通道/灰度图像,大小为28x28像素。当我尝试训练模型时,它说: ValueError:图层sequential_5输入0与图层不兼容:: 预期min_ndim=4,发现ndim=3。完整形状收到:[无,28,28]

  • 根据tf.keras.layers.Conv3D的官方留档 如果data\u format='channels\u first',带形状的5 D张量:batch\u shape(通道,conv\u dim1,conv\u dim2,conv\u dim3),如果data\u format='channels\u last',带形状的5 D张量:batch\u shape(通道,conv\u dim

  • 该脚本可以在几分钟内在 CPU 上运行完。 结果示例: from __future__ import print_function import time import numpy as np from PIL import Image as pil_image from keras.preprocessing.image import save_img from keras import la