前言
FCN是基于深度学习的语义分割的开山之作,尽管现在很多方法都超越了FCN,但它的思想仍然有很重要的意义。
本次课主要分享FCN(Fully Convolutional Networks for Semantic Segmentation)这篇文章的思想。这是对图像的pixel-wise操作,属于semantic segmentation类内的问题
之前我们讲的文本检测是先提出一个文本区域,然后通过深度神经网络回归预测出该边框的位置信息,因此得到一个矩形框,可以实现对文本的检测任务。
但是FCN全卷积神经网络的提出给文本检测提供了另外一个思路,也就是对像素点的二分类判断,直接在像素点上操作的话,就少了对某一区域是否包含文本的判断,也就是说,不用先提出anchor,也就是我想要分享的one-stage来做目标检测的思想来源以及理论依据。
下面让我们展开来说FCN是怎么应用到检测领域内的!
一、 什么是语义分割(Semantic Segmentation)
语义分割是概括来讲就是像素级别(pixelwise)上的分类,属于同一类的像素都要被归为一类,因此语义分割是从像素级别来理解图像的,图1 与图2 很明显地呈现出目标检测和语义分割的区别。目标检测(图1)是得出一个边界框,通常是矩形的框,这是一个比较粗略的预测,而图2由于其对每个像素点计算的,所以能检测出目标的边缘轮廓信息,也就是说更加精细化了。
二、 FCN算法流程
我们已经知道一般的深度神经网络实现物体分类任务的流程大概是CNN网络提取特征,之后会接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。此类经典结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率,如VGGNet网络最后一层输出一个1000维的向量表示输入图像属于一千个类别中每一类的概率。
但是FCN与CNN不同的地方在于,FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,1,1)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。如下图所示,上面是经典CNN网络后面三层连接的是全连接层(平铺层4096*1),下面是FCN的结构。简单的说,FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,输出一张已经label好的图。
全卷积神经网络主要使用了三种技术,如下分三节来介绍。
插播一条广告,别打我!
本课视频在B站有up的哦,嘻嘻嘻~,讲的都是正经东西,欢迎指正哈,谢谢啦。记得点赞哦。蛤蛤蛤~
https://www.bilibili.com/video/av73805100?p=4
3.1 全卷积化(Fully Convolutional):
用于解决逐像素(pixel-wise)的预测问题。通过将基础网络(例如VGG)最后面几个全连接层换成卷积层,可实现任意大小的图像输入,并且输出图像大小与输入相对应;
3.2 反卷积(deconvolution)
上采样操作,用于恢复图片尺寸,方便后续进行逐像素预测;在机器学习中,反卷积是从低分辨率映射到大分辨率的过程,用于扩大图像尺寸。反卷积是一种特殊的正向卷积,而不是卷积的反过程。正向的卷积,我们知道是一个下采样的过程
符号约定:
- 输入尺寸(input):N
- 卷积核大小(kernel size):F
- 步幅(stride):S
- 边界扩充(padding): P
- 输出尺寸(output):W
卷积输出尺寸计算
W= (N − F 2P )/S 1
反卷积输出尺寸计算
W= S(N-1) 2P-F 2
值得注意的是,当步长为1时,卷积与反卷积输出尺寸计算公式相同。这种情况下反卷积即为卷积,也说明了反卷积是一种特殊的卷积,而非卷积的逆过程。
了解了以上的原理,就可以解释FCN中是如何实现upsample上采样的了,FCN作者分为FCN-32s,FCN-16s,FCN-8s三种,论文中有一个图是描述这个三个过程的,如下图,
image是原图像,conv1,conv2..,conv5为卷积操作,pool1,pool2,..pool5为pool操作(pool就是使得图片变为原图的1/2),注意con6-7是最后的卷积层,最右边一列是upsample后的end to end结果。必须说明的是图中nx是指对应的特征图上采样n倍(即变大n倍),并不是指有n个特征图,如32x upsampled 中的32x是图像只变大32倍,不是有32个上采样图像,又如2x conv7是指conv7的特征图变大2倍。
第一行对应FCN-32s,第二行对应FCN-16s,第三行对应FCN-8s。
从论文中的效果图可知,stride为32来放大32倍后得到的分割效果最差,FCN-8s的效果最好,但是不是就可以说越底层越好呢?比如对pool2,pool1实现同样的方法,可以有FCN-4s,FCN-2s,最后得到end to end的输出。这里作者给出了明确的结论,超过FCN-8s之后,结果并不能继续优化。
3.3 跳跃结构(skip architecture)
用于融合高低层特征信息,这里的融合是拼接在一起,不是对应元素相加。通过跨层连接的结构,结合了网络浅层的细(fine-grain)粒度信息信息以及深层的粗糙(coarse)信息,以实现精准的分割任务。
三、 总结
结合上述的FCN的全卷积与upsample,在upsample最后一层加上softmax,就可以对该像素点属于每个类别的概率进行估计,实现end to end的预测目的,最后输出的图是一个概率估计,对应像素点的值越大,该像素属于该类的可能性也就越大。FCN的核心贡献在于提出使用卷积层通过学习让图片实现end to end分类。但是,FCN也有其缺点,例如使用了较浅层的特征,因为skip architecture中的fuse操作会加上较上层的pool特征值,导致不能充分利用高维特征,同时也因为使用较上层的pool特征值,导致FCN对图像大小变化有所要求,如果测试集的图像远大于或小于训练集的图像,FCN的效果就会变差。但是,也由于FCN提出了一种新的语义分割的方法,使得后续的不管是语义分割还是实例分割、目标检测都能借鉴到这样一种思想,因此是计算机视觉领域内极有意义的工作。