使用faster-rcnn訓練自己的模型
參考
faster-rcnn
原始碼連結
論文連結
一個不錯的參考
faster rcnn簡介
各檔案目錄介紹
caffe-fast-rcnn —> caffe框架
data —> 存放資料,以及讀取檔案的cache
experiments —>存放配置檔案以及執行的log檔案,配置檔案
lib —> python介面
models —> 三種模型, ZF(S)/VGG1024(M)/VGG16(L)
output —> 輸出的model存放的位置,不訓練此資料夾沒有
tools —> 訓練和測試的python檔案
提供了兩種演算法
alternating optimization training(alt-opt)交替優化訓練
approximate joint training (end-to-end) 近似聯合訓練:官方指出,對於VGG16而言,end-to-end要比alt-opt快1.5倍,精度是差不多的。
提供了三種模型
ZF,小型。至少3G視訊記憶體。
VGG_CNN_M_1024,中型。至少3G視訊記憶體。
VGG16,大型。至少11G視訊記憶體。不過如果開啟CUDNN模式,在end-to-end演算法中訓練,3G視訊記憶體也可以跑起來。
安裝
安裝流程
在caffe-fast-rcnn目錄下,像安裝caffe一樣。
cd caffe-fast-rcnn
cp Makefile.config.example Makefile.config
vim Makefile.config # 根據自己的需要修改配置檔案,如果只使用CPU訓練就開啟CPU_ONLY := 1;
# 如果要使用CUDNN就開啟USE_CUDNN := 1;最高支援cudnn4,更高版本會報錯
將USE_PKG_CONFIG := 1和WITH_PYTHON_LAYER := 1開啟
然後
make -j8
make pycaffe
cd ../lib
make -j4
然後可以測試一下
./tools/demo.py
報錯及解決
1.
no module named setuptools
sudo apt-get install python-setuptools
2.
no module named cython.distutils
pip install cython
3.
no module named easydict
pip install easydict
4.
no module named cv2
apt-get install python-opencv
5.
no module named skimage.io
apt-get install gfortran
pip install -U scikit-image
6.
no module named google.protobuf.internal
apt-get install python-protobuf
7.
執行demo的時候,報錯Check failed: registry.count(type) == 1 (0 vs. 1) Unknown
layer type: Python。
解決方法:把caffe的包make clean。然後更改Makefile.config檔案,設定WITH_PYTHON_LAYER := 1。重新編譯就好了。
8.
ImportError: No module named ‘yaml’
pip install pyyaml
9.
開啟cudnn加速的方法
在makefile.config中刪掉USE_CUDNN := 1的註釋。
10.
cudnn.h: no such file or directory
安裝cudnn。安裝方法:官網下載tar包,解壓縮。該目錄下的caffe並不是最新的,所以cudnn要下載匹配的版本,太新版本cudnn不支援,會導致編譯出錯。
11.
ImportError: No module named gpu_nms
在lib目錄下make
12.
/include/caffe/util/cudnn.hpp:127:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDescriptor
cudnn版本太高,降到cudnn4
13.
ImportError: No module named _caffe
在caffe-fast-rcnn目錄下,make pycaffe
VOC
voc全稱Visual Object Classes Challenge,是一個競賽。基礎任務是對圖片進行分類和物體檢測。附加任務是分段預測和人體分佈檢測。
faster rcnn首先就是應用在voc上的,可以下載voc2007的資料集探索faster rcnn的使用。
voc給出三個集合:訓練集(train)、驗證集(val)和測試集(test)。共有9963張已經標記好的圖片,其中訓練集和驗證集的圖中的標記已經給出,測試集是需要參賽者標註的。圖片中有20類物體,包括人、貓、狗、馬、羊、汽車、公交車、自行車等。
分類就是對每個物體,將包含該類物體的所有圖片列出來。
物體檢測就是在圖片中將每類物體框出來。
分段檢測是給定圖中的某個畫素點指出該畫素點上有哪類物體。
人體分佈檢測是將人的頭、手、腳框出來。
voc的標註資訊中會給出每張圖片中的每個物體:物體的類別、邊界框、從哪個角度拍攝的(前後左右)、被切去的部分以及該物體是不是難以檢測到的(有些物體比較小或者比較模糊或者被切去了很多就是難以檢測的)。
在標註時還給出了兩種分塊資訊,基於類別的和基於物體的。基於類別的就是在圖中標註背景和各類別的位置(即一張圖片中出現多個同類物體只標註類別不區分物體)。基於物體的標準則把每個物體都進行獨立的標註。
執行前準備
資料準備與格式調整
因為我要做人臉檢測,所以首先要有人臉的圖片以及人臉框的位置標記。
參考VOC2007資料集,重要的是資料主要在
JPEGImages —> 存放用來訓練的原始影象(圖片要是JPEG/JPG格式的)
Annotations —> 存放原始影象中的Object的座標資訊,XML格式(參考官方VOC的Annotations的格式中的source和owner不是必須的)
ImageSets/Main —> 指定用來train,trainval,val和test的圖片的編號
我首先選擇的用來實驗的是湯曉鷗團隊的celeba資料集。先用MATLAB進行了格式處理。包括讀取每張圖片的相關資訊並生成對應的xml檔案,根據test、train、val的劃分給出各資料集中分別有哪些圖片。
這裡需要指出,
- 原始資料給出的bbox是左上角座標和寬高,而voc的資料格式是左上角和右下角座標,需要對應的計算。
- 檢視VOC2007的資料可以發現,Main資料夾下的各個子類別的txt除了有圖片編號,還每張圖片對應一個數字{-1,1,0}。
這三個數字的含義為:
-1:圖片中沒有感興趣的物體類別
1:圖片中包含感興趣的物體類別
0:圖片中包含感興趣的物體類別,但只包含標記為difficult的物體
(我選擇的資料集都是有感興趣物體的,並且不需要區分是不是difficult的,所以全1)
我在進行實驗的時候選擇的直接把原來的VOC2007改名為VOC2007-original,把我的資料集改名為VOC2007放在data/VOCdevkit2007資料夾下,這樣比較省心。
在VOC2007/ImageSet/Main資料夾下,包括總的訓練集train.txt、總的測試集test.txt、總的驗證集val.txt以及trainval.txt(如下左圖所示,檔案中儲存各自的圖片名稱,僅有六位數字,沒有檔案字尾),還包括包含各個目標的訓練集、測試集、驗證集,例如,我在做人臉檢測,目標只有一類,即face,則包括了face_train.txt、face_test.txt、face_val.txt、face_trainval.txt(如下右圖所示,檔案中儲存圖片名稱並跟一個數字,0、1或者-1。-1代表該圖中不包含目標物體,1代表該圖中至少包含一張目標物體,0代表該圖中僅包含難以找到的目標物體,難以查詢是voc的任務,並且我找到的訓練集圖片肯定每一個都包含目標物體,所以我把所有圖片名稱後邊寫了1)詳細說明見devkit_doc.pdf 17頁
修改網路配置資訊
只需要檢測人臉,所以類別只有兩類:人臉和背景。
用的是訓練好的中型模型VGG_CNN(VGG16大ZF小),如果想要另外兩個網路根據下邊的介紹做對應修改就好
修改了model/pascal_voc/VGG_CNN_M_1024/faster_rcnn_alt_opt資料夾中的:
- stage1_fast_rcnn_train.pt——data層param_str: “‘num_classes’:
2”和cls_score層num_output: 2以及bbox_pred層num_output: 8 - stage2_fast_rcnn_train.pt——同上,3處
- stage1_rpn_train.pt——input-data層param_str: “‘num_classes’: 2”
- stage2_rpn_train.pt——同上,1處
- faster_rcnn_test.pt——cls_score層num_output: 2以及bbox_pred層num_output: 8
- lib/datasets/pascal_voc.py修改標籤名稱
為防止與之前的模型搞混,訓練前把output資料夾刪除(或改個其他名),還要把py-faster-rcnn/data/cache中的檔案和py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的檔案刪除(如果有的話)
!!!注意:如果自己生成xml標記檔案,bbox給出的座標一定是x1,y1,x2,y2的形式,即左上和右下的座標,不要給寬高。而且一定要x1小於x2,y1小於y2,不然會出很多莫名的錯誤。
訓練
./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG16_CNN_M_1024 pascal_voc
有一點需要指出:訓練過程會經過四個階段rpn、fast_rcnn、rpn、fast_rcnn。階段之間的連線需要一段較長的時間載入資料(可能是因為我的資料集比較大,有18萬+的訓練集),這個過程要耐心等待。
得到的結果在output資料夾下,vgg_cnn_m_1024_rpn_stage1_iter_80000.caffemodel等是過程性檔案,得到的最終結果應該是vgg_cnn_m_1024_final.caffemodel。
檢驗
- 將py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/vgg_cnn_m_1024_final.caffemodel,拷貝到py-faster-rcnn/data/faster_rcnn_models下
- 將需要進行test的images放在py-faster-rcnn/data/demo下
- 修改py-faster-rcnn/tools/demo.py檔案(修改內容包括CLASSES,改成自己的資料集標籤;im_names,改成自己的測試檔案的名稱;NETS,如果是使用的VGG16或者ZF就不用改了,其他則需要修改)