Math 1个卷积可以被分成2个卷积吗?

Math 1个卷积可以被分成2个卷积吗?,math,signal-processing,Math,Signal Processing,所以我想对RGB图像进行二维卷积。我的RGB图像是形状(25923888,3),我的过滤器是形状(20,20) 我想做的是: 将图像分成大小相等的两半(12963888,3) 对每一半进行卷积 结合卷积结果得到完整的卷积图像 这可能吗 我有两个GPU。我基本上想在1个GPU上做一半的卷积,另一半在另一个GPU上,这就是这个问题的动机 当我将图像分成两半并卷积每一半时,返回的组合维度是(25543869,3),但如果我一次卷积整个图像,则返回的(正确)维度是(25733869,3) 我想做什么

所以我想对RGB图像进行二维卷积。我的RGB图像是形状
(25923888,3)
,我的过滤器是形状
(20,20)

我想做的是:

  • 将图像分成大小相等的两半
    (12963888,3)
  • 对每一半进行卷积
  • 结合卷积结果得到完整的卷积图像
这可能吗

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

当我将图像分成两半并卷积每一半时,返回的组合维度是
(25543869,3)
,但如果我一次卷积整个图像,则返回的(正确)维度是
(25733869,3)


我想做什么有公式吗?

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


你可以通过在过滤器大小的分裂中间引入一个重叠来纠正这个问题,也就是说,左边的图像有列1到1306,第二个列1287到2592(如果从0开始计数,则偏移1)。不应用任何零填充或类似扩展。因此,如果精确拆分,则完整结果的中间部分将丢失


你可以通过在滤波器大小的分裂中间引入一个重叠来校正,即,左边的图像有列1到1306,第二个列1287到2592(如果从0开始计数,则偏移1)。可以在两个阶段执行卷积,但是必须有19(或者可能20)的重叠区域。图像中心上的线将由两个GPU包含。


更好的是,如果卷积例程允许输出(大小+2k-1),则可以通过将这两个结果相加(正确对齐)来计算中间部分。

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

是的,可以将卷积一分为二。假设卷积滤波器以一种简单的方式工作,那么对于传统的GPU API来说,它应该是相当简单的

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

但是,如果两侧都从同一原始图像采样,则两半之间的边界将靠近纹理中心,而边缘效果不适用!每个半图像将在其各自的采样位置应用卷积,而不依赖于其他位置


请注意,如果要在GPU之间分割输入图像(例如,为了最小化GPU和CPU之间的带宽),则必须将源纹理的每一半延伸到过滤器的范围内——刚好足以避免上述边缘效应

是的,你可以把卷积一分为二。假设卷积滤波器以一种简单的方式工作,那么对于传统的GPU API来说,它应该是相当简单的

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

但是,如果两侧都从同一原始图像采样,则两半之间的边界将靠近纹理中心,而边缘效果不适用!每个半图像将在其各自的采样位置应用卷积,而不依赖于其他位置

请注意,如果要在GPU之间分割输入图像(例如,为了最小化GPU和CPU之间的带宽),则必须将源纹理的每一半延伸到过滤器的范围内——刚好足以避免上述边缘效应