1. 程式人生 > >使用自己的資料訓練 Faster R-CNN 的 VGG-16 模型

使用自己的資料訓練 Faster R-CNN 的 VGG-16 模型

最近在學習 Faster R-CNN 模型,為了瞭解其中網路的結構,利用 PascalVOC 資料集,來擴充套件網路的類別(原來有 20 類)。過程分為:資料準備 ==> 相關檔案修改 ==> 訓練網路 ==> 測試

一、資料準備

(一)下載資料集:

官網資料集映象:https://pjreddie.com/projects/pascal-voc-dataset-mirror/
Pascal VOC 資料集中有訓練時需要的圖片、對應的標註檔案(xml)和指定正負樣本的文字檔案(txt),分別放在 VOC2007 或 VOC2012 目錄中的 JPEGImage、Annotations 和 ImageSets 的 Main 目錄中。

(二)資料標註:

本次訓練的目的是在原有 20 類的基礎上,擴充套件 3 類,分別是 cup、window、glasses
標註工具使用 LabelImage :github下載地址
需要安全 PyQt 和其他相關依賴項才能執行。
下載完後執行 LabelImage.py 檔案即可,介面如下:

Open Dir” 指定檔案的路徑;“Change Save Dir” 指定儲存的 xlm 檔案路徑。
預設常用快捷鍵為:“w” 為畫框,“a” 為上一張圖片,“d” 為下一張圖片,“ctrl + s” 為儲存 xml 檔案。
如果想要修改快捷鍵,可以開啟 LabelImage.py 檔案,在以下程式碼中(大概在213到276行)修改:

<span style="color:#000000"><code class="language-python"><code class="language-python"><span style="color:#969896">.</span><span style="color:#969896">.</span><span style="color:#969896">.</span>
        openNextImg <span style="color:#df5000">=</span> action<span style="color:#969896">(</span><span style="color:#df5000">'&Next Image'</span><span style="color:#969896">,</span> self<span style="color:#969896">.</span>openNextImg<span style="color:#969896">,</span>    <span style="color:#df5000">//</span>裡面有快捷鍵的功能和快捷鍵
                             <span style="color:#df5000">'d'</span><span style="color:#969896">,</span> <span style="color:#df5000">'next'</span><span style="color:#969896">,</span> u<span style="color:#df5000">'Open Next'</span><span style="color:#969896">)</span>          <span style="color:#df5000">//</span>第三個引數(<span style="color:#df5000">'d'</span>)就是快捷鍵,可以修改

        openPrevImg <span style="color:#df5000">=</span> action<span style="color:#969896">(</span><span style="color:#df5000">'&Prev Image'</span><span style="color:#969896">,</span> self<span style="color:#969896">.</span>openPrevImg<span style="color:#969896">,</span>
                             <span style="color:#df5000">'a'</span><span style="color:#969896">,</span> <span style="color:#df5000">'prev'</span><span style="color:#969896">,</span> u<span style="color:#df5000">'Open Prev'</span><span style="color:#969896">)</span>

        verify <span style="color:#df5000">=</span> action<span style="color:#969896">(</span><span style="color:#df5000">'&Verify Image'</span><span style="color:#969896">,</span> self<span style="color:#969896">.</span>verifyImg<span style="color:#969896">,</span>
                        <span style="color:#df5000">'space'</span><span style="color:#969896">,</span> <span style="color:#df5000">'verify'</span><span style="color:#969896">,</span> u<span style="color:#df5000">'Verify Image'</span><span style="color:#969896">)</span>

        save <span style="color:#df5000">=</span> action<span style="color:#969896">(</span><span style="color:#df5000">'&Save'</span><span style="color:#969896">,</span> self<span style="color:#969896">.</span>saveFile<span style="color:#969896">,</span>
                      <span style="color:#df5000">'ctrl+s'</span><span style="color:#df5000">', '</span>save<span style="color:#df5000">', u'</span>Save labels to <span style="color:#df5000">file</span>'<span style="color:#969896">,</span> enabled<span style="color:#df5000">=</span><span style="color:#0086b3">False</span><span style="color:#969896">)</span>
<span style="color:#969896">.</span><span style="color:#969896">.</span><span style="color:#969896">.</span>
</code></code></span>
  • 每畫完一個框後,會讓你選擇所屬類別:

如果想要修改預選類別,可以在 $LabelImage_ROOT/data 裡面的 predefined_classes.txt 裡修改。
資料標註完後,需要生成四個 txt 檔案,分別為 class_train.txt、class_trainval.txt、class_val.txt、class_test.txt。
內容格式為下:

<span style="color:#000000"><code>2008_000008 -1
2008_000015 -1
2008_000019 -1
2008_000023 -1
2008_000028 -1
2008_000033  1
2008_000036 -1
2008_000037  1
2008_000041 -1
2008_000045 -1
2008_000053 -1
2008_000060 -1
...
</code></span>

三)資料存放地址:

資料準備完後,
jpg 檔案放在 \py-faster-rcnn\data\VOCdevkit2007\VOC2007\JPEGImage\ 裡面
xml 檔案放在 \py-faster-rcnn\data\VOCdevkit2007\VOC2007\Annotations\ 裡面
txt 檔案放在 \py-faster-rcnn\data\VOCdevkit2007\VOC2007\ImageSets\Main\ 裡面
注意 txt 裡面每一個類別都有對應的 train、val、trainval、test 檔案,按照原來的資料格式去做,需要自己生成。

二、訓練網路

在訓練開始之前,需要修改一些網路檔案和下載 ImageNet 預訓練模型。

(一)修改相關配置檔案

1.cd $FRCN_ROOT/lib/datasets,修改 pascal_voc .py,新增自己的類

<span style="color:#000000"><code>        self._classes = ('__background__', # always index 0
                         'aeroplane', 'bicycle', 'bird', 'boat',
                         'bottle', 'bus', 'car', 'cat', 'chair',
                         'cow', 'diningtable', 'dog', 'horse',
                         'motorbike', 'person', 'pottedplant',
                         'sheep', 'sofa', 'train', 'tvmonitor', 'cup', 'window', 'glasses')
</code></span>

2.cd $FRCN_ROOT/lib/datasets,修改 imdb.py
在 boxes[:, 2] = widths[i] - oldx1 -1 後面新增三行,如下:

<span style="color:#000000"><code>...
    boxes[:, 2] = widths[i] - oldx1 -1
    for b in range(len(boxes)):
        if boxes[b][2] < boxes[b][0]:
            boxes[b][0] = 0 
...
</code></span>

3.修改 train.prototxt 和 test.prototxt
把所有的 21 替換為 24,這個數為 類別數 + 背景 = 23 + 1,按自己的類別數來改。然後把所有的 84 替換為 96,這個數為 (類別數 + 背景)× 4 = 96 ,也是按照自己的類別改。
4.修改所有的 .pt 檔案
如上,把所有的 21 替換為 24,把所有的 84 替換為 96

(二)下載 ImageNet 模型

訓練的時候需要使用 ImageNet 的預訓練模型,所以需要準備:
cd $FRCN_ROOT 執行指令碼檔案:
./data/scripts/fetch_imagenet_models.sh
有可能需要翻牆才能下載或者下載速度慢。可以網上找網友下載。

(三)清除快取

刪除快取檔案:
$FRCN_ROOT/data/VOCdevkit2007/annotations_cache/annots.pkl
$FRCN_ROOT/data/cache 下的 pkl 檔案
如果不清除快取可能會報錯。

(四)開始訓練

檢查所有準備步驟沒錯後,就可以開始訓練了。
命令如下:
cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_end2end.sh [GPU_ID] [NET] [dataset]
第一個引數指定訓練用的GPU,第二個指定訓練什麼網路,這裡使用VGG16,第三個是指定資料集,這裡為 pascal_voc
例如:
./experiments/scripts/faster_rcnn_end2end.sh 0 VGG16 pascal_voc
訓練每次迭代大約為 0.2s ,迭代 70000 次,每 10000 次會生成一次 snapshot ,大概需要訓練快 4 個小時訓練完的網路儲存在:
$FRCN_ROOT/output/faster_rcnn_end2end/voc_2007_trainval

(五)訓練中遇到的問題

訓練中還是會遇到各種各樣的報錯,我把我自己的遇到的問題彙總了以下,參考訓練和測試 Faster R-CNN 模型中遇到的問題

三、測試網路

網路訓練完成後如果有 test 集會自動開始測試,最後輸出所有類的 Average Precision (AP) 及 mean AP:
除了訓練 VGG16 模型,我還再訓練多一個 ResNet-50,在訓練ResNet-50的時候我修改生成的anchors的尺度,增加了兩個小的anchors,提高了檢測的精度,兩個網路的 AP 做一個對比。
可以發現,殘差網路所有類別的 AP 都有提高,有一部分類有明顯提高:


左:VGG16 網路的mAP; 右:ResNet-50網路的mAP