环境:
系统:Ubuntu 16.0.4
GPU: NNIFIA GTX1080Ti
框架:caffe
语言:python
Faster RCNN源码:https://github.com/rbgirshick/py-faster-rcnn
一、PASCAL VOC 2007/2012格式数据集制作
PASCAL VOC 2007/2012数据集的制作:VOC2007格式数据集制作
将制作的数据集放在py-faster-rcnn-master\data下。最后完整的路径是py-faster-rcnn-master\data\VOCdevkit2007
二、训练自己的数据集
Faster RCNN默认有三种网络模型 ZF(小)、VGG_CNN_M_1024(中)、VGG16 (大)
每一个Faster RCNN模型都有两种训练方式:
- 一种是交替优化方法(alternating optimization),即训练两个网络,一个是rpn,一个是fast rcnn,总计两个stage,每个stage各训练一次rpn和fast rcnn。
- 另外一种训练方式为近似联合训练(approximate joint training),也称end to end的训练方式,训练过程中只训练一个权重网络,训练速度有可观的提升,而训练精度不变。
此处以ZF网络模型的交替优化训练训练自己的数据集为例
- 修改模型配置文件
以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 - 修改py-faster-rcnn/lib/datasets/pascal_voc.py
标注中不用大写字母和中文字符,否则需要另外修改 - 修改后的minibatch.py
minibatch.py中,numpy.round函数,只进行四舍五入,不进行取整,导致以该结果进行索引时会报错。
_get_bbox_regression_labels(bbox_target_data, num_classes)函数中start类型定义错误会报错。
修改如下:
三、交替优化训练
- 删除缓存文件
(1) py-faster-rcnn/output文件夹删除,
(2)删除py-faster-rcnn/data/cache中的文件
(3)删除py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件
- 开始训练
打开打开终端,去到py-faster-rcnn根目录下,运行以下的语句
出现以下这种界面,那就是训练成功了。./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
四、测试
- 创建自己的demo.py
如果想方便的话,直接把已经有的demo.py复制一份,并把它的标签改为自己的标签,把模型改为自己的模型。这是我的demo,类别和模型部分,供参考
CLASSES = ('__background__', 'knife') # 第一个背景类不需要修改,其它修改为自己识别的类 NETS = {'vgg16': ('VGG16', # 在这里添加自己的训练出来的模型 'VGG16_faster_rcnn_final.caffemodel'), 'vgg1024':('VGG_CNN_M_1024', 'VGG_CNN_M_1024_faster_rcnn_final.caffemodel'), 'zf': ('ZF', 'ZF_faster_rcnn_final.caffemodel')}
def parse_args(): """Parse input arguments.""" parser = argparse.ArgumentParser(description='Faster R-CNN demo') parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]', default=0, type=int) parser.add_argument('--cpu', dest='cpu_mode', help='Use CPU mode (overrides --gpu)', action='store_true') parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]', choices=NETS.keys(), default='ZF') # 将这里的默认改为ZF,因为我们使用的是ZF args = parser.parse_args() return args
在这个部分,将你要测试的图片写在im_names里,并把图片放在data\demo这个文件夹下。
if __name__ == '__main__': cfg.TEST.HAS_RPN = True # Use RPN for proposals args = parse_args() prototxt = os.path.join(cfg.MODELS_DIR, NETS[args.demo_net][0], 'faster_rcnn_alt_opt', 'faster_rcnn_test.pt') # 这里修改为自己的测试prototxt caffemodel = os.path.join(cfg.DATA_DIR, 'faster_rcnn_models', NETS[args.demo_net][1]) if not os.path.isfile(caffemodel): raise IOError(('{:s} not found.\nDid you run ./data/script/' 'fetch_faster_rcnn_models.sh?').format(caffemodel)) if args.cpu_mode: caffe.set_mode_cpu() else: caffe.set_mode_gpu() caffe.set_device(args.gpu_id) cfg.GPU_ID = args.gpu_id net = caffe.Net(prototxt, caffemodel, caffe.TEST) print '\n\nLoaded network {:s}'.format(caffemodel) # Warmup on a dummy image im = 128 * np.ones((300, 500, 3), dtype=np.uint8) for i in xrange(2): _, _= im_detect(net, im) im_names = ['000016.jpg','000024.jpg'] # 这里修改为自己需要识别的图片,并将其放入data/demo目录下 for im_name in im_names: print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' print 'Demo for data/demo/{}'.format(im_name) demo(net, im_name) plt.show()
-
输出的模型
训练好的模型在py-faster-rcnn\output\目录下
将output\里你刚刚训练好的caffemodel复制到data\faster_rcnn_models -
结果
在py-faster-rcnn/tools目录下,执行以下命令./demo.py
即可得到结果
参考