/usr/bin
/home/zhangxin/py-faster-rcnn/caffe-fast-rcnn/include/caffe/util/cudnn.hpp(107): error: too few arguments in function call
/home/zhangxin/py-faster-rcnn/caffe-fast-rcnn/include/caffe/util/cudnn.hpp(126): error: argument of type "int" is incompatible with parameter of type "cudnnNanPropagation_t"
/home/zhangxin/py-faster-rcnn/caffe-fast-rcnn/include/caffe/util/cudnn.hpp(126): error: too few arguments in function call
3 errors detected in the compilation of "/tmp/tmpxft_00001201_00000000-5_absval_layer.cpp4.ii".
CMake Error at cuda_compile_1_generated_absval_layer.cu.o.Release.cmake:279 (message):
Error generating file
/home/zhangxin/py-faster-rcnn/caffe-fast-rcnn/build/src/caffe/CMakeFiles/cuda_compile_1.dir/layers/./cuda_compile_1_generated_absval_layer.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile_1.dir/layers/cuda_compile_1_generated_absval_layer.cu.o] Error 1
make[1]: *** [src/caffe/CMakeFiles/caffe.dir/all] Error 2
make: *** [all] Error 2
这里是cudn版本呢不对。要更新caffe才能支持cudnn6
cd caffe-fast-rcnn
# 将BLVC/caffe添加为远程仓库,命名为caffe
git remote add caffe https://github.com/BVLC/caffe.git
# 获取BLVC/caffe代码
git fetch caffe
# 将BLVC/caffe的master分支合并到当前分支
# -X theirs 指定在合并遇到冲突时以BLVC/caffe版本为主
git merge -X theirs caffe/master
- [x] 制作VOC格式数据集
发现frrcnn要imdb数据,寻找imdb数据转换的方式
修改py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage1_fast_rcnn_train.pt
layer {
name: 'data'
type: 'Python'
top: 'data'
top: 'rois'
top: 'labels'
top: 'bbox_targets'
top: 'bbox_inside_weights'
top: 'bbox_outside_weights'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1
}
}
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
param {
lr_mult: 1.0
}
param {
lr_mult: 2.0
}
inner_product_param {
num_output: 2 #按训练集类别改,该值为类别数+1
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
修改py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage1_rpn_train.pt
layer {
name: 'input-data'
type: 'Python'
top: 'data'
top: 'im_info'
top: 'gt_boxes'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1
}
}
修改py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage2_fast_rcnn_train.pt
layer {
name: 'data'
type: 'Python'
top: 'data'
top: 'rois'
top: 'labels'
top: 'bbox_targets'
top: 'bbox_inside_weights'
top: 'bbox_outside_weights'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1
}
}
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
param {
lr_mult: 1.0
}
param {
lr_mult: 2.0
}
inner_product_param {
num_output: 2 #按训练集类别改,该值为类别数+1
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "bbox_pred"
type: "InnerProduct"
bottom: "fc7"
top: "bbox_pred"
param {
lr_mult: 1.0
}
param {
lr_mult: 2.0
}
inner_product_param {
num_output: 8 #按训练集类别改,该值为(类别数+1)*4,四个顶点坐标
weight_filler {
type: "gaussian"
std: 0.001
}
bias_filler {
type: "constant"
value: 0
}
}
}
修改py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage2_rpn_train.pt
layer {
name: 'input-data'
type: 'Python'
top: 'data'
top: 'im_info'
top: 'gt_boxes'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1
}
}
修改py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
inner_product_param {
num_output: 2 #按训练集类别改,该值为类别数+1
}
}
修改py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
inner_product_param {
num_output: 2 #按训练集类别改,该值为类别数+1
}
}
修改py-faster-rcnn/lib/datasets/pascal_voc.py
class pascal_voc(imdb):
def __init__(self, image_set, year, devkit_path=None):
imdb.__init__(self, 'voc_' + year + '_' + image_set)
self._year = year
self._image_set = image_set
self._devkit_path = self._get_default_path() if devkit_path is None \
else devkit_path
self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)
self._classes = ('__background__', # always index 0
captcha' # 有几个类别此处就写几个,我是两个
)
修改py-faster-rcnn/lib/datasets/imdb.py
将append_flipped_images
函数改为如下形式:
def append_flipped_images(self):
num_images = self.num_images
widths = [PIL.Image.open(self.image_path_at(i)).size[0]
for i in xrange(num_images)]
for i in xrange(num_images):
boxes = self.roidb[i]['boxes'].copy()
oldx1 = boxes[:, 0].copy()
oldx2 = boxes[:, 2].copy()
boxes[:, 0] = widths[i] - oldx2 - 1
print boxes[:, 0]
boxes[:, 2] = widths[i] - oldx1 - 1
print boxes[:, 0]
assert (boxes[:, 2] >= boxes[:, 0]).all()
entry = {'boxes' : boxes,
'gt_overlaps' : self.roidb[i]['gt_overlaps'],
'gt_classes' : self.roidb[i]['gt_classes'],
'flipped' : True}
self.roidb.append(entry)
self._image_index = self._image_index * 2
训练
训练前还需要注意几个地方
cache问题
假如你之前训练了官方的VOC2007的数据集或其他的数据集,是会产生cache的问题的,建议在重新训练新的数据之前将其删除
(1) py-faster-rcnn/output
(2) py-faster-rcnn/data/cache
- 训练参数
py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage_fast_rcnn_solver*.pt
base_lr: 0.001
lr_policy: 'step'
step_size: 30000
display: 20
迭代次数在文件py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py
中进行修改
line 80
max_iters = [80000, 40000, 80000, 40000]
分别对应rpn第1阶段,fast rcnn第1阶段,rpn第2阶段,fast rcnn第2阶段的迭代次数,自己修改即可,不过注意这里的值不要小于上面的solver里面的step_size的大小,大家自己修改吧。
开始训练:
cd py-faster-rcnn
./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG16 pascal_voc
指明使用第一块GPU(0),模型是VGG16,训练数据是pascal_voc(voc2007),没问题的话应该可以迭代训练了
训练faster-rcnn出现错误“KeyError: ‘max_overlaps’”解决
解决方法:
删除py-faster-rcnn/data/VOCdevkit2007/annotations_cache这个文件夹;
删除py-faster-rcnn/data/cache文件夹。
结果
训练完毕,得到我们的训练模型,我们就可以使用它来进行我们的object detection了,具体是:
1. 将py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/VGG16_faster_rcnn_final.caffemodel,拷贝到py-faster-rcnn/data/faster_rcnn_models下
2. 将你需要进行test的images放在py-faster-rcnn/data/demo下
3. 修改py-faster-rcnn/tools/demo.py文件
“`
CLASSES = (‘background‘, ‘captcha’) #参考你自己的类别写
NETS = {‘vgg16’: (‘VGG16’,
‘VGG16_faster_rcnn_final.caffemodel’), #改成你训练得到的model的name
‘zf’: (‘ZF’,
‘ZF_faster_rcnn_final.caffemodel’)
}
im_names = [‘1559.jpg’,’1564.jpg’] # 改成自己的test image的name
“`
models —> 三种模型, ZF(S)/VGG1024(M)/VGG16(L)
需要一一测试
- [ ] ZF(S)
- [ ] VGG1024(M)
- [ ] VGG16
注意VGG需要更多显存
结果如下