在图像分割中,因为FCN的提出,上采样操作成为了分割中不可或缺的部分。上采样就是将提取到的feature map还原到原始分辨率大小的操作,但是这里要注意的是上采样不是下采样的逆过程,也就是说上采样输出的图像和下采样之前的图像是不一样的。
上采样操作主要分为三种方法:
1.转置卷积
如上述所说,上下采样不是可逆关系,所以我不太喜欢使用‘'反卷积”这个词,转置卷积是通过卷积运算来实现分辨率的还原。因为是卷积操作中有权重参数,所以这是一种可以学习的方法,通过参数的学习实现输出图像尽可能与原图像相似。具体的细节可以参考下面的这一篇文章
孙小也:反卷积(Transposed Convolution)详细推导zhuanlan.zhihu.com在学习的时候,转置卷积的输入和输出大小一直是我比较头疼的地方,在反复地计算和思考之后我给出我比较能理解的思路。
首先,先确定一下变量和其意义
确定顺序为
然后先要明确的一点就是这里的步长和正向的卷积过程操作有一些不一样,这里的stride不是直接将卷积核移动大小为stride的长度,而是在输入每两个像素之间增加大小为stirde的空像素,和空洞卷积的空洞操作是一样的。
(1)根据输出和卷积和大小计算输入经过stirde操作和padding之后的尺寸大小
中间尺寸
(2)得到上述的大小后,减去padding,获得输入加上stride的尺寸
输入+stride
(3)对上面的式子进行整理和化简
2.线性插值
线性插值就是利用几何关系通过已知点的数值来计算线性空间内的值,常见的插值方法包括二次线性插值和三次线性插值,二次线性插值就是利用四个点来对矩形空间内的点进行估计,三次线性插值同理,不过使用八个点。具体的细节可以参考下面的一篇文章
时凹:【数学】线性插值zhuanlan.zhihu.com3.解池化
我目前看到的情况,解池化使用的比较少一点,主要是使用两次线性插值和解卷积多一些,但是由于线性插值的方法不需要学习参数,所需要的计算资源就会少一些,所以双线性插值会更多一些。
我目前只在SegNet中看到过,他使用的方法使用了“最大池化索引”,也就是在池化的时候记录池化滑窗中最大值的位置,然后在恢复的时候在还原的时候只使用记录的最大值,其过程如下图所示。
除了滑窗内的最大值,其他值都会被设置为0,基于keras的实现方法如下:
https://blog.csdn.net/nima1994/article/details/84319859blog.csdn.net当然,现在还有新型的上采样方法,但是我还没有深入了解过,等读到有关的方法会进行更新。