什麼是圖像語義分割?html
圖像語意分割顧名思義是將圖像像素按照表達的語義含義的不一樣進行分組/分割,圖像語義是指對圖像內容的理解,例如,可以描繪出什麼物體在哪裏作了什麼事情等,分割是指對圖片中的每一個像素點進行標註,標註屬於哪一類別。近年來用在無人車駕駛技術中分割街景來避讓行人和車輛、醫療影像分析中輔助診斷等。python
今天,咱們介紹在圖像語義分割任務中,如何基於圖像級聯網絡(Image Cascade Network,ICNet)進行語義分割,相比其餘分割算法,ICNet兼顧了準確率和速度。git
PaddlePaddle已經將ICNet應用於工業領域,將零件質檢工人從高強度、低效率的密集勞動中解放出來,有效提高企業經營效率。github
圖像語義分割模型ICNet的實現方法算法
下面向你們介紹ICNet的實現(轉自PaddlePaddle Github):網絡
運行程序示例須要使用PaddlePaddle develop最新版本。若是您的PaddlePaddle安裝版本低於此要求,請按照PaddlePaddle官方文檔更新安裝版本。ide
PaddlePaddle官方文檔:函數
http://paddlepaddle.org/documentation/docs/zh/1.2/beginners_guide/index.html 工具
代碼結構測試
├── network.py # 網絡結構定義腳本 ├── train.py # 訓練任務腳本 ├── eval.py # 評估腳本 ├── infer.py # 預測腳本 ├── cityscape.py # 數據預處理腳本 └── utils.py # 定義通用的函數
Image Cascade Network(ICNet)主要用於圖像實時語義分割。相較於其它壓縮計算的方法,ICNet即考慮了速度,也考慮了準確性。 ICNet的主要思想是將輸入圖像變換爲不一樣的分辨率,而後用不一樣計算複雜度的子網絡計算不一樣分辨率的輸入,而後將結果合併。ICNet由三個子網絡組成,計算複雜度高的網絡處理低分辨率輸入,計算複雜度低的網絡處理分辨率高的網絡,經過這種方式在高分辨率圖像的準確性和低複雜度網絡的效率之間得到平衡。
整個網絡結構以下:
本文采用Cityscape數據集,請前往Cityscape官網註冊下載:
https://www.cityscapes-dataset.com/
下載數據以後,按照這裏的說明和工具處理數據:
https://github.com/mcordts/cityscapesScripts/blob/master/cityscapesscripts/preparation/createTrainIdLabelImgs.py#L3
處理以後的數據
data/cityscape/ |-- gtFine | |-- test | |-- train | `-- val |-- leftImg8bit | |-- test | |-- train | `-- val |-- train.list `-- val.list
其中,train.list和val.list分別是用於訓練和測試的列表文件,第一列爲輸入圖像數據,第二列爲標註數據,兩列用空格分開。示例以下:
leftImg8bit/train/stuttgart/stuttgart_000021_000019_leftImg8bit.png gtFine/train/stuttgart/stuttgart_000021_000019_gtFine_labelTrainIds.png leftImg8bit/train/stuttgart/stuttgart_000072_000019_leftImg8bit.png gtFine/train/stuttgart/stuttgart_000072_000019_gtFine_labelTrainIds.png
完成數據下載和準備後,須要修改cityscape.py
腳本中對應的數據地址。
執行如下命令進行訓練,同時指定checkpoint保存路徑:
python train.py --batch_size=16 --use_gpu=True --checkpoint_path="./chkpnt/"
使用如下命令得到更多使用說明:
python train.py --help
訓練過程當中會根據用戶的設置,輸出訓練集上每一個網絡分支的loss
, 示例以下:
Iter[0]; train loss: 2.338; sub4_loss: 3.367; sub24_loss: 4.120; sub124_loss: 0.151
執行如下命令在Cityscape
測試數據集上進行測試:
python eval.py --model_path="./model/" --use_gpu=True
須要經過選項--model_path
指定模型文件。 測試腳本的輸出的評估指標爲mean IoU。
執行如下命令對指定的數據進行預測:
python infer.py \ --model_path="./model" \ --images_path="./data/cityscape/" \ --images_list="./data/cityscape/infer.list"
經過選項--images_list
指定列表文件,列表文件中每一行爲一個要預測的圖片的路徑。 預測結果默認保存到當前路徑下的output
文件夾下。
圖2爲在CityScape
訓練集上的訓練的Loss曲線:
在訓練集上訓練,在validation數據集上驗證的結果爲:mean_IoU=67.0%(論文67.7%)
圖3是使用infer.py
腳本預測產生的結果示例,其中,第一行爲輸入的原始圖片,第二行爲人工的標註,第三行爲咱們模型計算的結果。
ICNet for Real-Time Semantic Segmentation on High-Resolution Images:
https://arxiv.org/abs/1704.08545
訪問Github瞭解更多:
https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleCV/icnet