語義分割(semantic segmentation) 經常使用神經網絡介紹對比-FCN SegNet U-net DeconvNet,語義分割,簡單來講就是給定一張圖片,對圖片中的每個像素點進行...

from:https://blog.csdn.net/u012931582/article/details/70314859

前言

在這裏,先介紹幾個概念,也是圖像處理當中的最多見任務.php

  • 語義分割(semantic segmentation)
  • 目標檢測(object detection)
  • 目標識別(object recognition)
  • 實例分割(instance segmentation)

語義分割

首先須要瞭解一下什麼是語義分割(semantic segmentation).git

語義分割,簡單來講就是給定一張圖片,對圖片中的每個像素點進行分類github

好比說下圖,原始圖片是一張街景圖片,通過語義分割以後的圖片就是一個包含若干種顏色的圖片,其中每一種顏色都表明一類.bootstrap



圖像語義分割是AI領域中一個重要的分支,是機器視覺技術中關於圖像理解的重要一環. 數組

有幾個比較容易混淆的概念,分別是目標檢測(object detection),目標識別(object recognition),實例分割(instance segmentation),下面來一一介紹.markdown

目標檢測

目標檢測,就是在一張圖片中找到並用box標註出全部的目標.網絡

注意,目標檢測和目標識別不一樣之處在於,目標檢測只有兩類,目標和非目標.測試

以下圖所示:flex



目標識別

目標識別,就是檢測和用box標註出全部的物體,並標註類別.網站

以下圖所示:



實例分割

實例分割,對圖像中的每個像素點進行分類,同種物體的不一樣實例也用不一樣的類標進行標註.

下圖展現了語義分割和實例分割之間的區別:

中間是實例分割,右圖是語義分割.



PASCAL VOC

PASCAL VOC是一個正在進行的,目標檢測,目標識別,語義分割的挑戰.

這裏是它的主頁,這裏是leader board,不少公司和團隊都參與了這個挑戰,不少經典論文都是採用這個挑戰的數據集和結果發表論文,包括RCNN,FCN等.

關於這個挑戰,有興趣的同窗能夠讀一下這篇論文

FCN

FCN,全卷積神經網絡,是目前作語義分割的最經常使用的網絡.

Fully convolutional networks for semantic segmentation 是2015年發表在CVPR上的一片論文,提出了全卷積神經網絡的概念,差點得了當前的最佳論文,沒有評上的緣由好像是有人質疑,全卷積並非一個新的概念,由於全鏈接層也能夠看做是卷積層,只不過卷積核是原圖大小而已.

FCN與CNN

在通常的卷積神經網絡中,通常結構都是前幾層是卷積層加池化,最後跟2-3層的全鏈接層,輸出分類結果,以下圖所示:



這個結構就是AlexNet的結構,用來進行ImageNet中的圖片分類,最後一層是一個輸出爲1000*1向量的全鏈接層,由於一共有1000個類,向量中的每一維都表明了當前類的機率,其中tabby cat的機率是最大的.

而在全卷積神經網絡中,沒有了全鏈接層,取而代之的是卷積層,以下圖所示:



最後一層輸出的是1000個二維數組,其中每個數組能夠可視化成爲一張圖像,圖中的每個像素點的灰度值都是表明當前像素點屬於該類的機率,好比在這1000張圖像中,取出其中表明tabby cat的機率圖,顏色從藍到紅,表明當前點屬於該類的機率就越大.

能夠看出FCN與CNN之間的區別就是把最後幾層的全鏈接層換成了卷積層,這樣作的好處就是可以進行dense prediction.

從而但是實現FCN對圖像進行像素級的分類,從而解決了語義級別的圖像分割(semantic segmentation)問題。與經典的CNN在卷積層以後使用全鏈接層獲得固定長度的特徵向量進行分類(全聯接層+softmax輸出)不一樣,FCN能夠接受任意尺寸的輸入圖像,採用反捲積層對最後一個卷積層的feature map進行上採樣, 使它恢復到輸入圖像相同的尺寸,從而能夠對每一個像素都產生了一個預測, 同時保留了原始輸入圖像中的空間信息, 最後在上採樣的特徵圖上進行逐像素分類。



FCN語義分割

在進行語義分割的時候,須要解決的一個重要問題就是,如何把定位和分類這兩個問題結合起來,畢竟語義分割就是進行逐個像素點的分類,就是把where和what兩個問題結合在了一塊兒進行解決.

在前面幾層卷積層,分辨率比較高,像素點的定位比較準確,後面幾層卷積層,分辨率比較低,像素點的分類比較準確,因此爲了更加準確的分割,須要把前面高分辨率的特徵和後面的低分辨率特徵結合起來.



如上圖所示,對原圖像進行卷積conv一、pool1後原圖像縮小爲1/2;以後對圖像進行第二次conv二、pool2後圖像縮小爲1/4;接着繼續對圖像進行第三次卷積操做conv三、pool3縮小爲原圖像的1/8,此時保留pool3的featureMap;接着繼續對圖像進行第四次卷積操做conv四、pool4,縮小爲原圖像的1/16,保留pool4的featureMap;最後對圖像進行第五次卷積操做conv五、pool5,縮小爲原圖像的1/32,而後把原來CNN操做中的全鏈接變成卷積操做conv六、conv7,圖像的featureMap數量改變可是圖像大小依然爲原圖的1/32,此時進行32倍的上採樣能夠獲得原圖大小,這個時候獲得的結果就是叫作FCN-32s.

這個時候能夠看出,FCN-32s結果明顯很是平滑,不精細. 針對這個問題,做者採用了combining what and where的方法,具體來講,就是在FCN-32s的基礎上進行fine tuning,把pool4層和conv7的2倍上採樣結果相加以後進行一個16倍的上採樣,獲得的結果是FCN-16s.

以後在FCN-16s的基礎上進行fine tuning,把pool3層和2倍上採樣的pool4層和4倍上採樣的conv7層加起來,進行一個8倍的上採樣,獲得的結果就是FCN-8s.

能夠看出結果明顯是FCN-8s好於16s,好於32s的.



上圖從左至右分別是原圖,FCN-32s,FCN-16s,FCN-8s.

FCN的優勢,可以end-to-end, pixels-to-pixels,並且相比於傳統的基於cnn作分割的網絡更加高效,由於避免了因爲使用像素塊而帶來的重複存儲和計算卷積的問題。

FCN的缺點也很明顯,首先是訓練比較麻煩,須要訓練三次纔可以獲得FCN-8s,並且獲得的結果仍是不精細,對圖像的細節不夠敏感,這是由於在進行decode,也就是恢復原圖像大小的過程時,輸入上採樣層的label map太稀疏,並且上採樣過程就是一個簡單的deconvolution.
其次是對各個像素進行分類,沒有考慮到像素之間的關係.忽略了在一般的基於像素分類的分割方法中使用的空間規整步驟,缺少空間一致性.

U-net

U-net 是基於FCN的一個語義分割網絡,適合用來作醫學圖像的分割.

下面是U-net 的結構圖:



結構比較清晰,也很優雅,成一個U狀.

和FCN相比,結構上比較大的改動在上採樣階段,上採樣層也包括了不少層的特徵.

還有一個比FCN好的地方在於,Unet只須要一次訓練,FCN須要三次訓練.

我實現了unet的網絡結構,代碼在: https://github.com/zhixuhao/unet,
是用keras實現的,關於數據集和訓練測試,能夠參考我這一篇博文: http://blog.csdn.net/u012931582/article/details/70215756

SegNet

SegNet 是一個encoder-decoder結構的卷積神經網絡.

這裏是官方網站:http://mi.eng.cam.ac.uk/projects/segnet/

SegNet 的結構以下所示:



能夠看出,整個結構就是一個encoder和一個decoder.前面的encoder就是採用的vgg-16的網絡結構,而decoder和encoder基本上就是對稱的結構.

SegNet和FCN最大的不一樣就在於decoder的upsampling方法,上圖結構中,注意,前面encoder每個pooling層都把pooling indices保存,而且傳遞到後面對稱的upsampling層. 進行upsampling的過程具體以下:



左邊是SegNet的upsampling過程,就是把feature map的值 abcd, 經過以前保存的max-pooling的座標映射到新的feature map中,其餘的位置置零.

右邊是FCN的upsampling過程,就是把feature map, abcd進行一個反捲積,獲得的新的feature map和以前對應的encoder feature map 相加.

實驗

文章中說,他們用了CamVid 這個數據集進行了一下,這個數據集主要是街景圖片,總共有11個類,367張訓練圖片,233張測試圖片,是一個比較小的數據集.

下圖是分割結果的對比:



DeconvNet

DeconvNet 是一個convolution-deconvolution結構的神經網絡,和SegNet很是類似

是一篇2015年ICCV上的文章: Learning Deconvolution Network for Semantic Segmentation

下面是它的結構圖:



前面的convolution network 和SegNet的encoder部分是同樣的,都是採用了VGG16的結構,只不過DeconvNet後面添加了兩個全鏈接層.

在進行upsampling的時候,SegNet和DeconvNet基本上是一致的,都是進行了unpooling,就是須要根據以前pooling時的位置把feature map的值映射到新的feature map上,unpooling 以後須要接一個反捲積層.

總結

能夠看出,這些網絡的結構都是很是類似的,都是基於encoder-decoder結構的,只不過說法不一樣,前面是一些卷積層,加上池化層,後面的decoder其實就是進行upsampling,這些網絡的最主要區別就是upsampling的不一樣.

FCN進行upsampling的方法就是對feature map進行反捲積,而後和高分辨率層的feature map相加.

Unet進行upsampling的方法和FCN同樣.

DeconvNet進行upsampling的方法就是進行unpooling,就是須要根據以前pooling時的位置把feature map的值映射到新的feature map上,unpooling 以後須要接一個反捲積層.

SegNet進行upsampling的方法和DeconvNet同樣.

相關文章
相關標籤/搜索