pvanet訓練並檢測自己的數據_流程_報錯_總結

1.訓練數據的準備

VOC2007數據格式,和faster-rcnn數據一樣,數據集組織結構和製作參見:
[訓練樣本製作](http://blog.csdn.net/burning_keyboard/article/details/71055557)

準備好了VOC2007格式的數據集後,可以把VOC2007文件夾和testimg文件夾一起放在sample文件夾。(testimg,sample自己根據需要命名)
進入pvanet/data, 給sample文件夾創建超鏈接,起名爲‘VOCdevkit2007’:
cd pvanet/data
ln -s  '/home/cvrsg/RzWu/sample' VOCdevkit2007

2.修改網絡參數

我的網絡結構文件路徑是:/home/wurui/pvamsNET/pvanetWRZ/pvanet/models/pvanet/example_train_384
這裏有3個文件要修改:
[1]solver.prototxt:學習率,使用的網絡文件,沒特殊要求可以不改啦。

[2]train.prototxt: 4 處修改
(1)ctrl + f : 'num_classes' 。一共2處類別數修改。
(2)cls_score 層: 
    inner_product_param {
       num_output: 5 // 改成目標類別數(背景也算一類,要 +1 !)
(3)bbox_pred 層:
    inner_product_param {
       num_output: 20 // 改成 類別數 × 4

[3]test.prototxt: 2 處修改
  就是train.prototxt裏cls_score層和bbox_pred層一樣的修改方法。

3.lib/datasets/pascal_voc.py

 這裏要先刪除pascal_voc.pyc文件,否則會直接運行二進制的.pyc文件。
 在pascal_voc.py裏修改類別的名稱。

4.刪除已經存在的ROI

在 data/cache 目錄下刪除 .pkl文件。
如果之前自己成功訓練過pvanet,這裏會生成.pkl保存ROI,下次再訓練其他檢測任務時,
會因爲ROI不匹配出現一些關於RPN和ROI的報錯。例如:
overlaps = entry['max_overlaps']
KeyError: 'max_overlaps'
roidb[i]['image']=imdb.image_path_at(i) 
IndexError:list index out of rang

5.檢測腳本修改

修改一下類別名。另外這裏提供一個好用的檢測腳本pva_demon.py(師兄送的)
鏈接: https://pan.baidu.com/s/1i48ojqd 密碼: 577u

[ps] 師兄的博客:
[ Ubuntu上編譯Caffe和拓展應用(faster-rcnn, pvanet)的錯誤及解決方案 ](http://blog.csdn.net/tingyue_/article/details/53432071)
[ 關於pvanet中original model和test model的理解 ](http://blog.csdn.net/tingyue_/article/details/53545027)

6.訓練/檢測命令

./tools/train_net.py --gpu 0 --solver models/pvanet/example_train_384/solver.prototxt --cfg models/pvanet/cfgs/train.yml --weights models/pvanet/imagenet/original.model --iters 100000 --imdb voc_2007_trainval
./tools/pva_demo.py --net /home/cvrsg/pvanet/output/faster_rcnn_pvanet/voc_2007_trainval/pvanet_frcnn_384_iter_32000.caffemodel --cfg models/pvanet/cfgs/submit_160715.yml --def /home/cvrsg/pvanet/models/pvanet/example_train_384/test.prototxt
[1]訓練得到的model保存在../output/faster_rcnn_pvanet/voc_2007_trainval

[2]train.yml文件裏指定了一些訓練時rpn相關參數。這裏的參數有些和下面的config.py參數重複,.yml中的參數設置是優先的。

[3]在pvanet/lib/fast_rcnn/config.py 中是訓練策略相關參數的設置:
   例如:
   # Iterations between snapshots
   __C.TRAIN.SNAPSHOT_ITERS = 1000 // 每隔多少次迭代保存model
   例如:
   # Use horizontally-flipped images during training?      
   __C.TRAIN.USE_FLIPPED = True  // 水平鏡像數據增強

 **[注意]這裏的 __C.TRAIN.USE_FLIPPED = True 最好設置成 TRUE
      否則可能會報錯:**
Traceback (most recent call last):
  File "./tools/train_net.py", line 112, in <module>
    max_iters=args.max_iters)
  File "/home/cvrsg/wrz_graduate_project/pvanet/tools/../lib/fast_rcnn/train.py", line 158, in train_net
    pretrained_model=pretrained_model)
  File "/home/cvrsg/wrz_graduate_project/pvanet/tools/../lib/fast_rcnn/train.py", line 54, in __init__
    self.solver.net.layers[0].set_roidb(roidb)
  File "/home/cvrsg/wrz_graduate_project/pvanet/tools/../lib/roi_data_layer/layer.py", line 68, in set_roidb
    self._shuffle_roidb_inds()
  File "/home/cvrsg/wrz_graduate_project/pvanet/tools/../lib/roi_data_layer/layer.py", line 35, in _shuffle_roidb_inds
    inds = np.reshape(inds, (-1, 2))
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 225, in reshape
    return reshape(newshape, order=order)
ValueError: total size of new array must be unchanged
 這是因爲訓練圖片數量要求是偶數,而你訓練數據圖片是奇數,開了鏡像就一定是偶數輸入啦。當然你也可以刪掉一張訓練圖片解決這個問題。

7.關於網絡報錯Debug

 pvanet是python腳本調用c++源碼,在調試tools裏和lib裏的py腳本時可以修改了即時debug。lib裏修改.py後要刪掉相應的.pyc文件。
 但是修改caffe-fast-rcnn裏的py腳本時(調試rpn這部分),修改.py文件後,cd到caffe-fast-rcnn,make一下才會生效。

8.關於gpu加速的設置

使用cpu計算,使用gpu計算,使用cudnn加速,都在Makefile.config文件裏。
開啓cudnn比起只用cuda計算速度快了不止5倍。
# cuDNN acceleration switch (uncomment to build with cuDNN).
# USE_CUDNN := 1

# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1
修改好makefile,然後:
cd caffe-fast-rcnn
make clean
make all
make pycaffe

9.編譯時遇見的報錯(Makefile)

[1]找不到 hdf5:
   在 makefile.config 中添加路徑
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
[2]找不到 libprotobuf.so.9 
先在計算機裏 ctrl+f 找一下 libprotobuf.so,或者在命令行執行: locate libprotobuf.so
看看是否安裝了libprotobuf,看看版本對不對。如果都沒問題,在makefile.config裏添加已經安裝的libprotobuf.so的路徑。
ps:這個protobuf安裝的路徑問題參考一下別的博客吧:(http://blog.csdn.net/csqingchen/article/details/50669725)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章