您的位置:首页 > 其它

Ubuntu16.04+cuda8.0+cudnn5.1配置faster-rcnn的方法以及训练自己的数据出现的问题

2017-05-22 20:38 851 查看
  最近在用教研室的服务器跑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,就能显示图片了,只是效果会很差。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息