Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:

棋盘伪影

  • 一、棋盘伪影
    • 1.一维转置卷积中的“不均匀重叠”
    • 2.二维转置卷积中的“不均匀重叠”
  • 二、解决方案
  • 三、参考

一、棋盘伪影

传统方法通常使用不同的“插值”方法实现特征上采样操作,后来深度学习的趋势引入转置卷积通过参数学习的方式替代“插值”方法进行特征上采样操作。标准卷积通过设置合适卷积核将输入的多个像素映射到输出中的一个像素(由大到小进行下采样),转置卷积沿着标准卷积的反方向进行,通过合适的卷积核将输入的一个像素映射到输出中的多个像素(由小到大进行上采样)。而不合适的卷积核尺寸和步长的设置会使得转置卷积(或反卷积、去卷积)操作引入“不均匀重叠”现象,进而影响卷积结果,发生“棋盘伪影”现象。
“棋盘伪影”作为图像重构时很不期望的副作用影响很多图像处理任务,表现为输出中某部分颜色会比领域中其他部分颜色深,且这种现象在颜色比较丰富鲜艳的图像中更为明显
关于转置卷积可查看:https://blog.csdn.net/qq_43665602/article/details/126668764

1.一维转置卷积中的“不均匀重叠”

当转置卷积的卷积核大小kernel_size不能整除步长stride时,便会发生“不均匀重叠”现象
下面我通过图示来说明不均匀重叠的发生过程:
图中灰色表示卷积核移动过程,上层蓝色表示输出,下层黄色表示原始输入,两边的绿色表示大小为dilation*(kernel_size-1)-padding的零填充。紫线代表输入提供的信息
(1)kernel_size可整除步长stride,kernel_size%stride=0(%表示取余)
1)stride=1,kernel_size=2:先对输入进行大小为1*(2-1)-0=1的零填充。可看到此时输出中,除了两端的元素是由输入中的单一元素提供信息,中间的元素每个都是由输入中两个元素提供信息,说明中间元素接受到的信息量是相同的
Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:_第1张图片
2)stride=1,kernel_size=3:先对输入进行大小为1*(3-1)-0=2的零填充。可看到此时输出中,中间的元素每个都是由输入中三个元素提供信息,说明中间元素接受到的信息量是相同的。
Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:_第2张图片
3)stride=2,kernel_size=4:先对输入元素间用0进行stride-1=1的插值,再进行大小为1*(4-1)-0=3的零填充。可看到此时输出中,中间的元素每个都是由输入中两个元素提供信息,说明中间元素接受到的信息量是相同的。
Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:_第3张图片
(2)kernel_size不可整除步长stride,kernel_size%stride!=0
1)stride=2,kernel_size=3:先对输入进行大小为1*(3-1)-0=2的零填充。可看到此时输出中,中间元素分别由输入中一个或两个元素提供信息,相邻元素接受的信息量不同,说明中间元素接受到的信息量是不同的。这种情况就称为“不均匀重叠”,反映在卷积结果中就出现了“棋盘效应”
Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:_第4张图片

2.二维转置卷积中的“不均匀重叠”

在一维情况下,因为卷积核只在一个方向移动,所以重叠情况也只存在于一个方向,而二维情况下,因为卷积核在两个方向移动,对于某个重叠点可能存在两个方向的叠加(实际是两个方向移动形成的两个模式在此处的乘积,不均匀性是单方向的平方),所以此时的“棋盘伪影”会表现的更严重。
Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:_第5张图片
1)kernel_size%stride=0:“均匀重叠”
kernel_size=2,stride=2:输出中每个元素都接受输入带来的相同信息量
Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:_第6张图片
2)kernel_size%stride!=0:“不均匀重叠”
kernel_size=3,stride=2:以输出中第三行元素为例,从左往右接受的信息量依次由输入中的2/2/4/2/2个元素提供,中间元素接受信息量不同,此为“不均匀重叠”。此外,当kernel_size=3,stride=2时,一维转置卷积输出中依次接受输入特征的1/1/2/1/1个元素提供的信息量,不均匀性是单方向的平方。
Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:_第7张图片

二、解决方案

  1. 设置参数满足:kernel_size%stride=0,避免“不均匀”重叠情况;
  2. 设置步长stride恒等于1,此时kernel_size%stride=0恒成立,可避免“不均匀”重叠情况,缓解“棋盘效应”;
  3. 《Deconvolution and Checkerboard Artifacts》文章中提出使用先插值,再卷积的方法进行上采样可以更好的避免“棋盘效应”,具体地,先通过最近邻插值或双线性插值改变输入特征的大小,然后再接一个卷积层

Checkerboard Artifacts(棋盘伪影)的发生以及解决方案:_第8张图片

三、参考

1.https://www.163.com/dy/article/E8F50CLJ05118HA4.html
2.《Deconvolution and Checkerboard Artifacts》:https://distill.pub/2016/deconv-checkerboard,该网址中提供了不同参数下输入与输出对应关系,以及“不均匀”重叠现象的动图。感兴趣的可以看看。
声明:以上参考原文提供的动图进行自己的理解,如有错误,请指出,我会及时更正,谢谢!

你可能感兴趣的:(Pytorch,深度学习,深度学习,计算机视觉,cnn,图像处理)