在基于深度学习的图像分割领域,基于Encoder-Decoder框架是一种非常经典的模型设计。在这种框架下,模型可以看作由两部分组成:编码器模块Encoder和解码器模块Decoder. 编码器模块负责提取特征,采用卷积和池化操作逐步缩小特征图并捕获更高级的语义信息;解码器模块基于上采样操作逐步恢复空间信息。
下图是SegNet论文中体现Encoder-Decoder框架的示意图。
上文提到,解码器模块基于上采样来不断恢复空间信息。本节内容即关注上采样这一操作,介绍在不同的语义分割网络中常用的上采样方法。
一、Bilinear interpolation 双线性插值
1.1 线性插值
线性插值是一种较为简单的插值方法,其插值函数为一次多项式。线性插值,在各插值节点上插值的误差为0。
已知数据 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)和 ( x 2 , y 2 ) (x_2, y_2) (x2,y2), 计算在 [ x 1 , x 2 ] [x_1, x_2] [x1,x2]区间内某一位置 x x x在直线上的 y y y值。
已知:
y − y 1 y 2 − y 1 = x − x 1 x 2 − x 1 \frac {y - y_1} {y_2 - y_1} = \frac {x - x_1} {x_2 - x_1} y2−y1y−y1=x2−x1x−x1
计算公式如下:
y = x 2 − x x 2 − x 1 ∗ y 1 + x − x 1 x 2 − x 1 ∗ y 2 y = \frac {x_2 - x} {x_2 - x_1} *y_1 + \frac {x - x_1} {x_2 - x_1} *y_2 y=x2−x1x2−x∗y1+x2−x1x−x1∗y2
1.2 双线性插值
双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。
设有一个表达式未知的函数 f ( x , y ) f(x,y) f(x,y),
已知四个点 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)、 ( x 1 , y 2 ) (x_1, y_2) (x1,y2)、 ( x 2 , y 1 ) (x_2, y_1) (x2,y1