前言
本文先介紹VOC2012數據集,然後再基於GitHub上的一個開源項目對VOC2012數據集訓練出一個FCN算法模型。
VOC2012數據集
VOC2012基本數據集分爲兩個部分:Train/Validation和Test。 前者大概1.9GB,後者大約1.8GB。大家可以自行去網上搜索並下載。我們這裏主要講第一個部分,其對應的包爲:VOCtrainval_11-May-2012.tar。
解壓縮該包後,其子目錄如下所示:
Annotations是目標檢測的標註xml文件,ImageSets裏面有目標檢測和分割分別對應的train.txt, trainval以及val.txt, 因爲另外一個目錄JPEGImages裏面的樣本圖片很多,大約17128張,但實際上訓練和驗證的樣本圖片可以通過train.txt(1464張), val.txt(1449)來指定。SegmentationClass和SegmentationObject分別是語義分割和實例分割的標註結果圖片,後綴名是png。
FCN模型訓練
我在github上找了這麼一個開源項目 https://github.com/overfitover/fcn_pytorch 來使用pytorch框架對VOC2012數據集進行FCN算法模型的訓練和驗證。選擇它的理由是,訓練,驗證以及推理測試命令都非常簡單,如下所示。
當然,具體運行時會遇到一些問題,這裏列幾點如下:
訓練時主要注意三個問題:
1)訓練樣本圖片(VOCdevkit)所在的路徑要在train.py中相應修改。
2)要事先下載預訓練模型:https://download.pytorch.org/models/vgg16-397923af.pth
3)"loss.data[0]"要改成 "loss.item()",前者是torch0.4以前的語法,後者是0.4以後的規範。而本人安裝的torch版本是1.1.0。
推理並顯示結果時,即 python3 predict.py,會遇到下面問題
1)首先也是VOC數據集樣本圖片所在路徑的修改。
2)要將volatile的用法去掉,這個也是torch版本升級的緣故, 即將 “img = Variable(img.unsqueeze(0), volatile=True)” 修改成
"with torch.no_grad()"。