使用py-faster-rcnn来训练voc2007数据集(Ubuntu)

来源:互联网 发布:摩天轮票务 知乎 编辑:程序博客网 时间:2024/06/03 15:52

数据集

1、下载数据集: 
输入指令:

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tarwget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tarwget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
  • 1
  • 2
  • 3

文件挺大,要下载一段时间。如果嫌慢的话,直接打开url使用其他下载器下载也可以。 
下载完成后得到三个文件: 
这里写图片描述

2、解压:

tar -xvf VOCtrainval_06-Nov-2007.tartar -xvf VOCtest_06-Nov-2007.tartar -xvf VOCdevkit_08-Jun-2007.tar
  • 1
  • 2
  • 3

解压后其中的文件会自动合并到一起。 
这里写图片描述 
其中比较重要的两个文件夹分别是VOC2007VOCcode。 
这里写图片描述

3、将VOCdevkit文件夹放到py-faster-rcnn的data目录,即FRCNROOT/dataFRCN_ROOT表示py-faster-rcnn的根目录。 
输入指令,为PASCAL_VOC dataset创建链接 :

cd $FRCN_ROOT/dataln -s $VOCdevkit VOCdevkit2007
  • 1
  • 2

4、下载预训练模型:

cd $FRCN_ROOT./data/scripts/fetch_imagenet_models.sh
  • 1
  • 2

文件挺大的,下载时间可能会比较长。 
当然下载方法也很多,也可以到csdn下载区找到,不多说了。

训练数据集

好了,到目前为止都很简单。接下来要使用指令来训练了,一般来说都会因为环境不兼容碰到各种坑,后面会给出解决办法。

使用交替优化算法训练RPN 
指令说明:

cd $FRCN_ROOT./experiments/scripts/faster_rcnn_alt_opt.sh [GPU_ID] [NET] [--set ...]
  • 1
  • 2

GPU_ID:你的GPU号,默认为0; 
NET:使用的网络模型,模型有三种{ZF, VGG_CNN_M_1024, VGG16},其中zf较小,vgg16最大; 
set 训练集设置,使用的数据集是pascal_voc;

示例:

cd $FRCN_ROOT./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG16 pascal_voc
  • 1
  • 2

使用联合训练的方法训练RPN 
指令说明:

cd $FRCN_ROOT./experiments/scripts/faster_rcnn_end2end.sh [GPU_ID] [NET] [--set ...]
  • 1
  • 2

GPU_ID:你的GPU号,默认为0; 
NET:使用的网络模型,模型有三种{ZF, VGG_CNN_M_1024, VGG16},其中zf较小,vgg16最大; 
set 训练集设置,使用的数据集是pascal_voc;

这里跟前面类似,只是训练的方法不一样,使用的网络模型和数据集等等都是一样的。 
示例:

cd $FRCN_ROOT./experiments/scripts/faster_rcnn_end2end.sh 0 VGG16 pascal_voc
  • 1
  • 2

可能遇到的问题

好了,前面的就是基本的操作步骤了。现在介绍一下可能遇到的问题。 
错误1:

TypeError: slice indices must be integers or None or have an index method
  • 1

这个报错是因为numpy的版本太高,默认我们装anaconda的话,使用的numpy版本是1.12的,而这里用的是numpy1.11。由于语法不同,不兼容,所以报错。

解决方法一:对numpy版本做调整,把numpy版本降低到1.11。 
输入指令:

sudo pip install -U numpy==1.11.0
  • 1

如果装的是anaconda的话,要使用conda install指令来重新安装numpy。但是不建议,因为会将一系列的python包更改掉,管理会变得很混乱,所以我没有采取这种方法。

给个参考链接,感兴趣的可以去看看:跑py-faster-rcnn过程中遇到的问题

解决办法二: 
由于是numpy版本不兼容,我们就自己修改代码,使代码能兼容1.12版本的numpy。 
修改$FRCN_ROOT/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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

修改为:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

只是更改了ind,start,end变量,因为他们是numpy.int类型,将其进行强制类型转换,才能做索引。

错误2

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

这个报错也是numpy的版本问题,有可能会遇到报错也有可能不会。 
要么更换numpy版本,要么就是自己修改源码。

1) $FRCN_ROOT/lib/roi_data_layer/minibatch.py

将第26行:

fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
  • 1

改为:

fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)
  • 1

2) $FRCN_ROOT/lib/datasets/ds_utils.py

将第12行:

hashes = np.round(boxes * scale).dot(v)
  • 1

改为:

hashes = np.round(boxes * scale).dot(v).astype(np.int)
  • 1

3) $FRCN_ROOT/lib/fast_rcnn/test.py

将第129行:

 hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v)
  • 1

改为:

hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v).astype(np.int)
  • 1

4) $FRCN_ROOT/lib/rpn/proposal_target_layer.py

将第60行:

fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
  • 1

改为:

fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)
  • 1
  • 2

接下来可以回去前面输入指令测试了。如果还遇到了其他问题,下面给出几个参考博客链接: 
Faster RCNN 训练中的一些问题及解决办法 
Ubuntu16.04+cuda8.0+cudnn5.1配置faster-rcnn的方法以及训练自己的数据出现的问题

阅读全文
0 0
原创粉丝点击