faster-rcnn的训练流程及其如何训练自己的数据集(二)

接着上篇继续,上篇写到开始调用Solver的train_model函数了。OK ! ! ! 3.train_net()中train_model()的调用前面已经知道了roidb提供了标注信息,imdb提供了一个数据基类,里面有一些工具接口。那么实际网络跑起来的时候,也需要准备图像数据的输入。因此接下来关注Solver的train_model成员函数中每次图像数据是如何生成的。data_layer ...
摘要由CSDN通过智能技术生成


接着上篇继续,上篇写到开始调用Solver的train_model函数了。OK ! ! !

3.train_net()中train_model()的调用

前面已经知道了roidb提供了标注信息,imdb提供了一个数据基类,里面有一些工具接口。那么实际网络跑起来的时候,也需要准备图像数据的输入。因此接下来关注Solver的train_model成员函数中每次图像数据是如何生成的。

data_layer = get_data_layer(self.roidb, self.imdb.num_classes)首先生成一个data_layer。进入到get_data_layer()函数中然后layer = RoIDataLayer(roidb, num_classes),调用了RoIDataLayer()函数(该函数在roi_data_layer/layer.py)。类初始化参数为上面得到的roidb和类别数。在RoIDataLayer()函数中,首先初始化对象,在初始化中self._shuffle_roidb_inds()。首先生成了一个len(roidb)长度的标号的乱序(比如说有5张图片,那么一个标号乱序就可以写为[2,3,1,0,4])self._cur = 0初始化当前游标为0。好了此时data_layer生成。

程序接着往下走,接下来是一系列网络的输出,损失定义。后面再看,我们看到真正训练时的每次循环,一句blobs = data_layer.forward()这句已经准备好了传给feed_dict的所有数据,所以很关键。每次forward都调用了   _get_next_minibatch()函数,这个函数又调用了_get_next_minibatch_inds()函数,这个流程是:

(HAS_RPN =True)如果当前游标已经到达标号乱序的尽头,即每张图像都遍历了一遍,就重新生成一个乱序,重置游标为0,然后截取乱序的[self._cur:self._cur + cfg.TRAIN.IMS_PER_BATCH]部分,并令游标向前推进IMS_PER_BATCH。我的程序要求了faster rcnn每个BATCH只有一张图片,因此IMS_PER_BATCH=1。之后回到get_minibatch(minibatch_db, self._num_classes)函数中,在该函数中,random_scale_inds是为batch中的每个图像随机产生一个从SCALE(参数)中取SCALE的下标。这是一个list和roidb list长度一样,因为SCALE=[600],因此每个图像用的scale都是600。BATCH_SIZE = 128(每个batch的boxes的数量),是ROI的batch.注意区分上面的IMS_PER_BATCH= 1是图像的batch.前者要被后者整除。rois_per_image = 128(每张图片的boxes数量),fg_rois_per_image=128*0.25=32(每张图片中前景的boxes的数量)提醒一下,我用绿色标记的为selective_search方法的时候的参数。而实际用的rpn方法。所以上面参数对后面的没影响,只是提一下。

然后im_blob, im_scales = _get_image_blob(roidb, random_scale_inds)调用了_get_image_blob()函数,输入的参数是roidb和random_scale_inds返回的是im_blob和im_scales。首先根据roidb读入图像,如果roidb的flipped属性是True,则水平翻转。opencv通道顺序是BGR,对应的PIXEL_MEANS也要符合这个顺序。在调用prep_im_for_blob(im, cfg.PIXEL_MEANS, target_size,cfg.TRAIN.MAX_SIZE),其中target_size就是图像对应的scale,此处为600,cfg.TRAIN.MAX_SIZE=1000,这个函数先将图像减去均值,然后再尝试用target_size/短边长度=scale,在用scale*长边。如果大于max_size则scale为maxsize/长边长度。在使用opencv将图像resize。该函数返回的是处理后的图像和该图resize所使用的scale。这样循环调用per_im_for_blob后,得到processed_ims和im_scales的list。然后blob = im_list_to_blob(processed_ims)将processed_ims传递个im_list_to_blob函数。这个函数先找到这批图像的最大短边和最大长边,作为每个blob的高和宽,初始化一个BATCH*H*W*3的blob,依次将每个图像填入,这就是blob,空白位置用0填充,因为这里每个图像batch只有一张图像,因此没有空白位置。

再次回到get_minibatch函数,经过上述步骤,我们已经得到了关于图像batch的im_blob(BATCH*H*W*3)和每个图像resize使用的im_scale(list),注意每个im_blob的长宽可能不一样,是因为根据图像设定的。

返回的blob是一个dict。它包含的字段为:'data':im_blob。这就是上面的im_blob。另外还要提取不是背景的gt框

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值