[论文笔记]彻底讲透FCN语义分割开山之作Fully Convolutional Networks

 FCN论文标题:Fully Convolutional Networks for Semantic Segmentation​
论文下载地址:https://arxiv.org/abs/1411.4038

代码地址:https://github.com/shelhamer/fcn.berkeleyvision.org

目录

语义分割的定义和重要性

语义分割模型的发展演变

语义分割实现流程——ML训练通用流程

语义分割常见数据集

语义分割常用评估指标

FCN的研究成果

FCN的研究意义

历史意义

当前应用

语义分割领域术语解释

全局信息与局部信息

FCN以前分割的两大缺点

感受域-感受野-Recptive field

平移不变性Translation invariance

Shift-and-stitch究竟是啥啊?

FCN的独特之处

(1)全卷积Fully Conv:

(2)Upsampling via Deconvolution

(3)Skip Architecture

(1)输入

(2)卷积层

(3)skip跨层特征融合

训练技巧Training Tricks

类别平衡是不是必须的?

FCN的不足

FCN可以改进的地方

术语解释


语义分割的定义和重要性

是什么:给每一个像素点都分类成一个label

        与图片识别Recognition的区别?——分类网络是把一整张图分成一类,而分割网络是把一张图每一个像素点都分成一类。

        与目标检测区别?——相似点:都标注了物体的具体分类信息。不同点:ISS是像素级颗粒度的,需要把物体的轮廓描绘出来,用轮廓来标记物体。OD标记物体是其外切框。

          与实例分割的区别?——如果一张照片中有多个人,对于语义分割来说,只要将所有人的像素都归为一类--人这一类Person。

                (1)但是实例分割还要将不同人的像素归为不同的类,Car1,Car2,Car3(这样设计合理之处在于:自动驾驶场景下,你把所有车都归成一类是不合理的,我前面这辆车距离我的距离,比离我老远-画面上方那些车,重要的多得多。因为我撞车是先撞我前面的车,而不是远处的车。那么就应该把每一个car打上不同标签-不同颜色)。也就是说实例分割比语义分割更进一步

                (2)实例分割的背景 background统一涂成黑色(比如下面这个例子中,路灯、交通灯、和大楼,语义分割会给他们涂上不同的颜色(b segmentation这个图标记的),但是实例分割首先不区分背景里面的这些东西,不区分路灯和大陆不是一个东西,把他们归成一类,就是黑色(c instance segmentation标记的)。实际这对于自动驾驶,是非常合理的。我自动驾驶只需要管前面车在哪,行人在哪,别撞上前面两个,其他的路灯和大陆对于没啥用,把他们统一标记位黑色,节省了数据存储空间)。

        与全景分割的区别?

                全景分割是语义分割和实例分割的结合

               (1) 实例分割只对图像中的object进行检测,并对检测(Detection找位置、打方框)到的的object进行分割。

                (2)全景分割对于背景也进行了分割和检测

重要性
        语义分割、实例分割和全景分割从属于图像分割。计算机视觉领域的三大核心研究方向是图像识别Recognition、目标检测Object Detection、图像分割
        语义分割对于场景理解的重要性日渐突出。
        本质:现实中,越来越多的应用场景需要从影像中推理出相关的 知识和语义,这是一个从具象(可以看见的图)到抽象(看不见的东西,比如概念、这个object代表的意思)的过程。

         复杂场景中,要想达到准确识别,就要实现精确分割。分割是做好下一步任务的前提。        语义分割的目的是为下一步的工作,提供更优良的特征。是一种特殊的特征工程。

语义分割模型的发展演变

(1)传统方法:

Normalized cut——分割速度慢

        割图片的时候,没运行一次N-cut,只能切割一次图片(下面这个例子图,图里面有两个人,切一次,只能切出一个人。你要是想把另一个人切出来,就得再切一次)。为了切割出图像中的多个物体,需要多次运行。下面这个例子就是对原图a进行了7次N-cut后,每次分割出的结果。然后你在把这7次切割出的东西叠加在一张图上,分配不同的颜色,就实现了分割。

        劣势1:但你注意哦,这里没有语义的。b和c这两个图都是人,但是没有办法判断他们都是人,还是会赋上不同的label。

        劣势2: 很多没什么意义的的图被割出来了。比如d e f g h.实际上只有b和c是有意义的分割。

        劣势3:不准确,b图这个趴着的运动员的头盔是黑色,切割的时候把人家的头给割掉了了,h图把趴着的那个运动员的戴手套的手给切掉了。

        劣势4:速度慢,在无人驾驶这种实时性要求高的场景下无法应用

Structured Random Forests——(优势):structured这种优化随机森林的方法可以改善图片中噪声的问题。(劣势)容易过拟合,泛化效果不好,割出来准确率不高。而且慢。

SVM

(2)CNN-based Method

  • FCN
  • SegNet
  • LinkNet

深度学习模型在语义分割领域表现不佳的一些aspect、亟待解决的问题

(1)不匹配关系

不匹配就是你分出的类和ground truth不同,也就是label打错了。同样一个东西,有的模型会分类成船,有的分类成汽车。分类错误的缘故是,模型没有考虑到object所处的环境。

下图,第一幅是原图,第二幅是ground truth,右下角那个分成了船舶-黄绿色那个。第三个是模型A的语义分割结果,是错的,分成了汽车-蓝色。第四个是模型B的语义分割结果,是对的,分成了船舶-黄绿色。模型A出现的这种label错了的情况,被称为不匹配问题。

这种不匹配的关系的起因是,模型没有考虑到object所处的环境。下图这个circumstance是在水边,按照概率,在水边、在水上,船舶的概率比汽车高,所以这里应该优先预测成船舶。

 解决这个问题的模型有SPP ASPP PSPNet GCN DFN

(2)不寻常类

枕头和床单的花纹是一样的、长得很像,模型可能觉得这个枕头和床是一体或者说枕头不是一个单独的object,进而把枕头和床分成了一个类别。

这种问题多发生在,室内图片,东西比较小、东西比较在。

这种情况发生的原因是,模型没有人类的先验知识,不知道在床的头部和那个和床单一个条纹的东西是枕头的概率很大。

 解决这个问题的模型:RedNet RDFNet

语义分割实现流程——ML训练通用流程

(S1)训练

根据batch size大小,将数据集中的训练样本和标签label读入卷积神经网络。

根据实际需要,先对训练图片及标签进行预处理,比如裁剪和数据增强(增加训练样本的个数)。这两种预处理方法可以(1)加速收敛过程(训练耗费的时间趋向于变少),同时(2)避免过拟合(各种方向rotation的图都通过数据增强拿到了,丢进去训练,出来的模型就能识别各种角度的图)

(S2)验证

一次向模型丢入batch size张图片,那么数据集中所有的图片都丢一个遍,需要丢  照片数/batch_size  次。数据集中每一章图片都被模型吃了个遍,称为一个epoch。

进去训练一个epoch结束后,将数据集中的验证样本和标签丢进卷积神经网络,并载入训练过程中训练出的权重参数。根据编写好的语义分割模型进行验证,得到当前训练过程中的指标分数,保存对应权重。

每次训练紧跟一次验证,然后再训练,循环往复。

(S3)测试

训练结束后,将训练集中的测试样本和标签读入卷积神经网络,并将最优的权重参数值载入模型,进行测试

测试方式有两种

(1)根据常用的指标分数衡量网络性能

(2)将网络预测结果以图片的形式保存下来,直观感受分割的精确程度。

语义分割常见数据集

  • SUNRGBD——室内场景——3D的
  • NYUDv2——室内场景
  • PASCAL VOC——综合场景
  • CityScapes——道路场景
  • CamVid——道路场景

SUNRGBD这个数据集特别介绍一下

        这是一个3D的图

        RGB代表三原色彩图,除了RGB三色以外,还多了一个维度D, Depth深度,拍照的时候,除了三原色的拍一张,还用测量距离的深度摄像头记录图片上每一个点,到这个摄像头的距离,拍出来叫深度图。深度图上距离用灰度图来表示。最后RGB三色图的深度图Depth一起重建、还原这个3D的场景。RGB-D数据集,这种由三色图和深度图组成的数据集,又被叫做双流数据集。只有RGB图的这一种图的数据集叫单流数据集。

        在重建的3D空间进行分割是这样。实际上这里做分割,没有用深度图,是直接在RGB三色图上做的分割。

语义分割常用评估指标

(1)Pixel Accuracy:标记正确的像素占总像素的比例

(2)Mean Pixel Accuracy:计算每个类内被正确分类像素的比例,然后再求所有类的平均,针对样本不均衡inbalance这个问题而设计的,弱化那些样本量大的点准确率度的影响力到 1/category数量,放大那些样本量小的点的准确率到1/category数量

(3)Mean Intersection over Union(MeanIOU)计算真实值和预测值的交集——将预测值也加入了分母,只是数字要低一点,但我觉得没有比(2)好在哪里

FCN的研究成果

  1. 将经典的CNN-based model分类网络(AlexNet VGG GoogleNet)改编为全卷积神经网络,具体包括全连接层转换为卷积层以及反卷积进行上采样。输入输出的尺寸相同。
  2. 使用迁移学习方法进行fine-tuning微调(精调)。
  3. 使用skip architecture将语义信息和表征信息结合起来,将全局信息和局部信息结合起来,相互补偿,产生准确而精细的分割。
  4. FCN证明了end-to-end端到端、像素到像素pixel-to-pixel训练方式下的Convolution Neural Network超过了现有的所有最先进的传统机器学习算法。
  5. FCN成为了PASCAL VOC最出色的分割方法,较2011和2012分割算法的MIoU提高了将近20%,堪称state-of-the-art,分割图片的时间也大幅度缩小(从ML方法的60s到0.2ms)

FCN的研究意义

历史意义

  • 深度学习用于语义分割领域的开山之作
  • end to end训练为后续语义分割算法的发展的基石,以后的研究都是顺着这个方向发展的

当前应用

相比目标检测和图像分类,语义分割使我们对图像有更加细致的了解。

  • 地理信息系统GIS:高空拍下的图片进行语义分割,把船割出来、把体育场割出来、把草地割出来、把谷物田地割出来
  • 无人车驾驶
  • 医疗影像
  • 机器人
  • 图像搜索引擎

像素级预测任务=dense prediction tasks

使用了Transfer Learning: 他将VGG GoogleNet AlexNet这几个模型的 fully connected layer换成的卷积+upsampling上采样,基于网上公布的在ImageNet这个图片分类数据集上最优的参数(这些参数表示的是这些模型的learned representation,而这些learned representation不仅仅是在训练这些模型的数据集上是有用的,放到这篇文章上的数据集上也是有用的),以segmentation task为目标进行 fine-tuniing精调。

什么是End-to-End端到端学习?‘

       

可以根据设计好的算法自己学习特征,而不需要人为干预

        不要人工去做特征工程(hand-designed features),不用人去构建特征,特征feature是通过模型提取出来的

        端到端有两个端,一个端是 input 这一端,另一端是output这一端,中间所有过程依赖于算法本身的学习能力。我们只需从把图片放进input这一端,就能从另一端,output这一端,拿到语义分割的结果。中间我们什么人工设计特征的脏累苦活都不用干,所以end 和 end,之间加了一个轻飘飘的to。是的,你只需要to,并不需要做任何特征工程。

        end to end在语义分割领域意味着,输入是图片,输出也得是图片

                传统的machine learning中手动的feature engineer作用巨大,是performance score提升的bottleneck瓶颈和天花板,当时的AI专家把他们的绝大多数时间和精力花在了如何构建更好的特征上。

                后来出现了representation learning,开始自动构建特征工程

                Deep Learning的出现也是自动提取特征和构建特征,把算法工程师从构建特征这种繁琐无聊的、重复性很强工作中解放了出来,转而把精力放在设计模型结构这个更具创造性的工作中)

语义分割领域术语解释

pixel-wise像素级别,实际这个词对应的任务为Semantic Segmentation语义分割,每个像素都判断属于哪个category,这种有语义category的分割也被称为dense prediction。

image-wise图像级别,一整张图,实际这个词对应的任务为Image Recognition图像识别,判断图的category是狗还是猫

patch-wise块级别,将一整张图,切割成小方块,这样的图叫patch,是介于pixel-wise和image-wise的一个界别

patchwise training,对每一个感兴趣的像素,以他为中心取一个patch(小块),然后输入网络,输出则为像素的标签。

全局信息与局部信息

局部信息 Local information

        Appearance information from a shallow, fine layer

        提取位置:浅层网络

        特点:

                (1)物体的几何信息比较丰富(几何信息指的是点线面这些纹理图案。与较浅的层相对的,比较深的卷积层因为到这一层之前的卷积次数太多,特征图feature越变越小,所以几何信息被破坏的也比较多);

                (2)对应的感受野较小。这就会导致过分关注局部的不同,而失去了对图片整体的认识。比如下面这个图片,FCN-based model在改进之前,把奶牛的脊梁骨作为一个界限,(也是因为这个脊梁骨太过于突出,你过分关注脊梁骨这个明显的分界线以后,你就会觉得这个object的边界。但是你要是有了global information,可以从全局的角度看这张图,从更广阔的视角看这张图,你的感受域大到牛的边缘这个整体。你就会懂,虽然这条脊梁骨如此的显眼,但是它是奶牛的一部分,因此这不是边界,因此不应该把脊梁骨左边的部分不归类到奶牛这个label上)————(c)这个就是放大看了感受域,所以把脊梁骨左边的部分也归类成奶牛的一部分。

        目的:(1)有助于下面这种情景,分割尺寸较小的目标 (2)有利于提高分割的精确度

全局信息 Global information

        semantic information from a deep, coarse粗糙 layer

        提取位置:深层网络

        特点:

                物体的空间信息比较丰富。(空间信息和几何信息相对的。几何信息指的是点线面。空间信息的话,指的是“点线面”已经模糊了看不清了,但是你知道他在哪)

                对应的感受野较大

        目的:(1)有助于分割尺寸较大的目标,(2)有助于提高分割精确度

全局信息和局部信息之间的矛盾

FCN之前的那些也有很多人把卷积引进语义分割这个领域,但是没有实现端到端end-to-end(输入肯定是图片,但是他们的输出不是图片),也有的训练的时候不是pixel-wise级别的---是patch-wise级别的(把大图切成小方块,每个方块分配一个label)--因此分割效果不好啊

CV领域的这个proposal指的是目标检测(画方框)里面的推荐区域

人工智能对于数学要求高,主要指的是对传统机器学习,比如CRF conditional random field。对于深度学习,数学知识用到了求导、求偏导、矩阵乘法等其他运算而已,对于数学工具的要求不高,也是源于深度学习才诞生10年的理论发展还不成熟,数学工具的引入还不够多。

FCN以前分割的两大缺点

(1)它们大量使用了patch-wise segmentation基于图像块的分割。这种方法效率低,而且需要前期或者后期处理(比如超像素、检测框、局部预分类)

(2)它们做的这些语义分割面临的语义信息semantic information和位置信息不可兼得的问题。全局信息解决的问题是“是什么”,局部信息解决的是“在哪里”。

感受域-感受野-Recptive field

感受域receptive filed好比房间的窗户,窗户的大小,决定了我能看到多么大的外面的世界

定义:

        在Convolutional Neural Network中,决定某一层(这一层)输出结果中的一个元素所对应的输入层(上一层)的区域大小,被称为感受野。

大感受野的好处:

        大的感受野的效果比小的感受野的效果更好。感受野越大,看到的全局信息越多,越能从全局的角度去思考。

        越大的感受野,让我保留了更多的信息,避免忽略掉一些特别重要的信息。

CNN中这层的感受野的大小和上一层感受野的大小关系如下。可以看到stride越大下一层感受野的大小就越大。(为什么公式是这样的?逻辑在哪里?) 怎么跳的越多了,感受野反而大了?)其实kernel size越大,下一层的感受野也会大

        注意哦,这里说的感受野大小,是这一层针对原始图片的大小,和上一层没有关系。

        

从图中可以显然的看到,Layer2的感受野的大小是3×3。这个3怎么来的呢?我们带入上面的公式算出来给你看

        输入图片的感受野默认是1,所以RF1=1。kernel size=3。stride=1。

        RF2= 1+(3-1)×1=3。和上面的观察的感受野大小一致。说明我们套公式套对了。

那么请问Layer 3的感受野是多大?

        RF3=3+(3-1)*1=5。也就是输入图片整个的一个size。

但是过大的stride会使得feature map里面保留的信息变少。我们当然是希望保留更多的信息量了,所以要减少stride。为了保证感受野尽可能大,同时要减少stride,我们被迫选择了使用扩大卷积核这种 方式(其实减少stride可以保留更多信息这个事和尽量让感受野尽可能大这两件矛盾的事,如果我想要鱼与熊掌得兼,可以使用空洞卷积,只是这里这个作者没想出来)

平移不变性Translation invariance

是什么?

        图像中的目标无论被移到图片中的哪个位置,分类结果都应该是相同

在卷积神经网络里是指的什么?

        平移不变图像中的目标有移动时,得到的特征图也会产生相同的移动。

下图,假设原图上三个点表示一个人的身体。上面那幅原图把人的身体放在了左下角,下面那幅原图把人的身体放在了左上角。但是最终都被分类成了human body。说明object被平移以后(“平移”),分类结果是相同的(“不变”指的最终分了的结果不变)。同时我们可以看到,原图的human body的图案发生移动以后,在第二列的特征图上的位置也用下面,移动到了上面。


整个卷积网络可以分类正确(其实强调的是object图片中换了位置也可以分了正确),就是基于平移不变性这个假设的。

但是后面translation invariance在卷积神经网络中,已经被证伪了。(也就是说在卷积神经网络中,把object平移以后,分类结果会不准确)

        这篇文章推翻、证伪了translation invariance《Why do deep convolutional networks generalize so poorly to small image transformations?》。标题的意思是图片做了很小的变换以后,为什么卷积网络的泛化性这么差?他说的这种现象就是,平移以后,就分类错了,也就是平移以后变了。VGG ResNet InceptionNet这些都出现了不符合“平移不变性”的问题。FCN引用了这篇文章说明平移不变性的不成立 《Shiftable Multiscale Transforms》。

        具体说:输入图片的大小、网络的深度都会影响分类的结果。

为什么平移不变性不成立?

        CNN忽略的采样定律,也就是二次采样,也就是下采样。CNN有过多的下采样。下采样的步长。如果下采样的步长为1,也就是没有进行下采样,那么无论我的网络有多深,都满足平移不变性。但是一旦我的步长为2或者4,只要不是1,尤其是步长这一层卷积是2,下一层是4,不同层之间步长发生了大尺度的变化,它就会破坏原始空间的一个坐标,这个网络就会出现分类错误。

Shift-and-stitch究竟是啥啊?

(S1)先在图片周围padding一些0,然后向左、向上、向左上平移(shift),得到下面四张图。(注意平移的方式不仅仅有这三种,实际有12种,这里是为了讲解方便,进行了简化,只展示了原图+三种平移)

(S2)2×2的Max Pooling kernel,stride为2的,在四张图上走一圈得到第三例红、黄、绿、蓝,四张3×3的图。四张图中有灰色的部分,这是这个矩阵中数字和其他矩阵相同的数字,标记位灰色。灰色的东西因为重复了,不参与下一步

(S3)四个矩阵对应位置的数字全部取出,组成一个正方形,然后循环往复,得到右下角最后一幅图

 interpolation是插值法。常用的有线性插值,双线性插值bilinear interpolation,三线性插值

上采样方式不仅仅有deconvolution,还有插值法interpolation。

Deconvolution上采样并不能复原之前通过卷积 下采样 损失的这个信息。

FCN的独特之处

(1)全卷积Fully Conv:

是什么:Fuly Conv指的是舍弃掉CNN模型的最后一个组件,全连接层,用多个卷积层和上采样的deconv层替换。

        这里说明一下FCN这个模型名里面Fully Conv的来由。传统的CNN,里面除了有conv层、pooling层以外还有fully connected 全连接层,因此它这个conv不够fully,不够纯粹。那么我把全连接层给去掉,换上conv卷积层,这样我整个模型从始至终都在是卷积了,这样我的conv够fully了吧?因此得名Fully Conv Network.

为什么我们这里做的任务,是语义分割。全连接层把图片从二维拍扁成一维,损失了spatial information。但是我们做语义分割是在一个二维图上做的,自然希望保留二维图的结构,希望输出的是二维分割图。所以在最后一层里面用几个卷积层替换了之前的全连接层       

        全连接层一个是(1)尺寸固定,几个类别维度就是几(2)破坏了图片的二维属性

Before:改造之前,传统的CNN模型
         经典的卷积神经网络CNN 由哪几部分 组成?

        (1)卷积层convolution,用于获取高维特征deep feature(我觉得高维特征这个词不合适,具体卷积层捕捉到的是什么信息,需要我学了CNN原始模型以后才知道,才能过来改) 

        (2)池化层pooling,如果kernel size=2,会使得图片缩小一半。pooling实际起的就是降维的作用

        (3)全连接层fully connected+activation functions(是softmax)。比如说有1000个分类的类别。CNN的最后一部分,用全连接层把图片矩阵从二维矩阵加上channel一共三维的东西,拍扁成一维的一长条的一个向量。向量的长度为1000。向量上的每一个位置的值代表的是这张图属于这个类别的概率。数值最大的那个维度,表示这张图属于这个类别。tabby cat这个类别对应的向量上位置的的概率值最大,说明对这张图片的分类结果是tabby cat.

        convolution这个部分,长宽是图片的长宽。输入图片的size是227个像素乘以227个像素。第一个绿色的立方体,表示的是经过卷积和kernel为2的pooling后,被降维了,大小变为55*55*channel数。第二个小的、绿色立方体,表示进行了一次pooling,图片大小减半(55/5≈27)变成了27*27的。然后由三个长方体组成的第三组绿色组件表示,先经过pooling,图片大小减半变成13*13,然后又经过了两次卷积。

        向后延伸的那个,代表channel通道数。chanel的数量取决于你用多少个卷积核进行卷积运算。输入图片是RGB彩图,通道数为3,第一次卷积运算的时候,就是RGB三张图按着一个卷积核做运算,然后直接对应元素的位置相加,也就是对三原色的图层进行了一个数据融合fusion,得出一副feature map,因此是有多少个卷积核,最后就有多少个channel。
        FC全连接层,是相当于把conv层的图片从二维平面图降维成了一个点,后面那个长度表示的是类别数量。

 CNN过程

After: 改造之后,新的模型

最后一部分换成了卷积层+upsampling层。upsampling用的是新卷积层中不同深度卷积层的信息进行融合得出来的。最终的输出是size和原图一样,每个像素点标记了属于哪个类别。

        前面三个卷积层,做了subsampling,维度变小了、channel数也变小了,是为了减少参数量,减少计算负担

        Fully connected layer被替换成几个卷积层,最后一个卷积层的维度是1×1×21  (如果实验用的数据是PASCAL这个数据集,有21个category)。为啥channel数选21,就是因为数据集的语义分割标签有21个category。最后通过deconvolution还原出了的输出的维度是 输入照片的长  ×   输入照片的宽  ×  21.这样就可以出来一个和输入照片尺寸相同的照片,但是上面标了21中不同颜色,表示21种类别。

这里写图片描述

(2)Upsampling via Deconvolution

用我的话来说,Deconv的作用就是:size不够,up来凑!

 是什么:反卷积的输出图像大于输入图像,也就是实现了对图片的放大。反卷积Deconvolution也被称为up convolution,transposed convolution转置卷积。deconv反卷积这个名字因何而来?

具体实现方法:在input的这个小图片上下左右四侧padding了一堆零,把这个小图padding成了一张特别大的图,然后拿着一个卷积核对这个padding后的大图做卷积运算,其实也是又降维了一次,但是最后输出的feature map是 一个比输入图片大的图片,从而实现了放大图片和升维。

左图是卷积,右图是反卷积。

先说卷积:        

        原图是4×4的,卷积核是2×2的,上面绿色的卷积完的输出图、feature map。

        卷积后输出结果的维度计算公式

                output = (input - kenel size +2×padding)/ stride      +1

                output = (4-3+2×0)+1=2  ,和下图输出结果一致,说明我带入公式代的没有错,注意卷积后大小为3而不是2

再说反卷积:

        原图是4×4,kernel size=3×3,输出的feature map=5×5

        反卷积后输出结果的维度计算公式:

                ouput = (input  -  1)  ×  stride  +  k  -  2p

                output  =  (  3  -  1  )  ×  2  +  3  -  2  ×  1  =  5    和下图输出结果一致,说明我带入公式代的没有错, 

下图,把原图切开,每两个元素之间都塞着一个0,stride=2

为什么要进行上采样?

        (1)后面,不同深度的卷积层output出来的feature map 大小是不相同的。比如说pool3 pool4 conv7的size分别是,4×4,2×2,1×1。基于某种原因((3)skip architecture会解释),我们需要把pool3 pool4 conv7这些数据融合在一起。但是他们size不一样啊。这里就用到deconv 把conv7放大4倍,把pool4放大两倍,pool3保持不变。经此操作以后,三者的size都变成了4×4,大小一样了,就可以通过对应位置元素相加来实现数据融合fusion。

        (2) 当数据融合结束以后,需要通过上采样把feature map给放大到输出图片的那个size。以FCN-8s这个模型为例。pool3 pool4 conv7这三组数据融合成了一个4×4大小的的feature map。但是我们的输出要求是和输入一样大小的,32×32的一张图片。那么如何把4×4的feature map变成32×32这样大小呢?deconv就是起这个升维作用的。

(3)Skip Architecture

设计这个结构的原因

        面临的困难:FCN将CNN的最后一个组件全连接层,换成了3个卷积,也就是pool3 pool4 conv7。整个模型结构见下图。作者发现如果你直接用最深的卷积层conv7的这个output,去做upsampling,得出还原出来的32×32的图片,分割的特别粗糙rough,边界不够细腻,效果不好(下图展示了)。这样做也就是FCN-32s这个模型。于是作者明白了,只适用conv7这一层的数据是不行的,还得引入其他层的数据。

        为什么会出现这个难题?当卷积的深度一层层增加go deeper的时候,我们得到的收益是,更深的卷积层可以obtain到deep feature,semantic information。但是我们需要注意的是,每一次让卷积网络更深的时候,我们就多叠加了一个卷积层conv layer,每多做一次卷积,feature map的size就会变小一点。当feature map越变越小的时候,他能展示的空间信息spatial locational information就会被一点点的丢失掉。这就好比一块手机屏幕,这块屏幕即使再好,它也只有巴掌大小,它能展示的图片上图案的空间信息,肯定比不上地铁站的巨幅广告墙。这又好比降维的过程中,信息肯定多多少少都有一点损失,维度相对高的浅层信息会保留更多的信息。卷积次数比较少的浅层shallow layer保留了更多spatial locational information,appearance information。

        如何解决这个难题?比较深的卷积层,比如conv7,捕捉到了spatial information。比较浅的层,比如pool3,保留了大量spatial information。为了兼顾deep feature和spatial information,作者尝试把pool3 pool4 conv7进行数据融合。那为什么取名叫skip呢?因为这种数据融合,让不同层之间的数据有联系,就像你从第三个卷积跳跃到了第四个卷积,又跳到了第七个卷积,因此得名skip。

怎么做?

上面这一幅图就说明从input到output的是所有流程。下面我们掰开了,揉碎了,逐个流程,逐个组件,细细讲。

(1)输入

输入图片的大小是32×32,RGB三通道,彩图。你去数他的格子数量确实32个格子×32个格子。

(2)卷积层

FCN中从全连接层替换成卷积层的第一层之前的卷积,在这一部分,他们可以是AlexNet那样的堆叠卷积层的方式,也可以用VGG net堆叠的方式,GoogleNet也可以,具体看哪个适合你的数据你就用哪钟。

——pool1 pool2 pool3 pool4 poo5这个格子,表示pooling之后得到的矩阵,长和宽的格子的数量是有究的,分别是16×16,8×8,4×4,2×2,1×1,他们表示的就是,每pool一次,feature map的大小就缩减一半,从输入图片的32×32,降到16×16,最后降到1×1。一共pool了5次,size缩小了2^5=32倍。因而pool7的size是32/32=1。

——表示卷积的这个竖线,也不是随便画的,conv1和con2是两条竖线,表示一次卷积。conv3,conv4,conv5都是三根竖线,表示卷积两次。(你确定真的是卷积两次吗?为什么要卷积两次,一次不行吗?是实验完了说卷两次比卷一次score高才这样做的吗?

(3)skip跨层特征融合;通过upsampling,输出和输入size一样大小的矩阵

怎么做:

搞懂流程图最右边的两列,我们就可以搞明白FCN-32s,FCN-16s,FCN-8s这三个分割模型最后两步是如何操作的。
————对于FCN-32s这个模型,拿到pool5之后,经过conv6-7的卷积运算后,得到的是size=1×1的数据。( 为什么conv6-7只做了一次卷积却要叫做conv6-7,你直接叫conv6不久行了?还是说做了两次卷积都是1×1的卷积?)但是我们需要将输出变成32*32。这个时候就是用32倍的upsampling实现这一需求。也就是说图中的“32x upsampling prediction"中间的“32x”的意思是放大32倍。( 这里的32x和反卷积的stride有关吗? 是deconv的stride为32吗?是的话,为什stride为32,图片就放大了32倍?stride=32的意思不是做完第一次卷积,下一次卷积到32步以外的地方再卷积,那么势必导致deconv以后图片不变大,反而变小了呀 )

————对于FCN-16s这个模型:我们看流程图最右边第二行或者下图。这个模型的思想是,将相对较浅的层的信息,比如pool4,融合进深层信息比如conv7中。pool4的size是2×2,conv7的size是1×1,二者size大小不一致无法进行element-wise的对应位置元素相加的融合。为了统一size,conv7需要通过deconv来放大两倍。所以下图中,才写着“2x conv7”,就是把conv7放大两倍。它是由两部分组成的。第一部分是pool4,size是2×2。第二部分是2x conv7。2x的意思是放大两倍。现在我们把两个2×2的feature map进行相加,就得到一个2×2的feature map。我们最终的目的是输出和input原始图片一样长和宽的feature map(size=32×32),因此我们需要把2×2的feature map通过deconv来放大16倍。也正是因为放大的倍数是16,所以下面才写着"16x upsampled"和"FCN-16s"。都是表示16倍。

————对于FCN-8s这个模型:它是我们这场戏的主角,上面两个模型都是来跑龙套的,就是用他们的效果差来衬托FCN-8s模型的优秀。首先是数据融合,有三部分要融合(1)conv7从1×1upsampling放大4倍,(2)pool4 upsampling放大2倍(3)pool3直接拿过来。前面这三个,他们的size都是4×4。然后把三个4×4的矩阵对应位置element-wise相加,得到一个4×4的矩阵。因为我们最终需要得到32×32的output,所以需要用upsampling实现8倍放大,也是因此这个模型被称为FCN-8s。这个8就是8倍放大的意思。

 跨层数据融合真的有用吗?

我们结合上面两幅图,分割效果图和模型结构图,去分析,就可以知道跨层skip数据融合,有没有用处。

——首先三个模型的效果排序是:              FCN-8s > FCN-16s > FCN-32s

——从数据融合的角度看,优劣的排序是:pool5+pool4+pool3 > pool4+pool5 > pool5

——上面这个排序有可以拆分成下面两个对比

       conv7+pool4+pool3 > pool4+conv7.过对比图,我们才知道使用了skip arch,融合了深层卷积(conv7)和浅层卷积(pool 3,pool4)的FCN-8s,比只有深层信息的pool4和conv7但是没有浅层信息pool3的FCN-16s 好。这就是说明,加入浅层信息的pool3会提高分割效果。

        pool4+conv7 > conv7.继续对比,融合了pool4和conv7的模型FCN-16s,比只有深层信息conv7没有浅层信息的pool4的FCN-32s 要好。再次说明了,在深层信息conv7上面,加上一点比它浅一点的信息比如pool4,会提高分割效果。

——因此我们得出,只用最深的数据,效果最差,多融合一点浅层数据,模型效果会变好。

补充
        既然作者把pool3 pool4 conv7融合以后比conv7单独好,也比pool4和conv7融合的也要好。这时候,我们也许会问,我我把 pool1 pool2 pool3 pool4 conv7的全部融合在一起FCN-2s,y又或者FCN-4s,是不是比FCN-8s要好呢?作者也按照这个思路做了实验, 但是发现把pool 和pool2也融合进去的FCN-2s和FCN-4s并不能取得比FCN-8s更好的分割效果。也就是说skip architecture做到FCN-8s已经是尽头了。

训练技巧Training Tricks

  1. 加载预训练模型
  2. 初始化反卷积参数,通过线性插值的方式。(作者做实验试过了,按照这样初始化的话比起不初始化,训练过程中,模型会加速收敛;否则会收敛很慢)。(插值法初始化参数这个,用的特别少,目前我已知的论文,只有这一篇用了插值法来初始化参数;并且插值这个理论十分复杂,数学上难度很高,很难搞懂)。
  3. 训练的epoch数量必须多过175次以后,模型的MIoU才会有比较不错的表现。这是作者通过大量实验试出来的。175个epoch之前,loss下降的不够明显,MIoU的提升效果也不明显。
  4. 学习率leanring rate在100个epoch以后进行调整,越靠后的epoch你的的学习率应该是调的越小的。(这个100是作者试出来的,只是适用于他这个数据集,他这个模型结构,你拿去你的模型和你的数据集上未必适用)
  5. 只有pool3开始向后的特征图需要融合,pool3以前的特征图不需要融合。如果你把pool1和pool2加进去,会有一个负优化的效果。(因为作者做实验了发现,如果把pool1和pool2也融合进去,对于performance的提升是微乎其微了--几乎没有提升,但是因为引入pool1和pool2以后参数量增加了一些,训练更多的参数导致训练时长增加、训练更多的参数导致训练所耗费的算力增加。那加入pool1和pool2是不是多余呢?)
  6. 数据预处理的时候选用Randomly mirroring 

类别平衡是不是必须的?

        语义分割这个你知道,是个每一个像素点都进行分类,给出一个label。 那类别之间肯定是不平衡的data imbalance。比如background这个标签,有3/4的像素点都是background。
        在其他情境下,比如说图片分类(图片识别image recognition)上,我们会通过旋转来给数据量较小的类别造一些图片-数据,最终是的类别不平衡的问题有所缓解。
        但是这里作者认为,你是不需要把数据的类别变得平衡的
        但是直接告诉你,作者的观点是错误的。LinkNet这篇文章就是通过保证类别平衡使得performance变得更好了,鲁棒性和泛化能力也变得更好了。

FCN的不足

(1)使用了交浅层的特征,因为fuse操作会加上较上层的pool特征值,导致高维特征不能很好得以使用(为啥不能很好得以使用?我没太看懂这句话

(2)也因为使用较上层的pool特征值(为啥因为这个就导致对图片大小有所要求?),导致FCN对于图像大小变化有所要求。也就是,如果测试集图片远大于或小于训练集图片,FCN的效果就会变差

FCN可以改进的地方

  • 尺寸恢复
  • 类别平衡
  • 数据预处理:random mirroring随机镜像、旋转-造数据集、亮度
  • 资源利用:多块GPU并行跑

次要的东西

        Optimization方面,使用的是SGD with momentum的方法。momentum=0.9,weight decay of 5^4 or 2^4。minibath size=20。下面几个模型的learning rate分别是,FCN-AlexNet, FCN-VGG16, and FCN-GoogLeNet, 10^3, 10^4 ,5^5

        最后还是要加一个softmax,对属于不同类别的概率进行预测

我的疑问

什么是receptive fields视觉感受野,起什么作用?这个这FCN里又起了什么作用?;卷积神经网络里面的filter滤波器是什么?

什么是shift-and-stitch trick?(这篇文章没有用,应该是不重要)

反复讲的overlap,是什么和什么overlap?

为什fully convolutional computation 可以speed up training?
train for segmentation的时候,是 如何通过fine-tuning来实现?
intersection over union为什么可以作为评估语义分割的指标?

什么是fine-tuning?是梯度下降,参数更新吗?还是说特指在预训练模型下的参数更新?

bilinear interpolation,双线性插值吗?具体指的是什么?怎么操作?有什么用?
什么是端到端学习end to end,是不用做特征工程,input data 到output data吗?

术语解释

Dense Prediction:图像语义分割的目标是将图像的每个像素所属类别进行标注。因为是预测图像中的每个像素,这个任务通常被称为密集预测(dense prediction)

pixelwise像素 patchwise 图片小块

receptive fields:视觉感受野

uniform sampling:均匀采样

fine:是 “精确” 的意思,不是“良好”的意思

Reference

        论文解析FCN——Semantic Segmentation的开山之作https://blog.csdn.net/niuxuerui11/article/details/109300694

        深度学习语义分割(一)FCN论文解读https://blog.csdn.net/orange_littlegirl/article/details/80732058?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-4-80732058-blog-109300694.t5_download_comparev1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-4-80732058-blog-109300694.t5_download_comparev1&utm_relevant_index=7

        Review: FCN — Fully Convolutional Network (Semantic Segmentation)https://towardsdatascience.com/review-fcn-semantic-segmentation-eb8c9b50d2d1

        卷积神经网络CNN(3)—— FCN(Fully Convolutional Networks)要点解释https://blog.csdn.net/Fate_fjh/article/details/53446630

在这里插入图片描述

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

德彪稳坐倒骑驴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值