精選文章,第一時間送達
好久沒有更新語義分割系列的文章了,但是大家放心,我會持續更新的,話不多說,這期就講解基於MobileNet的SegNet語義分割實現斑馬線的劃分~
還沒有看過的fans,可以先看一下哦~
前言:
語義分割基礎模型結構圖如下,也就是Convolutional Enconder-Decoder的結構,也就是卷積層編碼Enconder與解碼Deconder的過程。
編碼Encoder的過程就是對我們Input的圖片通過特徵提取網絡不斷進行特徵提取,這個過程中圖片的長和寬不斷的進行壓縮,通道也會變得越來越大。
解碼Decoder的過程就是對特徵提取網絡最終提取到的特徵層進行長和寬的不斷的放大,放大到和原圖差不多的尺寸。
然後再對每一個像素點進行分類,最終我們得到每個像素點所屬的類是什麼, 如下圖所示:
總結:輸入圖片—>編碼Enconder(特徵提取網絡提取特徵)—> Deconder(將提取到的特徵放大)—>對像素點進行分類。
SegNet語義分割模型
模型實現流程圖:
在結構圖中,輸入一張圖片在Enconder中進行卷積特徵提取到f4層時(圖片的寬和高壓縮了4次之後的特徵層),我們對該特徵層進行Deconder處理。
Deconder主要是對提取到的f4有效特徵層進行上採樣Upsampling2D進行3次上採樣(圖片的寬高放大)處理,最後我們得到一個具有一定寬w和高h的通道數為filter=n_classes的特徵層,最後一個卷積Conv2D, filter設置為n_classes是因為filter代表的是每個像素點所屬的種類的類別總數。
總結:首先利用主幹特徵提取網絡MobileNet(下採樣)提取圖像的特徵,得到5個不同大小的有效的特徵層,然後Segnet對特徵層解碼(一系列的上採樣upSampling2D),利用softmax函數對每個像素點進行分類,最後保存整個模型。
MobileNet模型原理講解:
訓練自己的語義分割模型
使用主幹特徵提取網絡為MobileNet的SegNet語義分割模型實現劃分斑馬線。
數據集:斑馬線數據集
訓練圖片:
訓練標籤:
單獨拿圖片4.jpg的標籤,我們可以看到4.jpg對應的標籤4.png像素值僅由000和111組成,原圖斑馬線部分對應的標籤像素值為111,而其它部分的像素值為000,分別對應RGB三通道。
對於語義分割數據集來講,它的標籤的每一個像素點的值就代表了它所屬的種類,在本項目中分兩類:背景和斑馬線,背景區域所對應的像素值為000,而斑馬線區域對應的像素值為111。
如果是多分類,那麼還會存在222、333這樣的RGB值的像素點,像素點的不同像素值代表該像素點屬於不同的類別。
項目結構
dataset2裡面的jpg文件夾存放的是我們數據集中對應的原圖,而png文件夾存放的是我們原圖所對應的標籤,而train.txt裡面存儲的原圖和其標籤的對應關係。
模型代碼實現流程:
主幹特徵提取網絡MobileNet:提取圖片特徵,獲取5個不同大小的有效的特徵層,詳情請見 mobilenet.py 文件。
SegNet解碼網絡,對特徵層進行解碼(一系列的上採樣upSampling2D),詳情請見segnet.py。
最後利用softmax函數對每個像素點進行分類,最後保存整個模型。
模型訓練
訓練50個epoch,訓練文件詳情見train.py,訓練後保存訓練權重。
使用到的損失函數是交叉熵損失函數,y_true代表真實標籤,y_pred代表的是預測標籤,實際上就是比較預測的標籤和真實標籤的像素值(代表類別)之間的交叉熵,優化器使用的是Adam。
訓練結果:
模型預測:
四、代碼下載和環境設置
環境
python==3.6
tensorflow-gpu==1.13.1
keras==2.1.5