图像分割综述【深度学习】

转载

  • 语义分割

    在普通分割的基础上,分类出每一块区域的语义(即这块区域是什么物体)。 
    如把画面中的全部物体都指出它们各自的类别。php

  • 实例分割

    在语义分割的基础上,给每一个物体编号。 
    如这个是该画面中的狗A,那个是画面中的狗B。html

U-Net

U-Net原做者官网前端

U-Net是原做者参加ISBI Challenge提出的一种分割网络,可以适应很小的训练集(大约30张图)。U-Net与FCN都是很小的分割网络,既没有使用空洞卷积,也没有后接CRF,结构简单。git

图9 U-Net网络结构图github

整个U-Net网络结构如图9,相似于一个大大的U字母:首先进行Conv+Pooling下采样;而后Deconv反卷积进行上采样,crop以前的低层feature map,进行融合;而后再次上采样。重复这个过程,直到得到输出388x388x2的feature map,最后通过softmax得到output segment map。整体来讲与FCN思路很是相似。算法

为什么要提起U-Net?是由于U-Net采用了与FCN彻底不一样的特征融合方式:拼接!spring

 

图10 U-Net concat特征融合方式apache

与FCN逐点相加不一样,U-Net采用将特征在channel维度拼接在一块儿,造成更“厚”的特征。因此:后端

语义分割网络在特征融合时也有2种办法:api

  1. FCN式的逐点相加,对应caffe的EltwiseLayer层,对应tensorflow的tf.add()
  2. U-Net式的channel维度拼接融合,对应caffe的ConcatLayer层,对应tensorflow的tf.concat()

 

综述介绍

图像语义分割,简单而言就是给定一张图片,对图片上的每个像素点分类

从图像上来看,就是咱们须要将实际的场景图分割成下面的分割图:

 

不一样颜色表明不一样类别。通过阅读“大量”论文和查看PASCAL VOC Challenge performance evaluation server,发现图像语义分割从深度学习引入这个任务(FCN)到如今而言,一个通用的框架已经大概肯定了。即:

 


  • FCN-全卷积网络
  • CRF-条件随机场
  • MRF-马尔科夫随机场

前端使用FCN进行特征粗提取,后端使用CRF/MRF优化前端的输出,最后获得分割图。

 

前端

为何须要FCN?

咱们分类使用的网络一般会在最后链接几层全链接层,它会将原来二维的矩阵(图片)压扁成一维的,,最后训练输出一个标量,这就是咱们的分类标签。

而图像语义分割的输出须要是个分割图,且不论尺寸大小,可是至少是二维的。因此,咱们须要丢弃全链接层,换上全卷积层,而这就是全卷积网络了。具体定义请参看论文:Fully Convolutional Networks for Semantic Segmentation

前端结构

FCN

此处的FCN特指Fully Convolutional Networks for Semantic Segmentation论文中提出的结构,而非广义的全卷积网络。

做者的FCN主要使用了三种技术:

  • 卷积化(Convolutional)
  • 上采样(Upsample)
  • 跳跃结构(Skip Layer)

卷积化

卷积化便是将普通的分类网络,好比VGG16,ResNet50/101等网络丢弃全链接层,换上对应的卷积层便可。

上采样

此处的上采样便是反卷积(Deconvolution)。固然关于这个名字不一样框架不一样,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose。CS231n这门课中说,叫conv_transpose更为合适。

众所诸知,普通的池化(为何这儿是普通的池化请看后文)会缩小图片的尺寸,好比VGG16 五次池化后图片被缩小了32倍。为了获得和原图等大的分割图,咱们须要上采样/反卷积。

反卷积和卷积相似,都是相乘相加的运算。只不事后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的先后向传播便可。因此不管优化仍是后向传播算法都是没有问题。图解以下:

可是,虽然文中说是可学习的反卷积,可是做者实际代码并无让它学习,可能正是由于这个一对多的逻辑关系。代码以下:

layer {
  name: "upscore"
  type: "Deconvolution"
  bottom: "score_fr"
  top: "upscore"
  param {
    lr_mult: 0
  }
  convolution_param {
    num_output: 21
    bias_term: false
    kernel_size: 64
    stride: 32
  }
}

能够看到lr_mult被设置为了0.

跳跃结构

(这个奇怪的名字是我翻译的,好像通常叫忽略链接结构)这个结构的做用就在于优化结果,由于若是将全卷积以后的结果直接上采样获得的结果是很粗糙的,因此做者将不一样池化层的结果进行上采样以后来优化输出。具体结构以下:

而不一样上采样结构获得的结果对好比下:


 

固然,你也能够将pool1, pool2的输出再上采样输出。不过,做者说了这样获得的结果提高并不大。

这是第一种结构,也是深度学习应用于图像语义分割的开山之做,因此得了CVPR2015的最佳论文。可是,仍是有一些处理比较粗糙的地方,具体和后面对比就知道了。

SegNet/DeconvNet

这样的结构总结在这儿,只是我以为结构上比较优雅,它获得的结果不必定比上一种好。

SegNet


 

DeconvNet

这样的对称结构有种自编码器的感受在里面,先编码再解码。这样的结构主要使用了反卷积和上池化。即:

 
 

反卷积如上。而上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其余位置填0即OK。

DeepLab

接下来介绍一个很成熟优雅的结构,以致于如今的不少改进是基于这个网络结构的进行的。

首先这里咱们将指出一个第一个结构FCN的粗糙之处:为了保证以后输出的尺寸不至于过小,FCN的做者在第一层直接对原图加了100的padding,可想而知,这会引入噪声。

而怎样才能保证输出的尺寸不会过小而又不会产生加100 padding这样的作法呢?可能有人会说减小池化层不就好了,这样理论上是能够的,可是这样直接就改变了原先可用的结构了,并且最重要的一点是就不能用之前的结构参数进行fine-tune了。因此,Deeplab这里使用了一个很是优雅的作法:将pooling的stride改成1,再加上 1 padding。这样池化后的图片尺寸并未减少,而且依然保留了池化整合特征的特性。

可是,事情还没完。由于池化层变了,后面的卷积的感觉野也对应的改变了,这样也不能进行fine-tune了。因此,Deeplab提出了一种新的卷积,带孔的卷积:Atrous Convolution.即:

而具体的感觉野变化以下:

 

a为普通的池化的结果,b为“优雅”池化的结果。咱们设想在a上进行卷积核尺寸为3的普通卷积,则对应的感觉野大小为7.而在b上进行一样的操做,对应的感觉野变为了5.感觉野减少了。可是若是使用hole为1的Atrous Convolution则感觉野依然为7.

 

因此,Atrous Convolution可以保证这样的池化后的感觉野不变,从而能够fine tune,同时也能保证输出的结果更加精细。即:


 

总结

这里介绍了三种结构:FCN, SegNet/DeconvNet,DeepLab。固然还有一些其余的结构方法,好比有用RNN来作的,还有更有实际意义的weakly-supervised方法等等。

 

后端

终于到后端了,后端这里会讲几个场,涉及到一些数学的东西。个人理解也不是特别深入,因此欢迎吐槽。

 

全链接条件随机场(DenseCRF)

对于每一个像素i具备类别标签x_i还有对应的观测值y_i,这样每一个像素点做为节点,像素与像素间的关系做为边,即构成了一个条件随机场。并且咱们经过观测变量y_i来推测像素i对应的类别标签x_i。条件随机场以下:

条件随机场符合吉布斯分布:(此处的x即上面说的观测值)

P(\mathbf{X=x|I})=\frac{1}{Z(\mathbf{I})}\exp(-E(\mathbf{x|I}))

其中的E(\mathbf{x|I})是能量函数,为了简便,如下省略全局观测\mathbf{I}

E(\mathbf{x})=\sum_i{\Psi_u(x_i)}+\sum_{i<j}\Psi_p(x_i, x_j)

其中的一元势函数\sum_i{\Psi_u(x_i)}即来自于前端FCN的输出。而二元势函数以下:

\Psi_p(x_i, x_j)=u(x_i, x_j)\sum_{m=1}^M{\omega^{(m)}k_G^{(m)}(\mathbf{f_i, f_j)}}

二元势函数就是描述像素点与像素点之间的关系,鼓励类似像素分配相同的标签,而相差较大的像素分配不一样标签,而这个“距离”的定义与颜色值和实际相对距离有关。因此这样CRF可以使图片尽可能在边界处分割。

而全链接条件随机场的不一样就在于,二元势函数描述的是每个像素与其余全部像素的关系,因此叫“全链接”。

关于这一堆公式你们随意理解一下吧... ...而直接计算这些公式是比较麻烦的(我想也麻烦),因此通常会使用平均场近似方法进行计算。而平均场近似又是一堆公式,这里我就不给出了(我想你们也不太愿意看),愿意了解的同窗直接看论文吧。

 

CRFasRNN

最开始使用DenseCRF是直接加在FCN的输出后面,可想这样是比较粗糙的。并且在深度学习中,咱们都追求end-to-end的系统,因此CRFasRNN这篇文章将DenseCRF真正结合进了FCN中。

这篇文章也使用了平均场近似的方法,由于分解的每一步都是一些相乘相加的计算,和普通的加减(具体公式仍是看论文吧),因此能够方便的把每一步描述成一层相似卷积的计算。这样便可结合进神经网络中,而且先后向传播也不存在问题。

固然,这里做者还将它进行了迭代,不一样次数的迭代获得的结果优化程度也不一样(通常取10之内的迭代次数),因此文章才说是as RNN。优化结果以下:

马尔科夫随机场(MRF)

在Deep Parsing Network中使用的是MRF,它的公式具体的定义和CRF相似,只不过做者对二元势函数进行了修改:

\Psi(y_i^u, y_i^v)=\sum_{k=1}^K\lambda_ku_k(i, u, j, v)\sum_{\forall{z\in{N_j}}}d(j, z)p_z^v

其中,做者加入的\lambda_k为label context,由于u_k只是定义了两个像素同时出现的频率,而\lambda_k能够对一些状况进行惩罚,好比,人可能在桌子旁边,可是在桌子下面的可能性就更小一些。因此这个量能够学习不一样状况出现的几率。而原来的距离d(i,j)只定义了两个像素间的关系,做者在这儿加入了个triple penalty,即还引入了j附近的z,这样描述三方关系便于获得更充足的局部上下文。具体结构以下:

这个结构的优势在于:

  • 将平均场构形成了CNN
  • 联合训练而且能够one-pass inference,而不用迭代


 

高斯条件随机场(G-CRF)

这个结构使用CNN分别来学习一元势函数和二元势函数。这样的结构是咱们更喜欢的:

而此中的能量函数又不一样于以前:

E(\mathbf{x})=\frac{1}{2}\mathbf{x}^T(\mathbf{A+\lambda I)x}-\mathbf{Bx}

而当(\mathbf{A+\lambda I)}是对称正定时,求E(\mathbf{x})的最小值等于求解:

(\mathbf{A+\lambda I)x}=\mathbf{B}

而G-CRF的优势在于:

  • 二次能量有明确全局
  • 解线性简便不少 

 

感悟

  • FCN更像一种技巧。随着基本网络(如VGG, ResNet)性能的提高而不断进步。
  • 深度学习+几率图模型(PGM)是一种趋势。其实DL说白了就是进行特征提取,而PGM可以从数学理论很好的解释事物本质间的联系。
  • 几率图模型的网络化。由于PGM一般不太方便加入DL的模型中,将PGM网络化后可以是PGM参数自学习,同时构成end-to-end的系统。

 

完结撒花

引用

[1]Fully Convolutional Networks for Semantic Segmentation

[2]Learning Deconvolution Network for Semantic Segmentation

[3]Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials

[4]Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs

[5]Conditional Random Fields as Recurrent Neural Networks

[6]DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs

[7]Semantic Image Segmentation via Deep Parsing Network

[8]Fast, Exact and Multi-Scale Inference for Semantic Image Segmentation with Deep Gaussian CRFs

[9]SegNet

 

 

图像分割 (Image Segmentation) 重大资源:

入门学习

  1. A 2017 Guide to Semantic Segmentation with Deep Learning 概述——用深度学习作语义分割
  2. 从全卷积网络到大型卷积核:深度学习的语义分割全指南
  3. Fully Convolutional Networks
  4. 语义分割中的深度学习方法全解:从FCN、SegNet到各代DeepLab
  5. 图像语义分割之FCN和CRF
  6. 从特斯拉到计算机视觉之「图像语义分割」
  7. 计算机视觉之语义分割
  8. Segmentation Results: VOC2012 PASCAL语义分割比赛排名

进阶论文

  1. U-Net [https://arxiv.org/pdf/1505.04597.pdf]
  2. SegNet [https://arxiv.org/pdf/1511.00561.pdf]
  3. DeepLab [https://arxiv.org/pdf/1606.00915.pdf]
  4. FCN [https://arxiv.org/pdf/1605.06211.pdf]
  5. ENet [https://arxiv.org/pdf/1606.02147.pdf]
  6. LinkNet [https://arxiv.org/pdf/1707.03718.pdf]
  7. DenseNet [https://arxiv.org/pdf/1608.06993.pdf]
  8. Tiramisu [https://arxiv.org/pdf/1611.09326.pdf]
  9. DilatedNet [https://arxiv.org/pdf/1511.07122.pdf]
  10. PixelNet [https://arxiv.org/pdf/1609.06694.pdf]
  11. ICNet [https://arxiv.org/pdf/1704.08545.pdf]
  12. ERFNet [http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17iv.pdf]
  13. RefineNet [https://arxiv.org/pdf/1611.06612.pdf]
  14. PSPNet [https://arxiv.org/pdf/1612.01105.pdf]
  15. CRFasRNN [http://www.robots.ox.ac.uk/%7Eszheng/papers/CRFasRNN.pdf]
  16. Dilated convolution [https://arxiv.org/pdf/1511.07122.pdf]
  17. DeconvNet [https://arxiv.org/pdf/1505.04366.pdf]
  18. FRRN [https://arxiv.org/pdf/1611.08323.pdf]
  19. GCN [https://arxiv.org/pdf/1703.02719.pdf]
  20. DUC, HDC [https://arxiv.org/pdf/1702.08502.pdf]
  21. Segaware [https://arxiv.org/pdf/1708.04607.pdf]
  22. Semantic Segmentation using Adversarial Networks [https://arxiv.org/pdf/1611.08408.pdf]

综述

  1. A Review on Deep Learning Techniques Applied to Semantic Segmentation Alberto Garcia-Garcia, Sergio Orts-Escolano, Sergiu Oprea, Victor Villena-Martinez, Jose Garcia-Rodriguez 2017
  2. Computer Vision for Autonomous Vehicles: Problems, Datasets and State-of-the-Art
  3. 基于内容的图像分割方法综述 姜 枫 顾 庆 郝慧珍 李 娜 郭延文 陈道蓄 2017

Tutorial

  1. Semantic Image Segmentation with Deep Learning
  2. A 2017 Guide to Semantic Segmentation with Deep Learning
  3. Image Segmentation with Tensorflow using CNNs and Conditional Random Fields

视频教程

  1. CS231n: Convolutional Neural Networks for Visual Recognition Lecture 11 Detection and Segmentation 
  2. Machine Learning for Semantic Segmentation - Basics of Modern Image Analysis

代码

Semantic segmentation

  1. U-Net (https://arxiv.org/pdf/1505.04597.pdf)
  2. SegNet (https://arxiv.org/pdf/1511.00561.pdf)
  3. DeepLab (https://arxiv.org/pdf/1606.00915.pdf)
  4. FCN (https://arxiv.org/pdf/1605.06211.pdf)
  5. ENet (https://arxiv.org/pdf/1606.02147.pdf)
  6. LinkNet (https://arxiv.org/pdf/1707.03718.pdf)
  7. DenseNet (https://arxiv.org/pdf/1608.06993.pdf)
  8. Tiramisu (https://arxiv.org/pdf/1611.09326.pdf)
  9. DilatedNet (https://arxiv.org/pdf/1511.07122.pdf)
  10. PixelNet (https://arxiv.org/pdf/1609.06694.pdf)
  11. ICNet (https://arxiv.org/pdf/1704.08545.pdf)
  12. ERFNet (http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17iv.pdf)
  13. RefineNet (https://arxiv.org/pdf/1611.06612.pdf)
  14. PSPNet (https://arxiv.org/pdf/1612.01105.pdf)
  15. CRFasRNN (http://www.robots.ox.ac.uk/%7Eszheng/papers/CRFasRNN.pdf)
  16. Dilated convolution (https://arxiv.org/pdf/1511.07122.pdf)
  17. DeconvNet (https://arxiv.org/pdf/1505.04366.pdf)
  18. FRRN (https://arxiv.org/pdf/1611.08323.pdf)
  19. GCN (https://arxiv.org/pdf/1703.02719.pdf)
  20. DUC, HDC (https://arxiv.org/pdf/1702.08502.pdf)
  21. Segaware (https://arxiv.org/pdf/1708.04607.pdf)
  22. Semantic Segmentation using Adversarial Networks (https://arxiv.org/pdf/1611.08408.pdf)

Instance aware segmentation

  1. FCIS [https://arxiv.org/pdf/1611.07709.pdf]
  2. MNC [https://arxiv.org/pdf/1512.04412.pdf]
  3. DeepMask [https://arxiv.org/pdf/1506.06204.pdf]
  4. SharpMask [https://arxiv.org/pdf/1603.08695.pdf]
  5. Mask-RCNN [https://arxiv.org/pdf/1703.06870.pdf]
  6. RIS [https://arxiv.org/pdf/1511.08250.pdf]
  7. FastMask [https://arxiv.org/pdf/1612.08843.pdf]

Satellite images segmentation

Video segmentation

Autonomous driving

Annotation Tools:

Datasets

  1. Stanford Background Dataset[http://dags.stanford.edu/projects/scenedataset.html]
    1. Sift Flow Dataset[http://people.csail.mit.edu/celiu/SIFTflow/]
    2. Barcelona Dataset[http://www.cs.unc.edu/~jtighe/Papers/ECCV10/]
    3. Microsoft COCO dataset[http://mscoco.org/]
    4. MSRC Dataset[http://research.microsoft.com/en-us/projects/objectclassrecognition/]
    5. LITS Liver Tumor Segmentation Dataset[https://competitions.codalab.org/competitions/15595]
    6. KITTI[http://www.cvlibs.net/datasets/kitti/eval_road.php]
    7. Stanford background dataset[http://dags.stanford.edu/projects/scenedataset.html]
    8. Data from Games dataset[https://download.visinf.tu-darmstadt.de/data/from_games/]
    9. Human parsing dataset[https://github.com/lemondan/HumanParsing-Dataset]
    10. Silenko person database[https://github.com/Maxfashko/CamVid]
    11. Mapillary Vistas Dataset[https://www.mapillary.com/dataset/vistas]
    12. Microsoft AirSim[https://github.com/Microsoft/AirSim]
    13. MIT Scene Parsing Benchmark[http://sceneparsing.csail.mit.edu/]
    14. COCO 2017 Stuff Segmentation Challenge[http://cocodataset.org/#stuff-challenge2017]
    15. ADE20K Dataset[http://groups.csail.mit.edu/vision/datasets/ADE20K/]
    16. INRIA Annotations for Graz-02[http://lear.inrialpes.fr/people/marszalek/data/ig02/]

比赛

  1. MSRC-21 [http://rodrigob.github.io/are_we_there_yet/build/semantic_labeling_datasets_results.html]
  2. Cityscapes [https://www.cityscapes-dataset.com/benchmarks/]
  3. VOC2012 [http://host.robots.ox.ac.uk:8080/leaderboard/displaylb.php?challengeid=11&compid=6]

领域专家

  1. Jonathan Long
  2. Liang-Chieh Chen
  3. Hyeonwoo Noh
  4. Bharath Hariharan
  5. Fisher Yu
  6. Vijay Badrinarayanan
  7. Guosheng Lin