上采样方法

时间:2024-01-31 11:51:46

在语义分割中,要求输入输出的分辨率一样大

在特征提取的时候,需要进行下采样,所以在encode过程中,要进行相应的上采样。

上采样,即扩充图像的h和w。

常见的上采样方法有双线性插值、转置卷积、上采样(unsampling)和上池化(unpooling)。

其中前两种方法较为常见,后两种用得较少。

1. 插值法

双线性插值是目前在语义分割中用的最多的一种方式,其特点是不需要学习,运行速度快,

 

 

接着,同样的方法,在Y方向上插值,就可以推导出P点处的像素值。

在pytorch中的API调用

output = F.interpolate(output, size=input_size, mode=\'bilinear\')
 
2. 反卷积或转置卷积
2.1
一个正常卷积的过程:

卷积核kernel尺寸为3X3

 

 

设strides=1, padding=0, 

按照卷积计算公式  

 

所以输出的output尺寸为 2X2

2.2

用矩阵乘法描述卷积

把input 的元素矩阵展开为一个列向量

输出output展开为一个列向量

用矩阵运算描述整个过程

 

通过推导,可以得到稀疏矩阵

 

2.3 反卷积

反卷积就是要对这个矩阵运算进行逆运算,即通过C和Y得到X

 

 所以反卷积也叫转置卷积

需要注意的一点是,反卷积只是恢复了矩阵X的大小,不能恢复其数值

反卷积输入输出的关系

  正常卷积: 

    o = (i + 2*p - k)/s + 1

  反卷积相当于输入输出对调:

       i = s * (o - 1) + k - 2*p

  所以反卷积的输出为

    o = s * (i  - 1) + k - 2*p

  pytorch 中API调用

       self.up_output = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=4, stride=2, bias=False)

3. Upsampling 和 Uppooling

  uppooling 用的比较少,具体如下图示意

  图片来源:上采样方法原理简介 - 简书 (jianshu.com)