faster_rcnn自己的理解

在这里插入图片描述
主干抽取网络可以是resnet50,vgg之类的都可以,得到1,1024,38,38的特征A
RPN过程:
特征A会先进行一个简单的减少通道的卷积:1,1024,38,38 -> 1,512,38,38 得到特征B
特征B回归坐标点:1,512,38,38 -> 1,9* 4,38,38 9是一个格子anchor框的数量,4是4个坐标点,转化过程是卷积
特征B回归分类:1,512,38,38-> 1,9*2,38,38 2的意思是是否存在物体

将上面2个reshape成我们需要的样子:
rpn_locs: 1,36,38,38 -> 1,38* 38* 9,4 -> 1,12996,4
rpn_scores: 1,18,38,38 -> 1,38 *38 *9,2 -> 1,12996,2

对rpn_scores进行softmax,得到分类得分rpn_softmax_scores,存在物体得分rpn_fg_scores

按照特征图网格(38 *38)大小,生成anchor框,一个格子9个anchor框,一共生成38 *38 *9 =12996个anchor框。每个anchor框都有xyxy

将rpn_locs和规则生成的anchor,rpn_locs相当于变化值。anchor+变化值就等于预测出来回归框roi(xyxy形式), 生成的回归框位置点不能超出图像的宽高,生成的回归框宽高也不能比16小

然后将roi按存在物体的softmax得分排序,取前12000个。可以不足,
再进行过滤,要是存在物体的softmax得分小于0.7就过滤掉。这个过程nms。最后剩下来的取前2000个,得到新的roi (2000,4),一个batch有多少个图,就用多少个roi组成一个rois(type=list)
这2000个建议框就是我们的proposals了

小结:
通过rpn我们得到
rpn_locs:根据特征预测的偏移量 ,
rpn_scores:根据特征预测的类别预测,
rois:预测出来回归框可能存在物体的2000个框,
roi_indices:序号,
anchor:所有anchor框

创建真实框标签:
所有anchor和真实的bbox进行计算,得到:

  1. anchor是偏向那个真实框argmax_ious
  2. anchor与对应bbox的iou值max_ious,
  3. 真实框bbox与最有可能的几个anchor(bbox与anchor的iou的为最大值的anchor)的序号gt_argmax_ious

制作样本:
要是max_ious<0.3那就判定为负样本。那些gt_argmax_ious就判定为正样本,再加上max_ious>0.7的判断是正样本。看一下正样本的数量是否大于128,大于了就去掉一些(随机去掉就行)。正样本可以少,但是不能超。负样本数量就是256-正样本数量。所以负样本可能会挺多的。2000个框除了样本集,其他样本就都是忽略样本了

得到max_ious和label([12996,1]都是些-1,0,1的标签)

计算损失:
然后计算真实box与anchor之间,应该回归的dx,dy,dw,dh,然后这4个堆叠起来就是gt_rpn_loc
用rpn_loc和gt_rpn_loc计算smoothl1损失
用rpn_score和gt_rpn_label(真实框的标签)计算交叉熵损失

另外一条支路:
RPN得到的rois和bbox计算iou。得到

  1. gt_assignment:2000个建议框计算出来偏向那个真实框
  2. max_iou:建议框与偏向的真实框的iou值。
  3. gt_roi_label:生成标签标记,标记的都是0。其shape为[2000+1,],1是保证至少有一个是背景类

制作精细样本
选max_iou大于0.5的,得到对应的索引pos_index,至少应有min(32,pos_index.size)正样本,打乱建议正样本的序号,要是max_iou在0~0.5的iou记为neg_index,至少选128-正样本个负样本。取出正负样本对应的序号,要是正样本就将对应label标签记录为2,其他的标记为0,取出128个样本sample_roi

将预测出来sample_roi与bbox计算出dx, dy, dw, dh,最后归一化一下,得到gt_roi_loc

sample_roi:选出来的样本[128,4]
gt_roi_loc:样本与真实框计算得出dx, dy, dw, dh
gt_roi_label:128个样本的标签

最后
将得到的特征1,1024,38,38与128个样本做一个ROI池化,得到pool:[128,1024,14,14],然后classifier,就是一些卷积bn激活下采样。得到fc7:[128,2048,1,1],再改变形状为[128,2048],最后直接线性变化得到roi_cls_locs:[128,num_class*4]这是位置。分类也是[128,2048]->roi_scores:[128,num_class+1] num_class是要预测的类别,1是背景类

roi_cls_loc[128,12]改变形状为[128,3,4],截取了一部分成为roi_loc[128,4]
得到roi_loc与gt_roi_loc计算smooth_l1损失。
roi_score和 gt_roi_label计算交叉熵损失
最后2个阶段的损失都加起来就是全部的损失

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值