目录
-
- 1 ZF
- 准备工作
- 1.py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_fast_rcnn_train.pt修改
- 2.py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_rpn_train.pt修改
- 3.py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage2_fast_rcnn_train.pt修改
- 4.py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage2_rpn_train.pt修改
- 5.py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/faster_rcnn_test.pt修改
- 6.py-faster-rcnn/lib/datasets/pascal_voc.py修改
- 7.py-faster-rcnn/lib/datasets/imdb.py修改
- 8.开始训练
- 9.测试
- 10.结果
- 11 error总结
- 2 ResNet
- 3 模型可视化
- 参考
- 1 ZF
说明:本博文假设你已经做好了自己的数据集,该数据集格式和VOC2007相同。下面是训练前的一些修改。
(做数据集的过程可以看http://blog.csdn.net/sinat_30071459/article/details/50723212)
Faster-RCNN源码下载地址:
Matlab版本:https://github.com/ShaoqingRen/faster_rcnn
Python版本:https://github.com/rbgirshick/py-faster-rcnn
本文用到的是Python版本,在Linux下运行。
Matlab版本的训练过程:http://blog.csdn.net/sinat_30071459/article/details/50546891
———- 文件目录 - **caffe-fast-rcnn**:caffe框架目录 - **data**:用来存放pretrained模型以及读取文件的cache缓存,还有一些下载模型的脚本 - **experiments**:存放配置文件以及运行的log文件,另外这个目录下有scripts,里面存放end2end和alt_opt两种训练方式的脚本 - **lib**:用来存放一些python接口文件,如其下的datasets主要负责数据库读取,config负责一些训练的配置选项 - **models**:里面存放了三个模型文件,小型网络ZF,中型网络VGG_CNN_M_1024以及大型网络VGG16,根据你的硬件条件来选择使用哪种网络,ZF和VGG_CNN_M_1024需要至少3G内存,VGG16需要更多的内存,但不会超过11G。 - **output**:这里存放的是训练完成后的输出目录,这是运行了训练后才会出现的目录 - **tools**:里面存放的是训练和测试的Python文件 ———-1 ZF
准备工作
1.配置caffe
这个不多说,网上教程很多。
2.其他的注意事项
这里说的挺详细了,认真看看吧。地址:https://github.com/rbgirshick/py-faster-rcnn(主要内容如下)
下面大概翻译一下上面网址的内容吧。
(1)安装cython, python-opencv
,easydict
-
pip
install cython
-
pip
install easydict
-
apt-
get
install python-opencv
(2)下载py-faster-rcnn
-
# Make sure
to clone
with --recursive
-
git clone --recursive https:
//github.com/rbgirshick/py-faster-rcnn.git
如图:
(3)进入py-faster-rcnn/lib
执行make
如图:
(4)进入py-faster-rcnn\caffe-fast-rcnn
执行 cp Makefile.config.example Makefile.config
然后,配置Makefile.config文件,可参考我的配置:Makefile.config文件
配置好Makefile.config文件后,执行:
make -j8 && make pycaffe
如图:
(5)下载VOC2007数据集
提供一个百度云地址:http://pan.baidu.com/s/1mhMKKw4
解压,然后,将该数据集放在py-faster-rcnn\data下,用你的数据集替换VOC2007数据集。(替换Annotations,ImageSets和JPEGImages)
(用你的Annotations,ImagesSets和JPEGImages替换py-faster-rcnn\data\VOCdevkit2007\VOC2007中对应文件夹)
(6)下载ImageNet数据集下预训练得到的模型参数(用来初始化)
提供一个百度云地址:http://pan.baidu.com/s/1hsxx8OW
解压,然后将该文件放在py-faster-rcnn\data下
下面是训练前的一些修改。
1.py-faster-rcnn/models/pascal_voc/ZF/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': 16" #按训练集类别改,该值为类别数+
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:
16 #按训练集类别改,该值为类别数+
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:
64 #按训练集类别改,该值为(类别数+
1)*
4
-
weight_filler {
-
type:
"gaussian"
-
std:
0.001
-
}
-
bias_filler {
-
type:
"constant"
-
value:
0
-
}
-
}
-
}
2.py-faster-rcnn/models/pascal_voc/ZF/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': 16" #按训练集类别改,该值为类别数+
1
-
}
-
}
3.py-faster-rcnn/models/pascal_voc/ZF/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': 16" #按训练集类别改,该值为类别数+
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:
16 #按训练集类别改,该值为类别数+
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:
64 #按训练集类别改,该值为(类别数+
1)*
4
-
weight_filler {
-
type:
"gaussian"
-
std:
0.001
-
}
-
bias_filler {
-
type:
"constant"
-
value:
0
-
}
-
}
-
}
4.py-faster-rcnn/models/pascal_voc/ZF/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': 16" #按训练集类别改,该值为类别数+
1
-
}
-
}
5.py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/faster_rcnn_test.pt修改
-
layer {
-
name:
"cls_score"
-
type:
"InnerProduct"
-
bottom:
"fc7"
-
top:
"cls_score"
-
inner_product_param {
-
num_output:
16 #按训练集类别改,该值为类别数+
1
-
}
-
}
-
layer {
-
name:
"bbox_pred"
-
type:
"InnerProduct"
-
bottom:
"fc7"
-
top:
"bbox_pred"
-
inner_product_param {
-
num_output:
64 #按训练集类别改,该值为(类别数+
1)*
4
-
}
-
}
6.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
-
'你的标签1',
'你的标签2',你的标签
3
','你的标签
4
'
-
)
上面要改的地方是
修改训练集文件夹:
self._data_path = os.path.join(self._devkit_path, 'VOC'+self._year)
用你的数据集直接替换原来VOC2007内的Annotations,ImageSets和JPEGImages即可,以免出现各种错误。
修改标签:
-
self._classes = (
'__background__',
# always index 0
-
'你的标签1',
'你的标签2',
'你的标签3',
'你的标签4'
-
)
修改成你的数据集的标签就行。
(2)
cls = self._class_to_ind[obj.find('name').text.lower().strip()]
这里把标签转成小写,如果你的标签含有大写字母,可能会出现KeyError的错误,所以建议标签用小写字母。
(去掉lower应该也行)
建议训练的标签还是用小写的字母,如果最终需要用大写字母或中文显示标签,可参考:
http://blog.csdn.net/sinat_30071459/article/details/51694037
7.py-faster-rcnn/lib/datasets/imdb.py修改
该文件的append_flipped_images(self)函数修改为:
-
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
!!!为防止与之前的模型搞混,训练前把output文件夹删除(或改个其他名),还要把py-faster-rcnn/data/cache中的文件和
py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件删除(如果有的话)。
至于学习率等之类的设置,可在py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt中的solve文件设置,迭代次数可在py-faster-rcnn\tools的train_faster_rcnn_alt_opt.py中修改:
max_iters = [80000, 40000, 80000, 40000]
分别为4个阶段(rpn第1阶段,fast rcnn第1阶段,rpn第2阶段,fast rcnn第2阶段)的迭代次数。可改成你希望的迭代次数。
如果改了这些数值,最好把py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt里对应的solver文件(有4个)也修改,stepsize小于上面修改的数值。
8.开始训练
进入py-faster-rcnn,执行:
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
这样,就开始训练了。
9.测试
将训练得到的py-faster-rcnn\output\faster_rcnn_alt_opt\***_trainval中ZF的caffemodel拷贝至py-faster-rcnn\data\faster_rcnn_models(如果没有这个文件夹,就新建一个),然后,修改:
py-faster-rcnn\tools\demo.py,主要修改:
-
CLASSES = (
'__background__',
-
'你的标签1',
'你的标签2',
'你的标签3',
'你的标签4')
改成你的数据集标签;
-
NETS = {
'vgg16': (
'VGG16',
-
'VGG16_faster_rcnn_final.caffemodel'),
-
'zf': (
'ZF',
-
'ZF_faster_rcnn_final.caffemodel')}
上面ZF的caffemodel改成你的caffemodel。
im_names = ['1559.jpg','1564.jpg']
改成你的测试图片。(测试图片放在py-faster-rcnn\data\demo中)
10.结果
在py-faster-rcnn下,
执行:
./tools/demo.py --net zf
或者将默认的模型改为zf:
修改:
parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]', choices=NETS.keys(), default='vgg16')
default='zf'
执行:
./tools/demo.py
11 error总结
11.1 error 1:IndexError: list index out of range
File "./tools/train_net.py", line 85, in
roidb = get_training_roidb(imdb)
File "/usr/local/fast-rcnn/tools/../lib/fast_rcnn/train.py", line 111, in get_training_roidb
rdl_roidb.prepare_roidb(imdb)
File "/usr/local/fast-rcnn/tools/../lib/roi_data_layer/roidb.py", line 23, in prepare_roidb
roidb[i]['image'] = imdb.image_path_at(i)
IndexError: list index out of range
error1 解决办法:
删除fast-rcnn-master/data/cache/ 文件夹下的.pkl文件,或者改名备份,重新训练即可。
2 ResNet
1)修改/home/path/py-faster-rcnn-urine/lib/datasets/pascal_voc.py
的类别名字
2)数据集放在/home/path/py-faster-rcnn-urine/data/VOCdevkit2007/VOC/
中
结构如下:
- Annotations
- ImageSets
- Main
- test.txt
- trainval.txt
- Main
- JPEGImages
3)修改
/home/path/py-faster-rcnn-urine/models/pascal_voc/RES101/faster_rcnn_end2end
的test.prototxt
和train.prototxt
,与上述ZF类似,改(类别+1)和4*(类别+1)
train.prototxt
中以下三处 9
改为 类别数加1
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': 9"
}
}
python_param {
module: 'rpn.proposal_target_layer'
layer: 'ProposalTargetLayer'
param_str: "'num_classes': 9"
}
inner_product_param {
num_output: 9
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
train.prototxt
中36
改为4*(类别数+1)
inner_product_param {
num_output: 36
weight_filler {
type: "gaussian"
std: 0.001
}
bias_filler {
type: "constant"
value: 0
}
}
同样的对 test.prototxt
做相应的修改
9
改为 类别数加1
inner_product_param {
num_output: 9
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
36
改为4*(类别数+1)
inner_product_param {
num_output: 36
weight_filler {
type: "gaussian"
std: 0.001
}
bias_filler {
type: "constant"
value: 0
}
}
4)删除
/home/path/py-faster-rcnn-urine/data/cache/
中的缓存(训练的时候会有)
5)删除
/home/path/py-faster-rcnn-urine/data/VOCdevkit2007/annotations_cache/
中的缓存,测试的时候会有
6)预训练模型
下载相应的预训练模型到如下目录,比如res101的RES101.v2.caffemodel
/home/path/py-faster-rcnn-urine/data/imagenet_models/
6)训练
cd /home/path/py-faster-rcnn-urine
./experiments/scripts/ 0 RES101 pascal_voc
训练好的模型保存在如下目录
/home/path/py-faster-rcnn-urine/output/faster_rcnn_end2end/voc_2007_trainval/
会自动测试计算mAP
3 模型可视化
caffe深度学习网络(.prototxt)在线可视化工具:Netscope
Editor
网址:http://ethereon.github.io/netscope/#/editor
在左边的黑色编辑器内复制网络的XXX.prototxt
文件内容,按 Enter+Shift
就会出现右边的网络结构
很方便的哟
参考
【1】Caffe学习系列——6使用Faster-RCNN进行目标检测(VGG_CNN_M_1024 + 工作目录简介 )
【2】Faster RCNN 训练自己的检测模型(error1)