分割分類
-
普通分割
將不同類別物體的像素區域分開。
如前景與后景分割開,狗的區域與貓的區域、背景分割開。 -
語義分割
在普通分割的基礎上,分類出每一塊區域的語義(即這塊區域是什么物體)。
如把畫面中的所有物體都指出它們各自的類別。 -
實例分割
在語義分割的基礎上,給每個物體編號。
如這個是該畫面中的狗A,那個是畫面中的狗B。
當下現狀
最初,圖像塊分類是最常用的方法,就是根據圖像像素點周圍的圖像塊確定每個像素的類別CNN極大的提高了圖像分割的精度。FCN的出現改變了這個現狀,也把分割任務提升到新的階段。現在幾乎所有的語義分割都是在這個結構上改來改去的。
主要的套路如下:
- encoder-decoder結構。
- 多尺度的特征融合,空洞卷積,不同級別的上采樣。
- 條件隨機場(Conditional Random Field,CRF)進行后期處理
FCN
FCN是深度學習用於語義分割的鼻祖了。
FullyConvolutional Networks forSemantic Segmentation 是 UC Berkeley提出來的,也是 2015 年CVPR的best paper 。2014年11月發表在arXiv上。
FCN的主要思想如下圖所說:
將原本的分類模型(AlexNet)的最后的全連接層,轉化成全卷積,不在輸出分類特征,而是一個熱圖(heatmap)。
下面FCN更詳細的信息:
-
FCN-32s
在模型最后conv 7的特征圖上,進行步長為32的,上采樣,還原到原始圖片大小。
-
FCN-16s
在pool 4 層后,加上一個1x1的卷積層,產生一個支路輸出特征圖A。
對conv 7的輸出進行步長為 2的上采樣,得到特征圖B。
這時候A和B大小一樣,進行特征融合,然后進行步長為16的上采樣,還原到原始圖片大小。
-
FCN-8s
在pool 3 層后,加上一個1x1的卷積層,產生一個支路輸出特征圖A。
在pool 4 層后,加上一個1x1的卷積層,輸出進行步長為 2的上采樣,產生一個支路輸出特征圖B。
對conv 7 的輸出進行步長為 4 的上采樣,得到特征圖C。
這時候A、B、C大小一樣,進行特征融合,然后進行步長為8的上采樣,還原到原始圖片大小。
關於上面所說的上采樣:
上采樣本質是插值。FCN中上采樣的方法是反卷積(Deconvolution)。Caffe和Kera里叫Deconvolution,而tensorflow 里叫 conv_transpose。論文中,作者說反卷積的卷積核是可以學習的,但是代碼中並沒有學習,lr_mult: 0
。和網絡前面卷積層不同,deconvolution 中卷積核個數不是隨機的,而是根據放大的尺寸生成了與類別相同數量的矩陣。
論文中采用的上采樣是雙線性內插,通過卷積操作完成的。先上池化,然后卷積。如下圖:(藍色是輸入,藍綠色是輸出)
DeconvNet
是韓國的Hyeonwoo Noh 在 ICCV 2015 的文章。2015年5月17日發表在arXiv上的文章。Learning Deconvolution Network for Semantic Segmentation是對FCN的改進。
DeconvNet 的結構是經典encoder-decoder結構。相比於FCN有點混亂的結構,這種對稱的結構就顯得很優雅。如下圖:
前面的encoder部分是VGG-16去掉分類部分的前13個卷積層,末尾是2個全連接層。Decoder部分是對稱的反卷積層。
有兩點比較獨特:
- 在 pooling 處理的過程中會記錄最大值位置,unpooling 的時候會把相應的值放回到原來位置。
- 作者強調他們的反卷積網絡權重是學習的。
SegNet
SegNet: A Deep Convolutional Encoder-Decoder Architecture for Robust Semantic Pixel-Wise Labelling
這是和DeconvNet 同期的模型,是Vijay Badrinarayanan在2015年5月27日(僅僅相差10天)發表在arXiv上的。
結構和DeconvNet十分相似,給人一種撞衫的感覺。(可見科研的激烈程度,23333)
相同的兩點:
-
都是經典encoder-decoder結構,encoder部分都是根據VGG-16來的。
-
pooling 過程都記錄了位置信息,upsampling 的時候使用位置信息。如下圖:
不同點:
- 仔細看,SegNet在encoder-decoder中間沒有deconvNet的兩個全連接層。
- SegNet 在卷積層上加了BN結構。
知乎上有網友的評價:
segnet去掉了全連接層從而提升了速度,加了batch normalization加快了收斂抑制了過擬合,加了bayesion可以輸出圖像的不確定性分割數值,加了test batch dropout提升測試時的性能,加了帶權重softmax應對分割樣本不均衡現象。可以說,segnet是更實用的框架。
Tensorflow 目前還不支持在池化的時候保留索引,這就很尷尬了。所以上面兩個都只有caffe的代碼。有人重現了Tensorflow版本的SegNet,不是還是和原始的有些不同。有cpu版本的可用,會比較慢。
Deeplab
DeepLab 是 Google 在這個領域一系列的工作。
-
DeepLabv1:
- 2015-04-09 發表在arXiv上
- ICLR 2015
- DeepLabv1: Semantic image segmentation with deep convolutional nets and fully connected CRFs
具體的細節:
- Deeplab v1是在vgg-16的基礎上做了修改。
- 將vgg16的全連接層轉為卷積
- 移除原網絡最后兩個池化層,使用rate=2 的空洞卷積采樣
- 是在ImageNet上預訓練的vgg16權重上做 finetune
-
DeepLabv2:
- 2017-05-12 發表在arXiv上
- TPAMI2017
- DeepLabv2:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
Deeplab v2 的具體細節:
- 用多尺度獲得更好的分割效果(用ASPP)
- 提取特征的基礎CNN改為ResNet
- 使用不同的學習策略
-
DeepLabv3
- 2017-12-05 發表在arXiv上
- DeepLabv3:Rethinking Atrous Convolution for Semantic Image Segmentation
具體細節:
- 這是一種更加通用的框架
- 級聯了多個ResNet中的block單元
- 在ASPP中加入了BN層
- 去掉了CRF
參考鏈接
https://blog.csdn.net/JNingWei/article/details/73610318
https://github.com/vdumoulin/conv_arithmetic
https://www.zhihu.com/question/50349594
http://app.myzaker.com/news/article.php?pk=59633978d1f1499a4a000016