Fully convolutional networks

前言

  最近在看计算机图像和视觉方面的论文,FCN(Fully convolutional networks)是一篇非常成功的论文,图像语义分割这一块就靠它入门了。为了写博客更加方便,打算将论文讲解和实现分开成两篇博客,这样写起来也轻松一些。

原理

  在讨论语义分割以前,我们先来讨论图像分类与物体检测。

  • 图像分类

    卷积神经网络的最基础的应用应该就是图像分类,图像分类的输入是二维图像数据,输出是图像对应类别的概率。比如训练数据的类别为5类,给定一幅图像数据,输出则是这5种类别对应的概率,比如[0.1,0.2,0.6,0.1,0],这说明图像被分类为1-5类的概率分别为0.1,0.2,0.6,0.1,0。在交叉熵的那篇博客里我举过类似的例子以及对应的交叉熵和散度的计算方法。为了实现图像分类,我们一般采用卷积神经网络,具体实现是利用卷积神经网络(主要是卷积和池化操作)提取图像特征,然后用全连接层输出对应的类别信息。
  • 物体检测

    物体检测相比图像分类要麻烦一些,不光要分类,还要将物体的边界标识出来。物体的标识使用矩形框实现的。这个我还没研究过,以后再细说。
  • 语义分割

    语义分割需要将图片中的物体先进行分类,然后将不同的物体进行分割,它比图像分类更细致(dense prediction),需要将图像的每一个像素进行归类,最后输出n通道的图像映射。比如论文中的FCN,它一共有21类,那么就是大小为21hw的映射(h为图像的高度,w为图像的宽度)。论文中的网络结构如下:
    Fully convolutional networks_第1张图片

实现

  FCN的实现和一般的卷积神经网络的区别主要有两点:反卷积和融合输出
(fusing output,字面翻译)。

  • 反卷积

    关于反卷积的介绍我在之前的博客中介绍过,简单来说,卷积是下采样(subsample),用于提取图片的特征;反卷积是上采样(upsample),可以扩大数据的维度,DCGAN里头用上采样来生成目标图像。在FCN里头,先用卷积操作提取图像特征,然后用反卷积生成分割后的图片映射。

  • 融合输出

    融合输出是FCN的一个trick,一般来说,卷积网络的深层可以能更好地提取图片的特征,但是会丢失掉图片元素的空间信息;浅层可以提取图片的位置信息,但是不能提取全局特征。论文的section1 有这样一段话:

    Semantic segmentation faces an inherent tension between semantics and location: global information resolves what while local information resolves where.Deep feature hierarchies encode location and semantics in a nonlinear local-to-global pyramid.

    大意是说全局信息可以表征图像的特征信息,局部信息可以表征图像的位置信息,在神经网络不同深度的层中,浅层表示位置信息,深层表示特征信息。而图像的语义分割既需要位置信息也需要特征信息,为了实现这个目的,作者利用了一个叫做“skip architecture”的方法,图示如下:
    Fully convolutional networks_第2张图片
    简单地说,就是将浅层的卷积层和深层的卷积层进行反卷积(上采样),然后将它们的输出结果合并。FCN-32s直接将原来神经网络的最后一层进行反卷积;FCN-16s将pool4和2步长反卷积后的conv7一起进行反卷积后进行输出;FCN-8s则是利用了conv7,pool4,pool3。可以看出,从FCN-32s到FCN-8s,不同卷积层都被利用了起来。

效果

  FCN的效果还是不错的,首先是FCN之间的对比。Fully convolutional networks_第3张图片
可以看出,FCN-8s的效果是最好的,无论是准确度还是精细程度,这是因为它既利用了浅层网络的信息,也利用了深层网络的信息。
  模型的判别指标有四个:

  • pixel accuracy: ∑ i n i i / ∑ i t i \sum_{i}n_{ii}/\sum_it_i inii/iti.
    其中, n i j n_{ij} nij表示i类像素点被归类于j类的数量, t i = ∑ j n i j t_i=\sum_jn_{ij} ti=jnij表示第i类像素点的数量。pixel accuracy可以理解为被正确分类的像素点所占的比例。
  • mean accuracy: 1 n c l ∑ i n i i / t i \frac{1}{n_{cl}}\sum_in_{ii}/t_i ncl1inii/ti
    其中, n c l n_{cl} ncl为像素点的类别数量,mean accuracy是各类像素点的分类准确率的平均值
  • mean IU: 1 n c l ∑ i n i i / ( t i + ∑ j n j i − n i i ) \frac{1}{n_{cl}}\sum_in_{ii}/(t_i+\sum_jn_{ji}-n_{ii}) ncl1inii/(ti+jnjinii)
    mean IU和mean accuracy类似,只不过分母中计算了被误分类为i类的像素点
  • frequency weighted IU: ( ∑ k t k ) − 1 ∑ i t i n i i / ( t i + ∑ j n j i − n i i ) (\sum_kt_k)^{-1}\sum_it_in_{ii}/(t_i+\sum_jn_{ji}-n_{ii}) (ktk)1itinii/(ti+jnjinii)

你可能感兴趣的:(cv,神经网络)