http://www.cnblogs.com/caffeaoto/p/6536482.html
主要参照这个教程改的
需要准备的文件:Annotation文件,图片,用来训练的图片名称list.txt
训练:
需要改的文件:
lib/datasets/下的pascal_voc.py,factory.py
data/faster_rcnn_models/下存放预训练好的模型,需要什么样的网络就到caffe model zoo下载相应的模型,我用了VGG_CNN_M_1024和resnet101
models/pascal_voc/下存放相应的模型配置文件,打开相应的train.prototxt
1、data层的num_classes: n (自己要训练的类别+1,1为背景)
2、roi_data层的num_classes:n
3、cls_score层的num_output:n
4、bbox_preda层的num_output : 4*n
启动网络:
在faster根目录下创建一个train_xx.sh脚本,输入以下内容,
python ./tools/train_net.py --gpu 1 --solver models/hs/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/VGG_CNN_M_1024.v2.caffemodel --imdb hs --iters 80000 --cfg experiments/cfgs/faster_rcnn_end2end.yml
指定参数:
train_xx.sh、faster_rcnn_end2end.yml、train_net.py、solver.prototxt都可以指定相关的参数,如果没有特别要求,后三个文件可以不用改
train_xx.sh:
train_net.py是网络的训练文件,之后的参数都是附带的输入参数
--gpu 代表机器上的GPU编号,如果是nvidia系列的tesla显卡,可以在终端中输入nvidia-smi来查看当前的显卡负荷,选择合适的显卡
--solver 代表模型的配置文件,train.prototxt的文件路径已经包含在这个文件之中
--weights 代表初始化的权重文件,这里用的是Imagenet上预训练好的模型,中型的网络我们选择用VGG_CNN_M_1024.v2.caffemodel
--imdb 这里给出的训练的数据库名字需要在factory.py的_sets中,我在文件里面有_sets[‘hs’],train_net.py这个文件会调用factory.py再生成hs这个类,来读取数据
faster_rcnn_end2end.yml
可以根据自己的需要在这个文件中添加配置,例如在训练时进行模型快照的迭代次数,是否翻转等,相应的参数可以参考py-faster-rcnn / lib / fast_rcnn / config.py。
不需要更改config.py,在faster_rcnn_end2end.yml中添加语句即可
solver.prototxt
进一步修改网络训练中的学习速率,步长,gamma值,以及输出模型的名字,也可以训练到一定步数先保存一次
接着在根目录下运行train_xx.sh就可以训练了
训练中遇到的问题
1、
这是编码问题造成的,list.txt要用默认的ANSI编码,如果特意改容易出错
2、
File "/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 108, in append_flipped_images
assert (boxes[:, 2] >= boxes[:, 0]).all()
AssertionError
出现这个问题说明图片标注的时候存在错误
修改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
3、
4、
TypeError: slice indices must be integers or None or have an __index__ method
numpy v1.12.0不支持浮点数
lib/proposal_target_layer.py
将以下行添加到第126 行之后,
start=int(start)
end=int(end)
在166行之后加上,
fg_rois_per_this_image=int(fg_rois_per_this_image)
5、
6、
CLASSES = ('__background__',
'aeroplane', 'bicycle', 'bird', 'boat',
'bottle', 'bus', 'car', 'cat', 'chair',
'cow', 'diningtable', 'dog', 'horse',
'motorbike', 'person', 'pottedplant',
'sheep', 'sofa', 'train', 'tvmonitor')
这部分修改为自己训练的类
NETS = {'vgg16': ('VGG16',
'VGG16_faster_rcnn_final.caffemodel'),
'zf': ('ZF',
'ZF_faster_rcnn_final.caffemodel')}
如果用的不是默认的网络,需要添加上网络的相关信息
'vgg16'是参数名,'VGG16',对应models/pascal_voc下相应的文件夹名,'VGG16_faster_rcnn_final.caffemodel'对应data/faster_rcnn_models下训练好的模型
parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]',
choices=NETS.keys(), default='vgg16')
可以将自己用的网络设置为默认
prototxt = os.path.join(cfg.MODELS_DIR, NETS[args.demo_net][0],
prototxt #'rfcn_alt_opt_5step_ohem', 'rfcn_test.pt')
caffemodel = os.path.join(cfg.DATA_DIR, 'faster_rcnn_models',
NETS[args.demo_net][1])
改为自己用的caffemodel和prototxt
im_names就设置为自己的图片
运行demo.py
报错:
F0628 21:11:11.389936 9218 net.cpp:829] Cannot copy param 0 weights from layer 'cls_score'; shape mismatch. Source param shape is 2 2048 (4096); target param shape is 21 2048 (43008). To learn this layer's parameters from scratch rather than copying from a saved net, rename the layer.
将prototxt对应文件里,21改为自己训练的类别+1,84改为(自己训练的类别+1)*4