目录
绪论
百度AIStudio 是个很好的深度学习训练平台,由于参加过目标检测7日打卡营,学到了很多干货,所以又报名了图像分割7日打卡营 2020年10月19日~10月26日,同时也从现在开始记录每节课的知识要点帮助加深印象和巩固复习。
注:本文所有图片均截自课程ppt,同时只重点记录我关注的知识点,其它一笔带过,每期课程直播均有回放,若想查看具体资料和视频请点击以下地址。
地址:https://aistudio.baidu.com/aistudio/course/introduce/1767
Class1 图像分割综述
图像分割类型:
- 语义分割(课程主要实现):给每个像素点分类
- 实例分割:给每个框里的object分mask
- 全景分割:背景像素点分类+框mask
应用场景:
- 人像分割
- 自动驾驶(行人、车道线、车辆分割)
- 医学影像(CT、病理)
- 工业质检、分练机器人
语义分割算法基本概念
-
根本目的:像素级分类
-
基本流程:
-
评价指标:
mAcc:pre和gt对应位置的分类准确率
mIoU:每一类对应结果之间的交并比的平均值
为什么要两个指标:acc只是分割类别的准确度,而mIoU加大了小物体的分割指标占比
实践部分
环境:paddle1.8.4 、python3.7
操作:
- 简单网络搭建:basic_model.py
- 熟悉dataloader原理:basic_dataloader.py
- 分割数据处理:basic_transform.py
Class2 全卷积FCN网络
- Full Converlutional Networks:全卷积,即没有FC层
- 如何做语义分割? 语义分割~=像素级分类
- 与图像分类的关系?把FC换为Conv
- 分割和分类最大区别是分割需要做每一个像素级的分类
- FCN不在乎输入图片的尺寸,他本身可以卷积任何尺寸
步骤一
实际上我们做的工作就是把传统分类方法变成分割,把FC变为FCN
1x1卷积:降维或者升维,输入到输出的HW(高和宽)是不变的,改变的是C(通道数channel),变化个数和1x1卷积个数一样。
步骤二
只通过FCN的方式达不到我们的目的,如下图,变为全卷积网络输出最后的尺度(HW)太小,最后分割效果会很差。所以需要把feature map尺寸变大到原图一样大小,才能做到更精细的分割任务。
如何在全卷积中由白色的小block最后变成下图蓝紫色的block进而去做分割?就要用到上采样(Upsample),有三种方式。
-
1)Up-sampling
相当于Bilinear Intepolation(双线性插值)
假设P点为需要插值的点,x1和x2为可以看为像素点,相减则为之间的距离
具体例子:3x3插值为6x6,为什么其中2没有了,是因为2刚好在插值的两个数之间(图中为1.8和2.2之间),毕竟它算是等比例插值。如果不是123这种顺序而是132,原理也是一样,就单独计算1和3、3和2之间的插值,相当3也会隐藏掉。
-
2)Un-pooling
用的很少,丢失信息多,但速度快,可做了解。实际上就是反向Pooling。
如下图输入4x4,通过maxpool变成2x2,然后就Un-pooling还原为4x4,具体每个像素点的位置则需要一个index记录。
-
3)Transpose Conv(重点)
标准的卷积是把Feature map通过卷积核变小,如下图左边。
反卷积是输入一个固定尺度的Feature map,输出变大的Feature map,如下图右边。
操作步骤:
1、先把Kernel klockwise180,就是把卷积核做个水平和垂直的翻转,如下图白色3x3卷积核变为绿色。
2、conv with padding,根据卷积核大小添加padding,使之每次都是与输入Feature map的左上角第一个数做卷积,如下图:4x4输出的1=卷积核的又下角1 x 输入的左上角的1。
3、对应求出各点的值。
小总结:实际上这三个方法的就是把Feature map变大,具体的使用只需要填参数就可以了。
步骤三
有了以上工具我们看看整体的FCN网络结构,如下图:
-
Encoder编码器是把Feature map逐渐变小,可以看成vgg。
-
Decoder解码器就是做一系列上采样和卷积操作,然后做个Softmax分类,最后得到和输入尺寸一样大的分割图。有了这个就可以算loss和训练。
-
FCN结构就是这样,无非里面层数和参数不同,比如u-net、pspnet、deeplab都是这个原理。
具体的结构采用自fcn论文原文,backbone采用vgg16:
其中全面不变,最后conv6-7原文采用的是fc,此处需要经过1x1卷积核变成卷积的结构,在在后面加上upsample,最后得出和原图大小一样的Feature map。
论文题目:Fully Convolutional Networks for Semantic Segmentation
论文地址:https://arxiv.org/abs/1411.4038
实际上的应用不会这样做,只有一个上采样效果可能不好,需要采用多层特征融合的形式:
如图左边,FC7出来的block做个2倍的上采样便与Pool4的维度一样,可以做个融合后再2倍上采样,又与Pool3一样,继续融合做个8倍上采样就得到与原图一样尺度的Feature map,最后做个Softmax就OK了。
FCN的巧妙之处
这是第三节课的开头内容,我直接统一放到这里了。
-
问题1:vgg的输入经过layer1层为什么要加个[100,100]的padding,如下图红色方框处?
解答:这是为了适应FCN网络的任意尺寸输入,最终都可以把输出还原成输入的尺寸。假设输入224x224,经过一系列pool后成为7x7,最终经过FC6层后能够变成1x1。但是如果输入为1x1,那再经过pool始终都依旧是1x1,经过FC6就会报错.那么在layer1层加上padding=100,相当于输入就变为199x199,经过pool后依旧是7x7,便可以正常输出。
-
问题2:为什么cropping取值为[3, 9, 31]?这里是在特征的多尺度融合的案例中体现的
解答:具体计算不说了,就是为了匹配各个需要融合的Feature map的尺寸。融合pool4时,需要Cropping出原本Pool4层的中间部分,其舍弃的padding就是5;融合pool4时舍弃的padding为9。有意思的来了,上采样8倍的时候得到的最后的Feature map与layer1(就是问题一中添加了100padding的输入)对比,相差的padding就为刚好为32,由于有时候像素会偏移,所以相差一个pixel没关系,最终得到的就是31。
感觉没讲清楚,可以自己去看看原视频,实际上具体不需要太care计算过程,只要知道是干嘛的就ok,毕竟都时直接拿来用的。
总结
优点:
- 任意尺寸输入
- 效率高(相较以前)
- 结合浅层信息
缺点:
- 分割结果不够精细
- 没有考虑上下文信息(指像素点周围的信息)
Class3 U-Net/PSPNet模型
1、U-Net
这篇文章主要在医学中的视觉方向的影响力比较大。
论文名称:U-Net: Convolutional Networks for Biomedical Image Segmentation
论文地址:https://arxiv.org/abs/1505.04597
-
实际上依旧是encode、decode的模式,如下图
-
主要就像下面这种u形结构,创新点就是把前面浅层的信息直接与后面上采样的Feature map通过concat叠加融合。
-
简单的结构图:
注:这种方式可能会存在融合尺度大小不匹配的情况,就同FCN一样采用Crop,然后再Conv。 -
最后的输出层与FCN一样
如上图最后的Feature map为h x w x 64,它的维度为64,假设要求分割的数据类别是9类,前面也说了分割是像素级分类,那么就需要把这64维变成9。
第一步:那么最简单就是1x1卷积,只需要改变维度而不改变h和w。
第二步:此时已变成h x w x 9,再在9这个维度上做softmax分类。softmax就是把一些输入映射为0-1之间的实数,并且归一化保证和为1,广泛用于多分类的场景中。
第三步:此时已得到了每个维度的概率分布,然后argmax取得最大的概率对应的类别,即把9的维度变为1,那么最后输出的就是h x w x 1。
-
与fcn区别:在前面网络的encode结构中用了特征融合,不单纯用vgg。
-
主要的操作
2、PSPNet
论文名称:Pyramid Scene Parsing Network
论文地址:https://arxiv.org/abs/1612.01105
-
1、PSPNet主要添加了FCN没有考虑的上下文信息。
上下文信息(context info):下图第一张图是输入,第二张是GT,第三张是FCN输出,第四张是PSPNet,不考虑上下文信息,FCN就容易把图中的船单独分割成车。添加上下文信息之后,根据旁边信息是水和树,就可以判别出这是船。简而言之就是像素点周围的信息。
2、如何添加上下文信息,就需要增大感受野。
感受野(receptive field):用于产生特征的输入图像中的区域大小,只针对局部操作,如conv、pooling。
-
网络主要结构与步骤详解:
1)输入一张图像,经过backbone(图中cnn处)输出到图中步骤b,生成 Cx64x64 的Feature map。
2)然后有一个Adaptive Pooling的操作(图中POOL),就是给定输入的Feature map和一个(n,n)的尺度,最终输出的就是nxn的特征图,默认是输出4个block,分别为Cx1x1、Cx2x2、Cx3x3、Cx6x6。
3)接下来做一个降维操作(中间的CONV),也就是1x1卷积,维度统一降成C/4,目的是最后可以拼回原维度。
4)维度的组合解决了,现在就需要处理尺度问题,也就是上采样操作(UPSAMPLE),最终生成4个 C/4x64x64 的特征图,代表的是不同感受野的信息。
5)最后一步就是concat这4个block成为一个Cx64x64,再与步骤b的Feature map做一个concat生成最终的特征图。
6)最后的CONV实际上是个Classfier,里面是卷积、BN再卷积。
注:这里有个 Adaptive Pooling 的概念要和 1x1卷积 区分开来,AP是不改变维度改变尺度,而1x1卷积是不改变尺度改变维度。如下图所示:
Class4 DeepLab系列算法
1、 Dilated Conv原理和细节
-
Dilated Conv = Atrous Conv = 空洞卷积
论文:Dilated Residual Networks
地址:https://arxiv.org/pdf/1705.09914.pdf -
将kernel扩大填0,featuremap间隔计算conv
2 、DeepLab系列解读
DeepLab Series:
-
DeepLab V1:
论文:Semantic image segmentation with deep convolutional nets and fully connected CRFs
收录:ICLR 2015 (International Conference on Learning Representations)
代码:https://github.com/TheLegendAli/DeepLab-Context -
DeepLab V2:
论文:Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
收录:TPAMI 2017 (IEEE Transactions on Pattern Analysis and Machine Intelligence)
代码:https://bitbucket.org/aquariusjay/deeplab-public-ver2/src/master/ -
DeepLab V3:
论文:Rethinking Atrous Convolution for Semantic Image Segmentation
代码:https://github.com/eveningdong/DeepLabV3-Tensorflow -
DeepLab V3+:
论文:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
收录:ECCV2018
代码:https://github.com/tensorflow/models/tree/master/research/deeplab
关键结构对比:
-
DeepLab V1:
-
DeepLab V2:
添加了ASPP模块(空洞空间卷积池化金字塔 Atrous Spatial Pyramid Pooling) -
DeepLab V3:
添加了upgraded ASPP模块
- DeepLab V3+:
Class5 图卷积网络算法
Class6 实例与全景分割
1、实例分割和全景分割
2、经典方法
-
实例分割:
Proposal- based/Top-down:Mask RCNN [ICCV 2017]
Proposal-free/Bottom-up:SOLO [ECCV 2020]
-
全景分割:
Proposal- based/Top-down:UPSNet [CVPR 2019]
Proposal-free/ Bottom-up:Panoptic- DeepLab [CVPR 2020]