1. 程式人生 > >R-FCN在linux下的配置(py-R-FCN)並訓練自己的資料集

R-FCN在linux下的配置(py-R-FCN)並訓練自己的資料集

本文是R-FCN程式碼的python版原始碼配置,作業系統為Ubuntu16.04

R-FCN: Object Detection via Region-based Fully Convolutional Networks,與先前的基於區域的檢測器(諸如Fast/Faster R-CNN)在每個區域子網路幾百次的高成本計算相反,R-FCN的基於區域的檢測器是利用深度完全卷積網路,幾乎所有計算在整個影象上共享。 R-FCN可以採用強大的完全卷積影象網路結構,例如ResNets等。

目錄:

1,軟體準備

2,硬體準備

3,R-FCN配置

4,配置中遇到的問題

5,訓練自己的資料集

6,訓練資料集遇到的問題

7, 參考資料

軟體準備:

首先,需要安裝Caffe和pycaffe,這裡不做介紹,預設已經裝了;

其次,需要Python安裝包:cython,python-opencv,easydict;

先裝python包管理器pip:

  1. sudo apt-get install python-pip  
再裝那三個包:
  1. sudo pip install cython  
  2. sudo pip install python-opencv  
  3. sudo pip install easydict  

PS:由於R-FCN對Roi Layer有了修改,因此需用使用作者版本的Caffe而不是BLVC版本。該版本Caffe要求使用CUDA Toolkit 7.5與** cuDNN v3 or cuDNN v4**。

硬體準備:

如果選用ResNet50:4G視訊記憶體;如果用ResNet101:6G視訊記憶體

R-FCN配置過程:

1、克隆py-R-FCN工程:

  1. git clone https://github.com/Orpine/py-R-FCN.git  

2、克隆Microsoft-version Caffe(@commit 1a2be8e), R-FCN某些層的定義是在這個版caffe才有

  1. cd py-R-FCN  
  2. git clone https://github.com/Microsoft/caffe.git  
  3. cd caffe  
  4. git reset --hard 1a2be8e  

3、編譯caffe,注意修改Mikefile檔案,先拷貝Makefile.config.example到Makefile.config再改部分選項,然後make,如下:

  1. cp Makefile.config.example Makefile.config  
  2. # In your Makefile.config, make sure to have this line uncommented  必須
  3. WITH_PYTHON_LAYER :1
  4. # 推薦使用CUDNN加速,沒有GPU或CUDA損壞的可以關閉  可選 
  5. USE_CUDNN :1
  6. # 根據機器情況選擇是否使用PKG_CONFIG,我的機器必須有這項
  7. USE_PKG_CONFIG = 1
  8. #開始make
  9. make -j8 && make pycaffe  
4、編譯lib
  1. cd ../lib 
  2. make 

5、下載預先在Pascal Voc 2007上訓練好的基於ResNet的R-FCN模型,解壓後放在$RFCN/data下面,如下形式:

$RFCN/data/rfcn_models/resnet50_rfcn_final.caffemodel
$RFCN/data/rfcn_models/resnet101_rfcn_final.caffemodel

6、跑demo.py

$RFCN/tools/demo_rfcn.py

如果執行沒問題,R_FCN就配置好了,訓練自己的資料看GitHub,寫得很詳細了。

配置中遇到的問題

Makefile.config配置的相關問題:

開啟 USE_CUDNN = 1,這個選項預設情況下時關閉的,使用CUDA可以加速,我的機器CUDA有點問題,所以我沒有開啟;
開啟 WITH_PYTHON_LAYER = 1,這個在預設情況下也是關閉的,R-FCN有作者自己實現的python層,需要支援Python介面,因此需要開啟
和Fast RCNN一樣,R-FCN需要hdf5的支援,這個根據自己的Linux裡的庫檔案安裝路徑新增,不清楚的可以find一下,不過一般情況下,INCLUDE_DIRS 應該新增上 /usr/include/hdf5/serial LIBRARY_DIRS 新增上 /usr/lib/x86_x64-linux-gnu/hdf5/serial

另外把USE_PKG_CONFIG = 1 記得開啟,要不然會找不到一些庫檔案,PKG是linux用來管理庫檔案

ERROR:/usr/bin/ld: 找不到 -lippicv 

原因:缺少opencv庫檔案libippicv.a

解決方法:在終端下搜尋libippicv檔案

find /usr/local/ -name "libippicv*"

找到該檔案在/usr/local/share/OpenCV/3rdparty/lib/libippicv.a,然後把找到的檔案拷貝或軟連線到/usr/local/lib

ln -s /usr/local/share/OpenCV/3rdparty/lib/libippicv.a /usr/local/lib

利用R-FCN訓練自己的資料集:

1、拷貝資料集到$RFCN_ROOT/data下,比如我的資料集是RSOD飛機檢測資料集,為了方便,我把它做成pascal voc(該資料比該程式碼方便一點,尤其是pascal_voc格數還比較通用,方便以後用在其他網路).注意,results檔案需要自己建立,包含VOC2007,再包含Main,用來存結果。

$RFCN_ROOT
--data
----VOCdevkit2007
------VOC2007
--------JPEGImages
--------ImageSets
----------Main
--------Annotations
------results
--------VOC2007
----------Main

2、下載預訓練模型

ResNet-50, ResNet-101, ResNet-152 預訓練模型,我的百度雲盤:https://pan.baidu.com/s/1g89UfSBpTcuaqkikM2Yy6g,密碼2d5b,將caffemodel放在$RFCN_ROOT/data/imagenet_models

3、修改模型網路,就是根據自己類別數目該模型與類別數目相關的引數

開啟$RFCN_ROOT/models/pascal_voc/ResNet-50/rfcn_end2end  (以end2end為例)

(1)test.prototxt 6處:查詢: rfcn_cls (2處)、rfcn_bbox (2處)、cls_prob_reshape (1處)、bbox_pred_reshape(1處)

(2)train_ohem.prototxt 6處:查詢: num_class (2處)、rfcn_cls (2處)、rfcn_bbox (2處)

(3)test_agnostic.prototxt /  train_agnostic.prototxt / train_agnostic_ohem.prototxt 各3處:查詢: num_class (1處)、rfcn_cls(2處)

在相應檔案中搜索各查詢的關鍵詞,把這些層與類別數相關的改成自己的資料類別數(與bbox相關的要乘以4)

4、修改資料集程式碼

(1)$RFCN/lib/datasets/pascal_voc.py

class pascal_voc(imdb):  
    def __init__(self, image_set, year, devkit_path=None):  
        imdb.__init__(self, 'voc_' + year + '_' + image_set)  
        self._year = year  
        self._image_set = image_set  
        self._devkit_path = self._get_default_path() if devkit_path is None \  
                            else devkit_path  
        self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)  
        self._classes = ('__background__', # always index 0  
                         '你的標籤1','你的標籤2',你的標籤3','你的標籤4'  
                      )  

(2)$RFCN\experiments\scripts\rfcn_end2end_ohem.sh:

case $DATASET in  
  pascal_voc)  
    TRAIN_IMDB="voc_0712_trainval"  #voc_0712_trainval是作者在github裡描述的voc2007+voc2012,我的資料放在voc2007檔案下,所以這裡改成voc_2007_trainval
    TEST_IMDB="voc_0712_test"  #同上理由,改成voc_2007_test
    PT_DIR="pascal_voc"  
    ITERS=110000  #我的資料集較小,迭代次數改成ITERS=12000

5、開始訓練

cd $RFCN_ROOT  
./experiments/scripts/rfcn_end2end_ohem.sh 0 ResNet-50 pascal_voc

其中,0表示GPU Id,ResNet-50是網路,pascal_voc是資料集。

訓練資料集遇到的問題

根據經驗,由於各個機器環境不一樣,往往不是一次就能成功的,會有各種問題,建議跑訓練前先把迭代次數設定為100或更小,方便除錯,我將遇到的問題整理在另一篇文章裡:http://blog.csdn.net/hongxingabc/article/details/79048531 (R-FCN程式碼是Faster R-CNN基礎上改的,所以會有相同的問題)建議跑之前先看看這個,心裡有點譜。

除了與Faster R-CNN共有的一些問題外,訓練R-FCN的end2end_OHEM版本時遇到問題: loss_bbox=0,而訓練單純end2end版本則無此問題。解決方法參考https://github.com/YuwenXiong/py-R-FCN/issues/85,主要是numpy的問題。

參考資料: