0. 引入
除了图像分类的视觉任务:图像分割(语义分割,实例分割)、目标检测(单目标检测,多目标检测):
1. 语义分割(Semantic Segmentation)
只区分图像中不同像素的分类,但是不区分同类物体的不同实例。
1.1 实现方法
1.1.1 滑动窗口:
使用一个滑动窗口,在图像上进行滑动,生成很多切块,然后对每一个切块进行分类:
这样的话,还有一个问题是你发现有很多像素都被重复计算了,因为他们可能被分在不同的切块上。(一个替代方法是,先将整幅图输入到CNN中,然后在中间层上使用滑动窗口策略。)
1.1.2 全卷积神经网络
简易版的FCN
使用卷积提取图像的层次特征,然后使用pad策略保持feature map尺寸不变,最后在scores map的每一个位置进行分类(每一个位置都是一个多分类损失,最后对位置取一个平均或平均,之后再在一个批量中取总和或者平均)。(如果尺度下降了,还可以使用上采样或者反卷积操作来增大尺寸)。
这个简易版有一个不好的地方是,始终维持了整个图像的大小,这可能对像素级的分类是有效的,但是计算代价是高昂的。因为在一般的CNN中,通道数是逐层递增的。
对称采样结构:
FCN中使用的是下采样+上采样的结构:
- 下采样: 带步长的卷积,池化操作(pooling)
- 上采样: 插值,转置卷积,去池化操作(unpooling)
例如,下图所示的最近邻插值和去池化操作:
当然,在CNN中我么可以把下采样过程中 maxpooling 的采样位置记下来,然后在上采样中进行恢复:
转置卷积操作:可学习的上采样方式
- Normal Conv:
- Stride Conv:
- Transpose Conv(转置卷积):
如上图所示,转置卷积就是每个输入位置的元素乘以卷积核然后作为对应位置的输出(这里是把输入的一个元素复制成卷积核大小,然后再进行相乘,使用的是矩阵的element-wise乘,而不是内乘,即输出的是一个matrix,而不是一个scalar。最后该位置的输出就是一系列卷积核的加权,权重就是输入的元素)