1. 程式人生 > >【目標檢測】用Fast R-CNN訓練自己的資料集超詳細全過程

【目標檢測】用Fast R-CNN訓練自己的資料集超詳細全過程

目錄:

一、環境準備

二、訓練步驟

三、測試過程

四、計算mAP

 

       寒假在家下載了Fast R-CNN的原始碼進行學習,於是使用自己的資料集對這個演算法進行實驗,下面介紹訓練的全過程。

一、環境準備

       我這裡的環境是win10系統,pycharm + python3.7

 

二、訓練過程

1、下載Fast R-CNN原始碼

      https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3

2、安裝擴充套件包

      下載的原始碼中有一個 requirements.txt檔案,列出了需要安裝的擴充套件包名字。可以在cmd中直接執行以下程式碼:

pip install -r requirements.txt

      或者使用pip命令一個一個安裝,所需要的擴充套件包有:cython、opencv-python、easydict、Pillow、matplotlib、scipy。

      如果使用conda管理,按conda的下載方式也可以。

3、下載並新增預訓練模型

      原始碼中預訓練模型使用的是VGG16,VGG16模型可點開下方連結直接下載:

      http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz

      下載的模型名字應該是vgg_16.ckpt,重新命名為vgg16.ckpt 後,把模型儲存在data\imagenet_weights\資料夾下。

      也可以使用其他的模型替代VGG16,其他模型在下方連結中下載:

      https://github.com/tensorflow/models/tree/master/research/slim#pre-trained-models

4、修改訓練引數

      開啟原始碼的lib\config資料夾下的config.py檔案,修改其中一些重要引數,如:

(1)network引數

       該引數定義了預訓練模型網路,原始碼中預設使用了vgg16模型,我們使用vgg16就不需修改,如果在上一步中使用其他模型就要修改。

(2)learning_rate

       這個引數是學習率,如果設定太大就可能產生振盪,如果設定太小就會使收斂速度很慢。所以我們可以先預設為原始碼的0.001進行實驗,後期再取0.01或0.0001等多次實驗,找到執行後的相對最優值。

(3)batch_size

       該引數表示梯度下降時資料批量大小,一般可以取16、32、64、128、256等。我個人的理解是,batch_size設定越大,訓練時梯度下降的速率更快,也具有更高的方向準確度,但更加消耗記憶體;batch_size設定越小,雖然節省記憶體,但訓練的速率比較慢,收斂效果也可能不是很好。所以在記憶體允許的情況下,儘量設定大一些。

(4)max_iters

       max_iters引數表示訓練最大迭代的步數。原始碼中是40000,我實驗了4000和40000的步數,發現後來的測試結果中mAP值相差不大,以後會再繼續研究。這個引數可以先按照原始碼的40000進行(要跑好幾天。。。)

(5)snapshot_iterations

       這個引數表示間隔多少迭代次數生成一次結果模型。

(6)roi_bg_threshold_low 和 roi_bg_threshold_high

       這個引數表示在背景中被設定為ROI(感興趣區域,region of interest)的閾值。如果後面出現Exception: image invalid, skipping 這樣的報錯,將roi_bg_threshold_low引數修改為0.0會解決問題。

5、替換資料集

       原始碼中的VOCDevkit2007資料夾存放的是資料集,我們將自己的資料集按照資料夾結構替換存放在VOCDevkit2007中。Annotations存放的是標籤的XML檔案,JPEGImages存放的是自己的資料集所有圖片,ImageSets\Main資料夾下儲存的是test.txt、train.txt、trainval.txt、validation.txt,分別是測試集、訓練集、訓練驗證集、驗證集的標籤檔名號。可以按照下圖的結構製作自己的資料集~

       考慮到原始碼中沒有資料集劃分程式,這裡把劃分程式碼貼出來,替換成自己的各個檔案路徑後直接執行就可以自動生成所需的txt檔案啦。

# 資料集劃分集類
import os
from sklearn.model_selection import train_test_split

image_path = r'F:/111/data/VOCDevkit2007/VOC2007/JPEGImages'
image_list = os.listdir(image_path)
names = []

for i in image_list:
    names.append(i.split('.')[0])     # 獲取圖片名
trainval,test = train_test_split(names,test_size=0.5,shuffle=446)   # shuffle()中是圖片總數目
validation,train = train_test_split(trainval,test_size=0.5,shuffle=446)

with open('F:/111/data/VOCDevkit2007/VOC2007/ImageSets/Main/trainval.txt','w') as f:
    for i in trainval:
        f.write(i+'\n')
with open('F:/111/data/VOCDevkit2007/VOC2007/ImageSets/Main/test.txt','w') as f:
    for i in test:
        f.write(i+'\n')
with open('F:/111/data/VOCDevkit2007/VOC2007/ImageSets/Main/validation.txt','w') as f:
    for i in validation:
        f.write(i+'\n')
with open('F:/111/data/VOCDevkit2007/VOC2007/ImageSets/Main/train.txt','w') as f:
    for i in train:
        f.write(i+'\n')

print('完成!')

6、生成所需檔案

      在cmd中進入 ./data/coco/PythonAPI資料夾路徑,分別執行下面兩條命令:

python setup.py build_ext --inplace
python setup.py build_ext install

      之後,在cmd中進入 ./lib/utils資料夾路徑,執行下面一條命令:

python setup.py build_ext --inplace

      這樣,就生成訓練需要的檔案啦。

7、修改目標類別

       開啟lib/datasets目錄中的pascal_voc.py檔案,第34行self._classes表示目標檢測的類別,將其修改為自己資料集的類別。注意不能修改 “_background_”,它表示圖片的背景。

8、刪除快取檔案

       開啟原始碼中data/cache目錄,刪掉上一次訓練生成的.pkl快取檔案。開啟default/voc_2007_trainval/default目錄,刪掉上次訓練生成的模型。

      注意以後每次訓練都要刪掉上述兩個資料夾中的快取檔案和模型,不刪會報錯的哦。

9、執行train.py檔案

      做好上面所有步驟之後,就可以執行train.py檔案進行訓練啦。每次生成的模型都會儲存在default/voc_2007_trainval/default目錄下。

 

三、測試過程

1、新增訓練模型

       新建Faster-RCNN-TensorFlow-Python3-master/output/vgg16/voc_2007_trainval/default目錄。把訓練生成的模型(default/voc_2007_trainval/default目錄下的四個檔案)複製到新建目錄下,並重命名為如下圖:

2、修改demo.py檔案

(1)修改目標類別

         修改demo.py檔案中line32,CLASSES中的類別要修改為之前步驟中相同的類別。注意 “_background_”不要修改。

(2)修改網路模型

         找到demo.py檔案中line35、line36,將其修改為如下圖所示:

(3)修改預訓練模型

         找到demo.py檔案中line104,將其修改為'vgg16',如下圖:

(4)修改測試圖片

       找到demo.py檔案中的line148,改為自己測試用的幾張圖片名稱。注意和data/demo目錄下存放的測試圖片名字一致。

3、執行demo.py檔案

       做好上述修改後,就可以執行demo.py檔案啦,能夠對新的測試圖片進行目標檢測。

 

四、計算mAP

       mAP(mean Average Precision), 即各類別AP的平均值,反映出一個目標檢測模型效能的總體精確度。

1、修改pascal_voc.py檔案

       開啟pascal_voc.py檔案,找到line189,將"filename"內容修改為下圖:

2、修改demo.py檔案

       開啟demo.py檔案,找到line31,新增兩個模組:

# 新增這兩個import
from lib.utils.test import test_net
from lib.datasets.factory import get_imdb

       新增後如圖所示:

       然後,找到最後一行plt.show(),在它上面新增兩行程式碼:

# 新增這兩行程式碼
imdb = get_imdb("voc_2007_trainval")
test_net(sess, net, imdb, 'default')

       新增後如圖所示:

3、執行demo.py檔案

       新建data/VOCDevkit2007/results/VOC2007/Main目錄,然後執行demo.py檔案,等待執行結束就能看到mAP指標的計算結果啦!貼出我自己模型的計算結果吧!

       這次內容就分享到這裡了,希望與各位老師和小夥伴們交流學習~

&n