FCN论文笔记

这篇文章的作者是Jonathan Long,于2015年发表于XXXX。

这篇文章的主要贡献是:提出了一种全卷积网络,即FCN,并在图像语义分割上做出了很好的效果。

网络框架如下:

  1. 整体的网络框架基于正常的CNN,将最后的全连接网络改为了卷积。
    这样做的效果是:
    1)网络得以接受任意维度的输入,不需要变成224x224了;
    2)最后本该是1000x1x1维的特征变成了1000xWxH维,这个w和h就是热点图的尺寸。关于这个热点图,应该是有1000张热点图,可以看出整张图片的不同区域都激活了哪种分类的输出。

  2. 在上述结构的基础上,将1000维变成21维(20种分类+背景类),再接一个反卷积层。
    这样做的效果就是:
    1)输出了21张热点图,然后通过反卷积网络变成了21张大小等于原图的Mask;
    2)21张Mask出来之后就可以和真实数据做逐像素的损失函数了,进行训练。
    这样做还有一些缺点:
    1)先得到的热点图的尺寸和最后一层卷积的特征图尺寸是相当的,在作者采用的VGG16中,尺寸为原图的1/32,这就让一层反卷积网络实现32倍的放大,结果可想而知是粗糙(coarse)的。作者后来采用了skip的方法做了精细化,但或许直接采用多层的反卷积就可以有不错的效果。
    2)这一段写的过程中被删掉了,因为写着写着发现了问题,我把删掉的放到后面,可以作为思路记录。训练的时候每个点的预测值就是一个21维的向量,做交叉熵损失函数。最后预测结果采用max算法。嗯这是一个提醒自己训练和测试不同的好例子。
    其实21张Mask出来之后他有采用一个最大值算法,使得最后输出的MAsk就一张,包括了每个点最可能的预测。这种方式有个缺陷就是它相当于把每个点的非极大预测值变成了0。之后loss具体是交叉熵还是单纯的3-2(这个不太可能)不太清楚,就以交叉熵来说,他的损失函数就是不合理的,因为可能本身该点像素预测第二名就是对的,但这下又要推倒重来。

  3. 接下来是Skip结构,是将pool3和pool4层的特征引到输出。
    具体来说,pool3和pool4层特征图的大小是pool5层的4、2倍,所以最后的热点图要先反卷积扩大为2倍、4倍再相加,然后再反卷积扩大为16倍、8倍。得到原图尺寸。
    这样做是为了让Mask更加精细,之前说过这个方法或许可以被替代

接下来是训练过程:

其实上面说的比较清楚了,就是利用FCN得到图像的热点图,然后通过反卷积的方式得到与原图像尺寸相同的Mask,每个像素均包含21类的预测值,然后利用这个进行训练。测试方式是取21预测值的最大为结果。
但是还有一些细节需要说明:

  1. 作者采用了VGG网络,默认大小是224x224,在pool5层后输出尺寸变为1/32,为7x7,之后进行7x7的卷积,可以得出,最后热点图的大小并不是原图尺寸/32,而是$h_1 = (h-192)/32$。这就有2个问题:
    1)图像尺寸不能小于224,否则输出不足1.
    2)skip结构中,fc7与pool4层之间不是2倍关系。
    对于这一问题的解决方式是:
    1)图像在输入过程中被pad了100,最终尺寸变为$h_1 = (h+6)/32$,从而可以接受任意尺寸图像。
    2)对fc7反卷积x2后进行crop裁剪。(因为他多了6)
  2. 好像没了。

总结

这篇文章提出了一种FCN,但重点实际上在反卷积的效果上。

你可能感兴趣的:(FCN论文笔记)