以前看了一些介绍语义分割的论文,可是没有记笔记,由于想把时间花在跑模型,加强工程能力上。如今参照别人的文章,把看过的几篇论文作一个简单的总结。算法
1. FCN网络
网络结构以下图,即输入图片经过CNN网络提取特征,以后通过上采样,将特征恢复成原图大小,从而达到像素级别的分割:架构
全卷积网络,有三个特色:框架
1. 将全链接层替换为全卷积层,即最后一层是经过卷积生成,1*1*2046个特征,而非直接变成全链接层。 我理解去掉全链接层好处是,卷积层能够对任意大小的feature map 进行卷积,从而最开始输入的图片大小就可变了。而全链接层因为计算方法的区别,必须对输入的feature map进行统一大小,否则就没法计算。其余方面应该是同样的。能够本身手推一下。如图所示,将全链接层替换为全卷积层机器学习
2. 上采样。我以为这点很重要,将提取的高维抽象特征,通过上采样恢复成原图大小,各个channel再叠加起来,完成了像素级别的特征提取。上采样方法和CNN 反向传播求梯度时的上采样方法同样, 此处可参考其余人手推的BP算法在CNN网络中的实现。这个实现很重要,有必要本身学会如何手推。函数
3. 跨层链接。这点没什么好说的,目的就是经过获取多层特征,从而对feature的还原度好一点。论文实现了32倍,16倍和8倍上采样(三种框架),上采样方法以下图所示.学习
下图是3种倍数的上采样的分割效果,能够看到8倍上采样的分割效果最好。论文里也尝试融合更多层特征,以后再上采样,可是改善效果不大优化
损失函数,参照我上一篇博客相关介绍:编码
2. U-netspa
这个框架常常被用来进行Kaggle比赛,用做baseline,应该是由于模型简单,很是快,用少许图像也训练得比较好。并且最开始也是用做医学图像标记的,对小物体效果也很好。不过如今已将发展到DeepLab V3及Mask-RCNN了,我以为后面两个模型更好。
下图就是网络结构。由此也能够看出来为毛要叫U-net了。对FCN的一种改进吧,上采样过程当中融合了更多层的原feature map的信息,同时注意是经过增长channel的方式来进行的融合,先裁剪成2*2,以后按通道加到上采样后的通道中,而非FCN的直接求和来叠加feature map的信息。这点能够从channel数量看出来。通道数很大,这样能够将上下文信息传到分辨率更高的层中去。
左边是下采样,不断提取特征,同时分辨率降低,右边是上采样,增大分辨率,同时融合原feature map信息,目的是加强位置信息。由于越抽象到高层,特征所表达的位置信息就越若。增长底层的feature map的信息,就可加强上下文信息。这点下一篇博客会专门写一下相关网络架构。
说一下其损失函数的定义。这个定义的损失函数比价复杂,缘由是为了将相互接触的目标分开,是按照位置赋予像素一个权重,对比机器学习KNN及线性分类器及SVM这种,很像按高斯核来肯定的一个权重。毕竟细胞是相互接触的,实际Kaggle中用的U-net损失函数定义和其余无区别,由于比赛重叠的物体不多。
3. Segnet
没什么好说的,看网络结构,感受和U-net很像,都是编码解码过程,并且看后面感受也没什么人用,就没怎么看。创新点是池化过程当中记住了位置信息,上采样时按位置信息恢复能够更好还原图像。 我原本觉得以前全部的都是按这种形式作得,这个之后有时间要看下tensorflow的源码上采样实现过程了
4. Deeplab系列
deeplabv1&v2
Deeplab讲一下空洞卷积的概念。其实后面是用条件随机场作过图像处理,加强图像位置信息,可是条件随机场,几率图这部分看着头大,公式推过几遍,可是当时学的时候没有用到什么算法实例,并且DeeplabV3把这部分也去掉了,就先不写。下面就是总体的流程。j简单讲一下v1,v2,其实也没怎么看。感受不如直接讲V3和V3+。
空洞卷积的引入就是在不减少分辨率的状况下增长感觉野。上一篇博客讲过。空洞率rate就是空洞的个数+1. 能够看到对相个数同的像素点进行卷积操做,空洞卷积的感觉野明显增大。
Deeplab V2相比V1其实就是增长了使用不一样空洞率的卷积核来进行卷积,就好像增长了不一样尺度的feature map,以后对这些进行了融合。没仔细看,不讲了,简单以下图
Deeplab V3
感受相比前两种,V3改进就是尝试了ASPP模块的改进,基础网络仍是resnet。V3和V3+这两篇论文比较重要,也看了源码,可是暂时没时间仔细看,看完源码以后再写篇博客专门写一下。
最开始,如图所示有如下几种级联方式。
1.不一样尺寸的图像进行输入,以后将feature map融合进来。常见于人脸检测中。
2. 编码解码方式。好比U-net
3. 串联结构
4.并联结构
后两种结构均在本文作了尝试
并联方式改进以下,增长了1*1的卷积和全局池化层。1*1卷积能够当作空洞rate特别大的卷积,而image pooling 至关于对全局图片进行平均池化,成为一个点,以后通过一个1*1的卷积后,采用双线性差值进行上采样:
论文也尝试过串联结构,可是貌似效果很差?
DeeplabV3+
18页的论文,真是。。太麻烦了。其实就两点,对DeeplabV3的进一步优化,加入了编码解码结构。ASPP结构是编码,后续上采样加入了底层的featur map信息,目的是加强位置敏感性?第二点就是基础模型的改进。。
网络结构再也不是Resnet,变成了Xception.不会的能够参考下其余人的博客。。我下一篇也会写这个模型。。。
Deeplab系列就这样吧。这一系列看的有点着急,并且是很久以前看的从新写心得,其实颇有必要实现下源码加强理解。。下周会写一份源码的阅读记录。。。
PSPnet
PSPnet其实在DeeplapV3以前,DeeplabV3就是吸收了它的global pooling层的特色作得一个改进。global pooling的意义就是吸收不一样尺度的特征信息,也包含了位置的信息。通过不一样尺度的global pooling,造成1*1,2*2,3*3和6*6后的feature map,以后卷积,减少通道个数。在进行上采样(双线性差值方法)和未通过pooling的层进行融合。进行分割。总体过程以下图:
大卷积有利于掌握全局信息,可是前面global pooling和1*1会损失位置信息,且单纯大卷积会形成计算量大,因此本文采用了GCN形式,且经过残差模块来提升边缘信息。我不是很理解GCN是怎么实现的,难道padding是使用的same padding?没有看源码,只看了下大体的结构。流程以下,看到增长的新模块是GCN和BR结构。
Refinet 没看,之后再补上
Mask-RCNN
Mask-RCNN是很厉害的一个网络了,这个的源码是必需要看的。并且在Kaggle比赛中也有用这个打比赛的,效果很好。总体还从语义分割直接链接到的实例分割的层次,即有目标检测加语义分割两个的融合。
对Fster-RCNN的改进:
1. 增长mask分支,增长像素级别分类。采用了FCN结构,效果反映在loss函数上对预测目标的进一步优化结构以下:
loss函数以下,对每个像素预测一个二值掩膜,即0,1。即对每个RPN预测K(类别)个m*m个值,每一个类别损失函数单独算。m*m个2值,由此来计算损失:
2. 对池化进行了优化,采用ROIalign,即便用线性插值方法对池化操做进行优化,目的是达到像素级别的对准。感受这个很早就用在了语义分割里?具体以下:
这套方案将目标检测和语义分割结合起来,不是单独的用像素块标记出物体,同时还能够告诉你这个像素块属于哪种类别。结果以下: