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

本文详细解析Faster R-CNN的训练过程,包括数据预处理如何生成图像数据,以及在Tensorflow中Anchor目标层的工作原理,涉及到图像的缩放、定位和锚点的正负样本筛选与回归目标计算。
摘要由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框

Faster R-CNN(区域卷积神经网络)是一种流行的目标检测算法,它结合了Region Proposal Network (RPN) 和 Fast R-CNN 的优点。如果你想在PyTorch上使用Faster R-CNN来训练自己的数据集,你需要遵循以下步骤: 1. 数据准备:首先,你需要准备标注好的训练图像和相应的边界框(BBox)。PASCAL VOC、COCO等都是常见的目标检测数据集,如果你有自己的数据,需要将其转换成标准格式,如XML或YOLO的txt文件。 2. 准备库:安装必要的库,包括PyTorch、Detectron2(基于Faster R-CNN的库)、torchvision,以及用于数据处理的工具如`xml.etree.ElementTree`(如果需要解析XML)。 3. 加载预训练模型:下载并加载预训练Faster R-CNN模型,比如COCO模型,作为起点,这将为你的网络提供基础结构。 4. 定义自定义数据模块:创建一个新的数据模块,继承自Detectron2的`DatasetMapper`,并针对你的数据集调整输入大小、颜色空间转换等参数。 5. 训练配置:编写一个训练配置文件,指定优化器、学习率策略、迭代次数、批大小等参数,并指明你的模型路径。 6. 实现训练循环:使用Detectron2的`DefaultTrainer`类,设置数据模块、模型、配置和其他训练选项,然后运行训练循环。 ```python from detectron2.engine import DefaultTrainer # 创建训练器实例 trainer = DefaultTrainer( model="COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x", data_loader_train=..., data_loader_val=..., cfg=cfg, # 自定义训练配置 ) # 开始训练 trainer.train() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值