strong-weak-faster-rcnn整体流程(pytorch)思路

code: https://github.com/VisionLearningGroup/DA_Detection

代码相当于在faster-rcnn的第一阶段加上了2个分支的判别器,低级特征的判别和高级特征的判别器,因此先详解faster-rcnn的流程,然后笔记中画出来strong-weak的整体流程

1、训练过程:本程序虽然有两处具体处理batch的数据(1、im_list_to_blob()中取一个batch中数据的宽和高的最大值作为一个batch的shape;2、__getitem__()中对batch的数据根据target_ratio进行crop,宽比高<0.5,crop成0.5;>2,crop

成2;其余不变;),但是实际只能处理batch_size=1的输入;

这里只考虑输入batch是1的情况;

先是combined_roidb读取对应的数据的gt和相关信息组成roidb,然后过滤掉训练集中没有gt的图片(del roidb),真正训练时,通过dataloader读取sampler()的index的图片,这时是roibatchloader中的getitem函数具体取数据的操作,包括读取图片,rgb转成bgr,减去均值,并且短边resize到指定的600,长边等比例缩放,(一般程序是短边到600,长边不超过1200,不然是长边到1200,短边等比例缩放);gt也跟着等比例缩放,同时由于opt和mot数据的w/h在0.5和2之间,因此没有crop,然后删除gt中x1=x2或者y1=y2的gt,同时每张图片最多保留20个(可以自己设置)gt,,极端情况就是一张图片所有的gt都是0;将预处理后的数据和gt调用faster-rcnn处理,具体步骤,下采样16倍(feat_stride)到公共特征图,每个特征图的像素点上预设置9个(anchor_ratio*anchor_size)anchor,然后根据gt和预设的anchor的overlap得到正负样本,在anchor中这里不像rois中直接对预测坐标clip,防止越界,但是这里的anchor有一个容忍度,即容许坐标越界一定的范围(self._allowed_border,不过code中是设成0,因此也还是直接clip);根据配置文件中的相关阈值,一般设置>0.7是正样本(label是1),<0.3是负样本(label=0),其余是不关心的样本(label是-1),然后给没有符合条件的正样本的gt强制赋予一个正样本,保证gt至少有一个正样本,cfg.TRAIN.RPN_CLOBBER_POSITIVES参数为false,就是先设置负样本,然后正样本,这样正样本可以把负样本覆盖,true则相反,一般是false,保证gt至少一个正样本;这里通过cfg.RPN_batchsize决定正负样本的总数,还有超参数设置正负样本的比例;然后根据gt和anchor给正负样本设置类别的label和bbox_target其中bbox_target是相对值(dh,dw,dx,dy),训练时rpn就是通过对公共特征图经过conv或者fc得出预测值,然后计算第一阶段的loss,其中分类loss是考虑正负样本,bbox回归只计算正样本的loss,这里的smooth_L1_loss通过inside_weight(正样本是1,其余为0)得到正样本的loss,outside_weight是正样本和负样本是1/(正样本和负样本的个数),相当于loss中的lambda;注意第一阶段是前景背景的二分类和回归;然后对第一阶段的rpn预测的所有proposal坐标(预测的是相对值)在anchor上计算成原图绝对坐标,同时对坐标clip,防止越界;根据置信度和nms得到指定数目的rois(一般是256)作为第二阶段的bbox,rois是绝对坐标,还可以选择cfg[cfg_key].RPN_MIN_SIZE,根据im_scale计算min_size,然后过滤掉小于min_size(绝对坐标)的proposals,不过code中注释掉了;这里因为是前景背景的二分类,因此按照置信度和nms筛选时没有具体的类别,所以像行人检测或者密集物体时这一步会筛除掉很多相关交叠的预测,造成很多漏检;之后通过roi_pooling(因为rois是绝对坐标,因此这里传参时有1.0/16.0,说明公共特征图下采样了16倍)或者Align、crop在特征图上得到pool_height和pool_width的特征,一般是7*7,因此这一步让faster-rcnn不再需要输入图像同尺寸,之后对取出的rois对应的特征接上conv或者fc得到第二阶段的预测,proposal_target也是给第一阶段的输出rois分配label(根据gt和rois,rois是绝对坐标),根据label计算第二阶段的loss;其中第二阶段的label的bbox_target可以选择归一化(cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED),相关的均值和方差也在配置文件中,一般不用这个归一化;loss时inside和outside_weight都是在正样本时是1,第二阶段依然有正负样本的个数和比例的设置,一般>0.5是正样本,<0.25同时小于0.5是负样本;

从上看出,im_info中存储的图片预处理后的H,W和预处理的缩放scale,本程序的scale是一个,h和w是等比例缩放的,而真正用的im_info中主要是h和w用于clip框的坐标;而只有如果采用proposal的min_size时才会用到im_scale,不过这里没有用filter_boxes,因此im_scale只有在预处理图片时对gt做同处理了,其余地方没用到;

Test的时候计算ap等也是将预测的坐标缩放到原图尺寸,然后和缓存中annotations.pkl或者直接从xml文件中解析的gt进行计算;

im_info.data.resize_(data[1].size()).copy_(data[1])

 

      ##将预测的坐标缩放成原图尺寸上

      pred_boxes /= data[1][0][2].item()

 

同样在demo.py中用到了im_scale对预测的bbox做处理,因为需要在原图上画出预测值;

  for target_size in cfg.TEST.SCALES:

    im_scale = float(target_size) / float(im_size_min)

    # Prevent the biggest axis from being more than MAX_SIZE

    if np.round(im_scale * im_size_max) > cfg.TEST.MAX_SIZE:

      im_scale = float(cfg.TEST.MAX_SIZE) / float(im_size_max)

    im = cv2.resize(im_orig, None, None, fx=im_scale, fy=im_scale,

            interpolation=cv2.INTER_LINEAR)

    im_scale_factors.append(im_scale)

    processed_ims.append(im)

 

pred_boxes /= im_scales[0]

smooth_L1_loss的计算:https://blog.csdn.net/wfei101/article/details/79252021

2、测试过程:输入一张图片,模型检测输出cfg中设置的bbox个数,如300个框(第二阶段的输出),(模型的输出没有nms,模型本身只有在rpn得到roi时有nms操作,这时是前景背景2分类,所有nms是对所有的框,不考虑类别(潜在隐患:行人检测或者物体遮挡很严重时,在第一阶段前景背景rois的nms操作中,会造成很多漏检,这时的rois输入第二阶段也没用了,有漏检)),然后对这300个框,每个框有4*num_classes个坐标(本程序如果设置了class_agnost,则输出就是4个坐标,不考虑类别)和num_classes个score,程序中的score是softmax输出,坐标训练时是delta基础上减去均值,标准差后得到,因此需要逆向回去,然后根据预测的相对坐标在绝对坐标的rois上处理得到预测的坐标,然后根据im_info中的图像宽高clip预测的bbox的坐标;之后根据设定的阈值,逐类别对300个框操作,比如根据预测的第一类score筛选大于阈值的bbox,然后对第一类别的筛选后的bbox求nms,这是就是根据类别的nms,得到第一类别的bbox,同样的操作得到这张图片所有类别的bbox,因此可以知道这里的nms是按类别的nms,类别之间不用nms,因此有时候可视化可以看到bbox仍有很多overlap,但这是不同类别之间有overlap,不影响;而且也可以知道这种操作很可能出现一个bbox可能同时预测多个类别的情况,像一个bbox的多标签分类一样;

不过后续程序又将所有类别筛选后的bbox放到一起,根据score得到指定数目max_per_image = 100个的最终的bbox,这又可以变相的筛出一个bbox预测多个类别的情况,因为模型预测用的softmax,所有bbox在一起,根据置信度排序,不可能一个bbox预测多个类别都能排在前面,必然最后只能保留一个bbox预测一类的情况;最终的bbox个置信度存在二维列表中,[类别数,图片数]维度的列表,并保存成detection.pkl文件;

该程序的demo.py中输入图像减去均值,resize后测试,每个类别nms后没有在按照指定最大的max_per_image = 100筛选了,因此最后的按照数目再次筛选可要可不要,看情况;

3、下面是该代码数据预处理和im_info的使用流程:

4、strong-weak-faster-rcnn(pytorch),backbone是res101,预处理后输入256*512的数据,算法的整体流程如下,相当于在faster-rcnn的第一阶段加上了2个分支的判别器,低级特征的判别和高级特征的判别器:

5、个人觉得分割一般输入直接resize,但是检测是同比例resize,短边不超过600,或者长边不超过1200,应该是检测对物体尺寸敏感,直接resize可能造成瘦子变成胖子,影响人物检测和属性的判断;但是分割是像素点的分类,受物体尺寸影响不大,所以可以直接resize;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值