【问题标题】:Is there any relation between convolution performed by a kernel and transpose of the kernel on same image内核执行的卷积与同一图像上内核的转置之间是否存在任何关系
【发布时间】:2015-09-03 07:54:56
【问题描述】:

我有一个 MxN 矩阵和 PxQ 内核。我正在使用 4 个循环执行简单的卷积。我正在通过复制图像边界数据来单独处理边界情况。

我需要使用内核 PxQ 及其转置 QxP 对同一图像执行卷积。然后我必须简单地将两个输出图像相加。

问题是它需要很多时间,我需要优化它。分离内核并执行一维卷积似乎很困难,因为图像和内核都是非 squire 矩阵。我也不能使用任何库。内核是完全随机的,不属于任何预定义类型。

所以我想知道在使用内核执行的卷积中是否存在任何关系,然后在我可以利用的同一图像上使用它的转置。

或者还有什么我可以做的吗?

【问题讨论】:

  • 如果你用 FFT 计算卷积,你可以节省一个 FFT。
  • 但是根据 FFT 理论,如果卷积核超过 64 个点,就会有增益。如果内核较小怎么办? 5x5、8x6 等 ??
  • 我不会相信任何提出这种说法的理论。如果您比较不同的 FFT 实现(卷积相同),最快的可能至少比最慢的快一个数量级。编写你自己的实现,它仍然会慢 10 倍(而且我不是在谈论 GPU 实现!)。它们可能都执行相同的算术运算,但在具有 SIMD、分支预测、多个缓存级别和每个线程多个执行管道的现代 CPU 上,这意味着很少。

标签: image-processing matrix computer-vision signal-processing convolution


【解决方案1】:

嗯,确实存在关系,但它是一种数学关系,并且两个卷积算子都被称为伴随

但是,鉴于不可分离的卷积核,您只有几个选项可以加快计算速度:

  • 如 cmets 中所建议的,您对数据和卷积核进行逐点multiplication of Fourier transforms 的卷积。当然,您需要一个 FFT 例程才能使其成为可行的选择;
  • 如果 PQ 差别不大,您可以实现一个例程,该例程将在图像数据的相同过程中计算卷积及其总和输出李>
  • 您可以通过在 thd 卷积期间仔细实现滑动窗口位移来获得轻微的加速(当从一个像素移动到其紧邻像素时,第一列和最后一列是唯一发生变化的东西)。
  • 如果可用,您还可以通过将卷积移植到 GPU 来获得一些加速。例如谷歌的“opencl 卷积示例”。

对于滑动窗口,假设您已经计算了一维数据点d(i) 的输出。然后,当移动到点d(i+1)时,你可以通过移除kernel(-P/2)*d(i-P/2)并将kernel(P/2)*d(i+P/2)添加到对应于d(i)的过滤点来计算它,而不是应用整个卷积核。

要同时应用两个内核,请将较小内核的大小调整为较大内核的大小,方法是用零填充它并同时使用两个内核对您的图像进行卷积。这是假设两个内核都应用于相同的输入,尽管常见的情况是伴随应用常规运算符之后。

【讨论】:

  • 感谢您的回复。我没有 GPU 支持或线程。 FFT 的表现也会超过 64 点。我没有很好地得到你的第 2 点和第 3 点。能否请您详细说明一下。
【解决方案2】:

然后我必须简单地将两个输出图像相加。

你为什么不把两个核相加,然后只用总和卷积一次?

【讨论】:

    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2019-02-26
    相关资源
    最近更新 更多