1. 程式人生 > >Ubuntu16.04+cuda8.0+cudnn5.1配置faster-rcnn的方法以及訓練自己的資料出現的問題

Ubuntu16.04+cuda8.0+cudnn5.1配置faster-rcnn的方法以及訓練自己的資料出現的問題

  最近在用教研室的伺服器跑faster rcnn, 伺服器配置太高了ubuntu 16.04 + cuda8.0 + cudnn 5.1, 但是原本的faster rcnn 點選開啟連結已經是兩年前的了,所以會出現不相容的問題.網上查了一個大神的,就用了這個點選開啟連結部落格裡面的caffe.以為萬事大吉,但是在訓練自己的資料的時候還是出現一些問題,我把它們總結起來。(具體的怎麼訓練資料我之後的部落格應該會講,先把出現的問題講了把).

  Pro 1: 使用上述的caffe,會解決與cudnn不相容的問題. 

  下面的問題是在$py-faster-rcnn的根目錄下執行:./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG16 pascal_voc 出現的,主要參考大神

點選開啟連結

  Pro 2: AttributeError: 'module' object has no attribute ‘text_format'

  解決方法:在/home/xxx/py-faster-rcnn/lib/fast_rcnn/train.py的標頭檔案匯入部分加上 :import google.protobuf.text_format

  Pro3: TypeError: 'numpy.float64' object cannot be interpreted as an index

      這個問題是因為我用的numpy版本太高了, 最簡單的方法是直接改版本 sudo python2.7 /usr/local/bin/pip install -U numpy==1.11.0;但是我不是管理員,沒有辦法更改,修改如下幾個地方的code:
  1) /home/xxx/py-faster-rcnn/lib/roi_data_layer/minibatch.py

  將第26行:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
  改為:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)


  2) /home/xxx/py-faster-rcnn/lib/datasets/ds_utils.py
  將第12行:hashes = np.round(boxes * scale).dot(v)
  改為:hashes = np.round(boxes * scale).dot(v).astype(np.int)


  3) /home/xxx/py-faster-rcnn/lib/fast_rcnn/test.py
  將第129行: hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v)
  改為: hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v).astype(np.int)


  4) /home/xxx/py-faster-rcnn/lib/rpn/proposal_target_layer.py

  將第60行:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)

  改為:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)

  Pro4:TypeError: slice indices must be integers or None or have an __index__ method

  還是numpy的版本問題:

        修改 /home/lzx/py-faster-rcnn/lib/rpn/proposal_target_layer.py,轉到123行:

for ind in inds:
cls = clss[ind]
start = 4 * cls
end = start + 4
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
return bbox_targets, bbox_inside_weights

這裡的ind,start,end都是 numpy.int 型別,這種型別的資料不能作為索引,所以必須對其進行強制型別轉換,轉化結果如下:
for ind in inds:
ind = int(ind)
cls = clss[ind]
start = int(4 * cls)
end = int(start + 4)
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
return bbox_targets, bbox_inside_weights

  Pro6:# 終端提示 AssertionError

  File "/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 112, in append_flipped_images
  assert (boxes[:, 2] >= boxes[:, 0]).all()
  AssertionError

  解決方法:這些問題的根源都是faster-rcnn系列在處理生成pascal voc資料集時,為了使畫素以0為起點,每個bbox的左上右下座標都減1,如果你的資料裡有座標為0,一般是x1或y1,這時x1 = 0-1 = 65535.

  開啟$faster-rcnn-root/lib/datasets/imdb.py 

oldx1 = boxes[:, 0].copy()
oldx2 = boxes[:, 2].copy()
boxes[:, 0] = widths[i] - oldx2 - 1
boxes[:, 2] = widths[i] - oldx1 - 1
assert (boxes[:, 2] >= boxes[:, 0]).all()
  改為:
oldx1 = boxes[:, 0].copy()
oldx2 = boxes[:, 2].copy()
boxes[:, 0] = widths[i] - oldx2 - 1
boxes[:, 2] = widths[i] - oldx1 - 1
for b in range(len(boxes)):
    if boxes[b][2]< boxes[b][0]:
        boxes[b][0] = 0
assert (boxes[:, 2] >= boxes[:, 0]).all()
 並且開啟:$faster-rcnn-root/lib/datasets/pascal.py(這一步很重要!!)將:
x1 = float(bbox.find('xmin').text) - 1 
y1 = float(bbox.find('ymin').text) - 1
x2 = float(bbox.find('xmax').text) - 1
y2 = float(bbox.find('ymax').text) - 1
  改為:
x1 = float(bbox.find('xmin').text) 
y1 = float(bbox.find('ymin').text) 
x2 = float(bbox.find('xmax').text) 
y2 = float(bbox.find('ymax').text) 

  之後,我訓練好了我的model,但是我將測試的圖片放在demo裡面跑,根本就沒有圖片顯示,而顯示這樣的結果:

  Pro5: 執行demo,圖片不顯示問題

Loaded network /home/xxx/py-faster-rcnn/data/faster_rcnn_models/VGG16_faster_rcnn_final.caffemodel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/image.jpg
Detection took 0.067s for 300 object proposals

這裡一定要注意!!!已經不是caffe和cudnn不相容的問題了,這是因為識別率太低,把deom.py中的不斷更改CONF_THRES,就能顯示圖片了,只是效果會很差。