Ubuntu 16.0.4 + GPU + caffe + python + py-faster-rcnn下Faster-RCNN训练自己的数据集(交替优化训练)

环境:

系统: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网络模型的交替优化训练训练自己的数据集为例

  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

  2. 修改py-faster-rcnn/lib/datasets/pascal_voc.py


    标注中不用大写字母和中文字符,否则需要另外修改
  3. 修改后的minibatch.py
    minibatch.py中,numpy.round函数,只进行四舍五入,不进行取整,导致以该结果进行索引时会报错。
    _get_bbox_regression_labels(bbox_target_data, num_classes)函数中start类型定义错误会报错。
    修改如下:

三、交替优化训练

  1. 删除缓存文件

    (1) py-faster-rcnn/output文件夹删除,

    (2)删除py-faster-rcnn/data/cache中的文件

    (3)删除py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件

  2. 开始训练
    打开打开终端,去到py-faster-rcnn根目录下,运行以下的语句
    ./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
    
    出现以下这种界面,那就是训练成功了。

四、测试

  1. 创建自己的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()
    
  2. 输出的模型
    训练好的模型在py-faster-rcnn\output\目录下
    将output\里你刚刚训练好的caffemodel复制到data\faster_rcnn_models

  3. 结果
    在py-faster-rcnn/tools目录下,执行以下命令

    ./demo.py

    即可得到结果

参考

  1. py-faster-rcnn使用笔记——训练自己的数据集、测试图像与视频、计算mAP


 

猜你喜欢

转载自blog.csdn.net/qq_34809033/article/details/84773722
今日推荐