目錄:
一、環境准備
二、訓練步驟
三、測試過程
四、計算mAP
寒假在家下載了Faster R-CNN的源碼進行學習,於是使用自己的數據集對這個算法進行實驗,下面介紹訓練的全過程。
一、環境准備
我這里的環境是win10系統,pycharm + python3.7
二、訓練過程
1、下載Faster 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指標的計算結果啦!貼出我自己模型的計算結果吧!
這次內容就分享到這里了,希望與各位老師和小伙伴們交流學習~