faster-rcnn理解

FR-CNN流程

(1)FR-CNN
在这里插入图片描述
在这里插入图片描述
faster-rcnn模型主要有三个模块,一个是 extractor 模块,一个是 RPN 模块,一个是 classifier head模块。以 backbone 为 resnet50 为例,extractor 模块就是resnet50的前三层base_features = list([model.conv1, model.bn1, model.relu, model.maxpool, model.layer1, model.layer2, model.layer3]),分类器就是rensnet50除去 extractor 模块后剩下的classifier = list([model.layer4, model.avgpool]).
(2) 整个流程如下:如果图片是 800800 的分辨率,通过 extractor 后得到的共享的feature map是 [2024, 50, 50],随后这个feature map经过RPN网络,RPN网络包括一层 33 的卷积层+分类分支(11卷积)+定位分支(11卷积)。对于定位分支,[2024, 50, 50] 的 feature map 经过33卷积和11卷积后变成[50509, 4]=[22500, 4],也就是说得到了22500个可能的框(严格来说,得到的只是22500个框的中心偏移和宽高偏移量),记为rpn_loc,然后将这些偏移量分别添加到22500个anchor base(5050的feature map每个点都有9个以该点为中心的anchor base,因为50是800经过16次降采样得到的,所以5050的map上一个11大小的区域就对应原图1616大小的区域,也就是说最后的框一定会大于1616)上得到22500个proposal bbox,随后将宽高小于1616的proposal bbox给剔除掉,保留下来的proposal bbox的个数记为A。
然后是分类分支,这个分支是一个二分类,只负责分类前景(有 object)和背景,[2024, 50, 50] 的 feature map 经过33卷积和11卷积后变成[50509, 4]=[22500, 2],[:, 1]表示的就是前景的概率,记为rpn_score。随后给前景的概率进行排序,根据这个排序和人为设定的proposal bbox个数B,从A中取出B个满足的paoposal bbox的个数,然后这B个proposal bbox进行nms运算,nms_thresh=0.7,得到最终剩下的proposal bbox个数,记为C,最后再取C中前D(600)个proposal bbox作为RPN网络最后的proposal bbox,即ROI。这就是RPN网络选取ROI区域的一个过程。
(3)RPN网络的回归定位和二分类损失的计算。
损失的计算是对单张图片进行的,然后将所有损失进行叠加。首先将一张图片真实的标签bbox和22500个anchor base分别做 iou 计算,找出每个anchor base对应的iou最大的真实框序号(真实框可能有多个),每个anchor base对应的iou最大的真实框的iou,记为max_iou(这是个22500维的向量),每个真实框对应的最大的先验框的序号(有几个真实框就有几个序号)。随后将 max_iou < 负样本阈值0.3的预测框rpn_loc设置成负样本,将max_iou > 正样本阈值0.7的预测框rpn_loc设置为正样本,(通过一个[22500,1]维的gt_rpn_label向量表示,正样本相应位置设置为1, 负样本设置为0,其他的为-1)。(正负样本和为256,比例为1:1,如果正样本不够128个就补偿相应的负相本,如果正样本数量超过128个就随机选择128个作为正样本),相当于在22500个框里面按上面的方法选择了256个正负样本。随后通过计算22500个anchor base和真实框之间的定位偏移gt_rpn_loc([22500, 4],里面存的是偏移量),随后根据rpn_loc_loss = _fast_rcnn_loc_loss(rpn_loc, gt_rpn_loc, gt_rpn_label, self.rpn_sigma)计算回归损失。回归损失计算过程如下:首先从预测框rpn_loc中挑出正样本rpn_loc[gt_rpn_label>0],并将正样本对应的 gt_rpn_loc挑出来,意思就是根据anchor base和真实框的iou结果预测框应该接近这个结果,这个边框的偏移损失rpn_loc_losssmooth_l1_loss计算。前景背景的二分类误差rpn_cls_loss用交叉熵损失计算,即rpn_cls_loss=F.cross_entropy(rpn_score, gt_rpn_label, ignore_index=-1).
(3)随后是对 挑选出来的 600 个 ROI bbox进行损失的计算。计算方法和上面计算回归和分类的方法类似,首先计算ROI bbox和真实的bbox的iou,并获得每个ROI框对应的iou最高的真实bbox,用gt_assign表示,获得每个ROI框和真实的bbox的iou的最大值max_iou([601,]维的),然后从max_iou中挑出满足iou阈值的正负样本sample_roi,这次的正负样本和为128,正样本和负样本的数量处理和上面是一样的,然后找出这128个正负ROI框匹配的最好的真实bbox,bbox[gt_assignment[keep_index],计算这128个ROI框和这128个相应的匹配的最好的框进行求偏移计算,得到gt_roi_loc,然后得到这128个ROI框对应的最好的真实框的类别标签gt_roi_label,注意类别要+1,因为这里引入了一个背景类0。随后将这张图片的共享特征即[1024, 50, 50]的特征图和这张图片的选出来的128个ROI框一起送到FRCNN的ROIhead中(即将图片和预测框都送到ROIHead中处理),将128个ROI框匹配到 50 × 50 50\times 50 50×50的map中(即除以16),然后将ROI框和feature map进行一个ROIPooling操作pool = self.roi(x, indices_and_rois), 操作后的feature map维度为[128, 1024, 14, 14],相当于用ROI框将公用特征层的区域进行截取,截取后经过ROIPooling成了一系列14*14大小的区域,经过classifier后维度变成了roi_cls_loc.shape torch.Size([1, 128, 84])–>[128, 21, 4],也就是每个类别都会有一个相应的框,最终根据ROI框的种类,取出对应的回归预测结果,每个ROI框的类别概率roi_score.shape torch.Size([1, 128, 21]),最后计算这一部分ROI框的损失,roi_loc_loss = _fast_rcnn_loc_loss(roi_loc, gt_roi_loc, gt_roi_label.data, self.roi_sigma),还是用_smooth_l1_loss损失,随后计算分类损失,这里就是21分类了。roi_cls_loss = nn.CrossEntropyLoss()(roi_score[0], gt_roi_label).最后将定位损失相加、分类损失相加分别得到训练该图片时的损失。最后在按同样的过程训练该batch里所有图片,最后将损失求平均。然后梯度回传。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值