最近在用教研室的服务器跑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,就能显示图片了,只是效果会很差。
最后
以上就是义气帅哥最近收集整理的关于Ubuntu16.04+cuda8.0+cudnn5.1配置faster-rcnn的方法以及训练自己的数据出现的问题的全部内容,更多相关Ubuntu16.04+cuda8.0+cudnn5.1配置faster-rcnn内容请搜索靠谱客的其他文章。
发表评论 取消回复