本文同步发表在公众号(happyGirl的异想世界)以及知乎(链接https://www.zhihu.com/question/328891283/answer/1604072340)
导读
不论是语义分割、目标检测还是三维重建等模型,都需要将提取到的高层特征进行放大,此时就需要对feature map进行上采样(也有一些文章称之为升采样,是一个意思,本文均用上采样。) 上采样一些常见的方法有:近邻插值(nearest interpolation)、双线性插值(bilinear interpolation),双三次插值(Bicubic interpolation),反卷积(Transposed Convolution),反池化(Unpooling)。本文对这些方法进行了总结,如有描述不当,欢迎批评指正。
一、插值方法
1.1 最近邻插值
最近邻插值法(nearest neighbor interpolation)又称零阶插值,将离待插值最近的已知值赋值给待插值。如图所示,最近邻插值法会直接只算输出像素映射到输入图像坐标系下的点u和近邻四点(n1,n2,n3,n4)之间的距离,取距离u最近的像素点的颜色值(或灰度值)赋给u。计算公式:
其中g(x',y')为输出图像中坐标为(x',y')的像素点的颜色值(或灰度值),f(x,y)为输入图像中坐标为(x,y)的像素点的颜色值(或灰度值),(x,y)为输出图像上的坐标(x',y')映射到输入图像坐标系下的坐标。int(x)为取整运算。上图效果是最近邻法的计算过程示意图,最近邻不需要计算只需要寻找,所以速度最快,但是新图像局部破坏了原图的渐变关系。
1.2 单线性插值
已知中P1点和P2点,坐标分别为(x1, y1)、(x2, y2),要计算 [x1, x2] 区间内某一位置 x 在直线上的y值。
根据两点求一条直线可知:整理后得:
y1与y2分别代表原图像中的像素值,公式可改写为:
1.3 双线性插值
双线性插值(bilinear interpolation)又称一阶插值,根据离待插值最近的个已知值来计算待插值,每个已知值的权重由距离待插值距离决定,距离越近权重越大。
双线性插值是分别在两个方向计算了共3次单线性插值,如图所示,先在x方向求2次单线性插值,获得R1(x, y1)、R2(x, y2)两个临时点,再在y方向计算1次单线性插值得出P(x, y)(实际上调换2次轴的方向先y后x也是一样的结果)。
1.4 双三次插值
双三次插值(bicubic interpolation)也有一些文章会翻译为三线性插值,本文统一同双三次插值。其根据离待插值最近的个已知值来计算待插值,每个已知值的权重由距离待插值距离决定,距离越近权重越大。
双三次插值通过