Unet圖像分割在大多的開源項目中都是針對于二分類然遏,理論來說,對于多分類問題取刃,依舊可行蹋肮。可小編嘗試過很多的方法在原有的開源代碼進行多分類璧疗,分割的效果都不盡如意坯辩。最后下定決心自行修改網(wǎng)絡(luò),修改后的代碼開源在github上(文末有鏈接)崩侠,歡迎star漆魔。最終分割效果根據(jù)自己項目達到了要求,所以有需要的小伙伴可以嘗試我們的方法却音。
Unet介紹
U-net前半部分作用是特征提取改抡,后半部分是上采樣。在一些文獻中也把這樣的結(jié)構(gòu)叫做編碼器-解碼器結(jié)構(gòu)系瓢。由于此網(wǎng)絡(luò)整體結(jié)構(gòu)類似于大寫的英文字母U阿纤,故得名U-net。
U-net與其他常見的分割網(wǎng)絡(luò)有一點非常不同的地方:U-net采用了完全不同的特征融合方式:拼接夷陋,U-net采用將特征在channel維度拼接在一起阵赠,形成更厚的特征。而FCN融合時使用的對應點相加肌稻,并不形成更厚的特征清蚀。
所以語義分割網(wǎng)絡(luò)在特征融合時有兩種辦法:
- FCN式的對應點相加,對應于TensorFlow中的tf.add()函數(shù)爹谭;
- U-net式的channel維度拼接融合枷邪,對應于TensorFlow的tf.concat()函數(shù),比較占顯存诺凡。
除了上述新穎的特征融合方式东揣,U-net還有以下幾個優(yōu)點:
1、5個pooling layer實現(xiàn)了網(wǎng)絡(luò)對圖像特征的多尺度特征識別腹泌。
2嘶卧、上采樣部分會融合特征提取部分的輸出,這樣做實際上是將多尺度特征融合在了一起凉袱,以最后一個上采樣為例芥吟,它的特征既來自第一個卷積block的輸出(同尺度特征)侦铜,也來自上采樣的輸出(大尺度特征),這樣的連接是貫穿整個網(wǎng)絡(luò)的钟鸵,你可以看到上圖的網(wǎng)絡(luò)中有四次融合過程钉稍,相對應的FCN網(wǎng)絡(luò)只在最后一層進行融合。
Unet訓練自己的數(shù)據(jù)
整個模型訓練過程如下圖所示:
一棺耍、Labelme制作標簽
Labelme軟件安裝借鑒https://www.cnblogs.com/wangxiaocvpr/p/9997690.html贡未,安裝完成,打開圖片后蒙袍,界面如下:
點Edit->creat Polygons俊卤,然后繪制mask。Ctrl+S保存為JOSN文件害幅,然后在目錄下使用Prompt
輸入labelme_json_to_dataset <文件名>.json瘾蛋,然后會在目錄下產(chǎn)生一個文件夾,內(nèi)容如下:
完成所有的標簽工作后矫限,將img和label文件各放一個文件夾哺哼。
二、Unet網(wǎng)絡(luò)調(diào)參
網(wǎng)絡(luò)調(diào)參涉及以下幾個方面:
(1)加入BN層
(2)將最后一層激活函數(shù)替換成ReLU
(3)損失函數(shù)替換成mse
多分類一般最后一層原本是softmax叼风,使用了這個激活函數(shù)跑完后取董,沒有達到分割效果,所以替換成了之前做過的圖對圖項目激活函數(shù)无宿,效果就出來了茵汰,純屬經(jīng)驗之談,理論還沒有進行驗證孽鸡。多分類的損失函數(shù)多是交叉熵蹂午,經(jīng)過驗證也是不能達到效果,替換成均方根誤差彬碱。
三豆胸、訓練與測試
此處可以參考開源代碼https://github.com/haixiansheng/unet-keras-for-Multi-classification
項目中,訓練測試單獨分開巷疼,訓練和測試數(shù)據(jù)以及標簽都單獨設(shè)立文件夾晚胡。以便于進行數(shù)據(jù)處理。
四嚼沿、測試結(jié)果展示
項目要求分割出底座和膠水
五、總結(jié)
訓練效果以及測試效果由于項目還沒有完成骡尽,不便于展示遣妥,總體測試效果誤差估計不到30像素。有意向的可以嘗試用我們的網(wǎng)絡(luò)進行分割實驗攀细。有所幫助的話記得關(guān)注公眾號和star github項目箫踩。