Faster RCNN train_faster_rcnn_alt_opt.py

def get_roidb(imdb_name, rpn_file=None):

a) 该函数返回的roidb已经经过翻转数据增强操作,即将图像翻转;同时为每张图像添加了一些有用备注信息

b) 之前遇到一个问题,在imdb.py中,函数append_flipped_images(self)中, 我发现要取self.roidb中的元素,那么,self.roidb中的元素怎么获得?其实关键就在这行代码: boxes = self.roidb[i][‘boxes’].copy(), self.roidb是一个属性,在它内部可以调用相应的roidb_handler来生成roidb,比如在‘Stage 1 RPN, init from ImageNet model’阶段,用的就是‘gt_roidb(self)’方法(在pascal_voc.py中定义).

def get_roidb(imdb_name, rpn_file=None):
    imdb = get_imdb(imdb_name) #返回一个pascal_voc类对象
    print 'Loaded dataset `{:s}` for training'.format(imdb.name)

    # 设置proposals的生成方法,在‘Stage 1 RPN, init from ImageNet model’阶段,为‘gt’方法
    #注意, 这里仅仅是设置了生成方法,并没有真正调用生成方法,第一次调用应该发生:
    #get_training_roidb() --> append_flipped_images()时的这行代码:
    #“boxes = self.roidb[i]['boxes'].copy()”
    imdb.set_proposal_method(cfg.TRAIN.PROPOSAL_METHOD)
    print 'Set proposal method: {:s}'.format(cfg.TRAIN.PROPOSAL_METHOD)
    if rpn_file is not None:
        imdb.config['rpn_file'] = rpn_file
    roidb = get_training_roidb(imdb) #返回roidb,此roidb已经经过翻转数据增强操作append_flipped_images()和附加信息(image,height,max_classes等等)备注操作prepare_roidb()
    return roidb, imdb

def train_rpn(queue=None, imdb_name=None, init_model=None, solver=None, max_iters=None, cfg=None) 训练RPN

def train_rpn(queue=None, imdb_name=None, init_model=None, solver=None,
              max_iters=None, cfg=None):
    """Train a Region Proposal Network in a separate training process.
    """

    # Not using any proposals, just ground-truth boxes
    cfg.TRAIN.HAS_RPN = True #这里对cfg.TRAIN.HAS_RPN重现设置,使得,只有在训练RPN的时候HAS_RPN才为true,其他情况下为false(config.py文件里默认设置为false)
    cfg.TRAIN.BBOX_REG = False  # **applies only to Fast R-CNN bbox regression**
    cfg.TRAIN.PROPOSAL_METHOD = 'gt'
    cfg.TRAIN.IMS_PER_BATCH = 1
    print 'Init model: {}'.format(init_model)
    print('Using config:')
    pprint.pprint(cfg)

    import caffe
    _init_caffe(cfg)
    #get_roidb会调用get_training_roidb, get_training_roidb会调用append_flipped_images来添加镜像图片来做数据增强;同时get_training_roidb还会调用prepare_roidb来为roidb添加一些信息
    roidb, imdb = get_roidb(imdb_name)
    print 'roidb len: {}'.format(len(roidb))
    output_dir = get_output_dir(imdb)
    print 'Output will be saved to `{:s}`'.format(output_dir)

    # 返回训练得到的RPN模型路径的列表
    model_paths = train_net(solver, roidb, output_dir,
                            pretrained_model=init_model,
                            max_iters=max_iters)
    # Cleanup all but the final model 只保留final model
    for i in model_paths[:-1]:
        os.remove(i)
    rpn_model_path = model_paths[-1] # 值保留最后snapshot的模型
    # Send final model path through the multiprocessing queue 实际上返回的是一个字符串:filename
    queue.put({'model_path': rpn_model_path})

def rpn_generate(queue=None, imdb_name=None, rpn_model_path=None, cfg=None, rpn_test_prototxt=None):

def rpn_generate(queue=None, imdb_name=None, rpn_model_path=None, cfg=None,
                 rpn_test_prototxt=None):
    """Use a trained RPN to generate proposals.
    """
    # 设置cfg文件
    cfg.TEST.RPN_PRE_NMS_TOP_N = -1     # no pre NMS filtering
    cfg.TEST.RPN_POST_NMS_TOP_N = 2000  # limit top boxes after NMS
    print 'RPN model: {}'.format(rpn_model_path)
    print('Using config:')
    pprint.pprint(cfg)

    import caffe
    _init_caffe(cfg)

    # NOTE: the matlab implementation computes proposals on flipped images, too.
    # We compute them on the image once and then flip the already computed
    # proposals. This might cause a minor loss in mAP (less proposal jittering).
    imdb = get_imdb(imdb_name)
    print 'Loaded dataset `{:s}` for proposal generation'.format(imdb.name)

    # Load RPN and configure output directory
    # 创建一个Net实例对象,以下为个人观点,对boost库以及wraper不熟,只说说个人理解,如有错误,后续更正,欢迎指正: a)会调用_caffe.cpp里面的Net_Init_Load函数,_caffe.cpp里面`.def("__init__", bp::make_constructor(&Net_Init_Load))`,应该是将Net_Init_Load与__init__构造器绑定,所以在创建caffe.Net对象的时候,会调用Net_Init_Load,终端上就会输出网络的初始化信息同时从pretrainedmodel上copy source layers
    rpn_net = caffe.Net(rpn_test_prototxt, rpn_model_path, caffe.TEST)
    output_dir = get_output_dir(imdb)
    print 'Output will be saved to `{:s}`'.format(output_dir)
    # Generate RPN proposals on all images in an imdb.
    #imdb_proposals函数在generate.py文件中
    #rpn_proposals是一个列表的列表,每个子列表
    rpn_proposals = imdb_proposals(rpn_net, imdb)
    # Write proposals to disk and send the proposal file path through the
    # multiprocessing queue
    # splitext函数分离文件的文件名和拓展名
    rpn_net_name = os.path.splitext(os.path.basename(rpn_model_path))[0]
    rpn_proposals_path = os.path.join(
        output_dir, rpn_net_name + '_proposals.pkl')
    with open(rpn_proposals_path, 'wb') as f:
        cPickle.dump(rpn_proposals, f, cPickle.HIGHEST_PROTOCOL) # 将python专有的数据结构(比如rpn_proposals是一个列表)序列化,存储在磁盘中
    print 'Wrote RPN proposals to {}'.format(rpn_proposals_path)
    #返回生成的rpn proposal的存储地址。
    queue.put({'proposal_path': rpn_proposals_path})

def train_fast_rcnn(queue=None, imdb_name=None, init_model=None, solver=None, max_iters=None, cfg=None, rpn_file=None):

def train_fast_rcnn(queue=None, imdb_name=None, init_model=None, solver=None,
                    max_iters=None, cfg=None, rpn_file=None):
    """Train a Fast R-CNN using proposals generated by an RPN.
    """

    cfg.TRAIN.HAS_RPN = False           # not generating prosals on-the-fly
    cfg.TRAIN.PROPOSAL_METHOD = 'rpn'   # use pre-computed RPN proposals instead
    cfg.TRAIN.IMS_PER_BATCH = 2
    print 'Init model: {}'.format(init_model)
    print 'RPN proposals: {}'.format(rpn_file)
    print('Using config:')
    pprint.pprint(cfg)

    import caffe
    _init_caffe(cfg)

    roidb, imdb = get_roidb(imdb_name, rpn_file=rpn_file)
    output_dir = get_output_dir(imdb)
    print 'Output will be saved to `{:s}`'.format(output_dir)
    # Train Fast R-CNN
    model_paths = train_net(solver, roidb, output_dir,
                            pretrained_model=init_model,
                            max_iters=max_iters)
    # Cleanup all but the final model
    for i in model_paths[:-1]:
        os.remove(i)
    fast_rcnn_model_path = model_paths[-1]
    # Send Fast R-CNN model path over the multiprocessing queue
    queue.put({'model_path': fast_rcnn_model_path})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值