faster-rcnn训练遇到的问题

1. 问题1

_sample_rois(roidb, fg_rois_per_image, rois_per_image, num_classes)

报错是因为是$FRCN_ROOT/lib/roi_data_layer下的minibatch.py中的npr.choice引起的,解决方法:
修改:

if fg_inds.size > 0:
        for i in range(0,len(fg_inds)):
            fg_inds[i] = int(fg_inds[i])
        fg_inds = npr.choice(fg_inds, size=int(fg_rois_per_this_image), replace=False)

注意:在这里是有两处使用了npr.choice函数所以需要fg和bg两处

2. 问题2

labels[fg_rois_per_this_image:] = 0
TypeError: slice indices must be integers or None or have an index method

解决方法:
报错是因为这个错误是由numpy的版本引起的,只要将fg_rois_per_this_image强制转换为int型就可以了

labels[int(fg_rois_per_this_image):] = 0

3. 问题3

训练faster-rcnn出现错误“KeyError: ‘max_overlaps’”
解决方法:
删除py-faster-rcnn/data/VOCdevkit2007/annotations_cache这个文件夹;
删除py-faster-rcnn/data/cache文件夹。

4. 问题4

出现anchor_target_layer.py”, line 137, in forward gt_argmax_overlaps = overlaps.argmax(axis=0)错误
解决方法:产生这个错误的原因是因为输入图片的长度不满足要求,训练faster-rcnn需要图片的长宽比(width/height)要在0.462-6.828之间,就是太过瘦长的图片不要

5. 问题5

出现错误

protobuf'module' object has no attribute 'text_format

是因为protobuf的版本发生了变化,
解决方法:在文件./lib/fast_rcnn/train.py增加一行import google.protobuf.text_format 即可解决问题

6. 问题6

datasets/imdb.py”, line 108, in append_flipped_images assert (boxes[:, 2] >= boxes[:, 0]).all()
问题分析:
检查自己数据发现,左上角坐标(x,y)可能为0,或标定区域溢出图片而faster rcnn会对Xmin,Ymin,Xmax,Ymax进行减一操作如果Xmin为0,减一后变为65535
问题解决
1、修改lib/datasets/imdb.py,append_flipped_images()函数
数据整理,在一行代码为 boxes[:, 2] = widths[i] - oldx1 - 1下加入代码:

for b in range(len(boxes)):
  if boxes[b][2]< boxes[b][0]:
boxes[b][0] = 0

2、修改lib/datasets/pascal_voc.py,_load_pascal_annotation(,)函数将对Xmin,Ymin,Xmax,Ymax减一去掉,变为:

# Make pixel indexes 0-based
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

3、(可选,如果1和2可以解决问题,就没必要用3)修改lib/fast_rcnn/config.py,不使图片实现翻转,如下改为:

# Use horizontally-flipped images during training?
__C.TRAIN.USE_FLIPPED = False

7. 问题7

错误信息:cudnn.hpp:127:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDescriptor
这是因为当前版本的caffe的cudnn实现与系统所安装的cudnn的版本不一致引起的。

解决办法:
1.将./include/caffe/util/cudnn.hpp 换成最新版的caffe里的cudnn的实现,即相应的cudnn.hpp.
2. 将./include/caffe/layers里的,所有以cudnn开头的文件,例如cudnn_conv_layer.hpp。 都替换成最新版的caffe里的相应的同名文件。
3.将./src/caffe/layers里的,所有以cudnn开头的文件,例如cudnn_lrn_layer.cu,cudnn_pooling_layer.cpp,cudnn_sigmoid_layer.cu。
都替换成最新版的caffe里的相应的同名文件。

你可能感兴趣的:([5],机器学习)