语义分割——FCN

《Fully Convolutional Networks for Semantic Segmentation》

  • FCN架构:

FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生一个预测,同时保留原始输入图像中的空间信息,最后在上采样的特征图上进行逐像素分类。

最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。下图是用于语义分割所采用的全卷积网络(FCN)的结构示意图:

现在我们有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap,1/32尺寸的heatMap进行upsampling操作,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征,因此在这里向前迭代。把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节(相当于一个差值过程),最后把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。

  • 什么是全卷积?

将原始的cnn全连接层改为卷积层,

  • 如何将分类神经元转化到全卷积网络神经元输出粗糙map?

传统cnn的全连接层可以看作成kernel大小为整个输入区域的卷积层,

舍弃传统网络最后的池化层和池化层后的全连接分类层,将该全连接层替换为卷积核为1*1的卷积层,

  • 如何将粗糙map映射到原图像素位置?

原文3.3节, 使用插值,比如简单的双线性插值计算每一个输出yij从最接近的线形映射图的四个输入

  • fcn架构:

使用图片分类网络去掉最后的池化和分类层,将全连接层改为卷积层,卷积核大小为1*1,通道为21,21代表分类的类别数,这样网络输出就是[21,x,y]

  • 如何精确得到原尺寸的标签?

如上图,有三个上采样的结果,其中,FCN-32s是最原始的直接对网络输出层pool5进行32倍上采样后的输出结果,该标签和原图的大小对应。FCN-16s也是对应到原图的标签,其中对pool5进行2倍上采样,然后加上pool4的结果,进行16倍上采样得到的结果,该标签和原图的大小对应。FCN-8s也是对应到原图的标签,其中对pool5进行2倍上采样,加上pool4之后的结果,再加上原始网络poll3的结果,进行8倍上采样之后的输出结果,该标签和原图的大小对应。

下图就可以看出来fcn-8s边缘细节表现上要比其他两个好得多,平均IU要比其他两个好一些,

微调:下图显示了只微调输出分类器的结果(第一行)全部微调的结果(第二行),由于网络分为编码器和解码器阶段,其中编码器从resnet50等一系列训练好的网络得到每个像素特征向量,解码器得到每个像素的属于类别的概率分数,所以我们首先可以尝试只训练分类阶段,前面的解码器使用imagenet训练好的resnet50网络,这样的pixel acc只有83%,而全部网络微调训练得到的pixel acc有89%。

  • patchwise training:

第一次看到这个概念,不是很理解,最后搜索到了一个比较靠谱的解释:

https://stackoverflow.com/questions/42636685/patch-wise-training-and-fully-convolutional-training-in-fcn

简单翻译:由于一副需要语义分割的图片中有很多我们不关注的区域,因此直接输入全卷积网络会有很多的多余计算,避免冗余的一个标准方法是只输入给网络图像中的随机小块(围绕感兴趣目标的小图像区域)而不是整图像,这样的“patchwise sampling”保证输入有足够的方差和训练集的有效表示。 可以从训练集中进行小块采样,或者直接对整图的损失进行采样,所以有这个说法“Patchwise training is loss sampling”,本文[fcn]后来实验发现patchwise training 比起直接训练整幅图 并没有大的提升,但是训练花费的时间更多了,因此本文是整幅图训练。

  • 整体训练流程:

先使用经典的网络初始化,舍弃池化层和池化层后的全连接层;

从特征小图(16*16*4096)预测分割小图(16*16*21),之后上采样得到大图,该网络叫做FCN-32S

训练网络FCN-16s

训练网络FCN-8s

猜你喜欢

转载自blog.csdn.net/whatwho_518/article/details/102715253