1. 程式人生 > >使用faster-rcnn訓練自己的模型

使用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。

檢驗

  1. 將py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/vgg_cnn_m_1024_final.caffemodel,拷貝到py-faster-rcnn/data/faster_rcnn_models下
  2. 將需要進行test的images放在py-faster-rcnn/data/demo下
  3. 修改py-faster-rcnn/tools/demo.py檔案(修改內容包括CLASSES,改成自己的資料集標籤;im_names,改成自己的測試檔案的名稱;NETS,如果是使用的VGG16或者ZF就不用改了,其他則需要修改)