【问题标题】:Can 1 convolution be split into 2 convolutions?1个卷积可以拆分成2个卷积吗?
【发布时间】:2017-08-24 18:25:10
【问题描述】:

所以我希望对 RGB 图像执行 2D 卷积。我的 RGB 图像的形状为 (2592,3888,3),我的滤镜的形状为 (20,20)

我想做的是这样的:

  • 将图像分成大小相等的两半(1296,3888,3)
  • 对每一半执行卷积
  • 结合卷积结果得到全卷积图像

这可能吗?

我有两个 GPU。我基本上想在 1 个 GPU 上做一半的卷积,在另一个 GPU 上做另一半,因此提出这个问题的动机。

当我将图像分成两半并对每一半进行卷积时,返回的组合尺寸为(2554,3869,3),但如果我一次对整个图像进行卷积,则返回的(正确)尺寸为(2573,3869,3)。

我想做什么有公式吗?

【问题讨论】:

标签: math signal-processing


【解决方案1】:

您可以分两个阶段执行卷积,但图像中心必须有 19 条(或可能 20 条)线的重叠区域才能被两个 GPU 包含。 更好的是,如果卷积例程允许输出 (size+2k-1),则可以通过将这两个结果相加来计算中间部分(正确对齐)。

【讨论】:

    【解决方案2】:

    您的结果似乎只包含卷积乘积已满的点,没有应用任何零填充或类似扩展。因此,如果您精确拆分,则完整结果的中间部分会丢失。

    您可以通过在过滤器大小的拆分中间引入重叠来纠正此问题,即左侧图像具有第 1 到 1306 列,第二个具有第 1287 到 2592 列(或者移动 -1,如果计数从 0) 开始。

    【讨论】:

      【解决方案3】:

      是的,您可以将卷积分成两半。假设您的卷积过滤器以简单的方式工作,对于传统的 GPU API 来说应该是相当简单的。

      您要仔细考虑的问题是边缘效果:您的 GPU 将在图像边界处做什么?您通常有许多选项,可根据读取原始图像的纹理采样对象的边界进行配置:镜像、环绕或固定颜色,例如零。

      但是,如果两边都从同一张原始图像中采样,则两半之间的边界将靠近纹理中心,边缘效果不适用!每个半图像将在其自己的采样位置应用卷积,彼此独立。

      请注意,如果您在 GPU 之间分割 输入 图像(例如,为了最小化 GPU 和 CPU 之间的带宽),您必须将源纹理的每一半扩展过滤器的范围 --刚好可以避免上面提到的边缘效应!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多