赞
踩
利用卷积神经网络进行图像处理(图像超分、图像编码、风格转换、图像语义分割等)时避免不了要用到上采样操作,一般常见的上采样有:
1、传统上采样。pytorch的双线性上采样函数torch.nn.Upsample(scale_factor=scale_factor, mode='bilinear'),参数model为选择的上采样插值算法。
2、反卷积。pytorch操作函数torch.nn.ConvTranspose2d。
3、反卷积的一些替换操作。
反卷积一般会出现棋盘效应,一些避免棋盘操作的方法可见https://blog.csdn.net/shwan_ma/article/details/80874366,总结 起来就是两种:(1)kernel size与stride可以整除,比如核大小与步长都选择2;(2)利用双线性上采样+padding+卷积操作替换反卷积:
class better_upsampling(nn.Module): def __init__(self, in_ch, out_ch, scale_factor): super(better_upsampling, self).__init__() self.conv = nn.Conv2d(in_ch, out_ch, 3, padding=0) self.up = nn.Upsample(scale_factor=scale_factor, mode='bilinear') def forward(self, x): x = self.up(x) x = F.pad(x, (3 // 2, int(3 / 2), 3 // 2, int(3 / 2))) x = self.conv(x) return x
4、pixel_shuffle(pytorch)或depth_to_space(tensorflow)
这两个操作功能是一样的,都是减少特征通道,扩大特征分辨率。详情可参考 https://blog.csdn.net/CHNguoshiwushuang/article/details/80878460
在实践中,四种操作我是配合标准Unet网络进行试验的,其中传统上采样采用双线性上采样,方法4中的pixel_shuffle后面直接跟一个1*1卷积操作,以提升通道数量。通过试验,有如下发现:
(1)双线性上采样的效果最好,直接反卷积因为有盘棋盘效应,效果最差;
(2)方法3中的替换操作(1)还是会有棋盘效应;
(3)方法3中的(2)以及方法4可以避免棋盘效应,但是最后的测试结果还是比直接采用双线性采样要差。
以上只是结合Unet网络进行的实验得出的结果,仅供参考。具体采用哪种上采样方法好,还是需要结合自己的任务,具体问题具体分析才行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。