【目标检测系列】RPN(区域生成网络)流程详细解释 您所在的位置:网站首页 rp是什么面试方法 【目标检测系列】RPN(区域生成网络)流程详细解释

【目标检测系列】RPN(区域生成网络)流程详细解释

2024-06-17 16:14| 来源: 网络整理| 查看: 265

    看RPN网络基本是从faster-RCNN来的。看的有点迷糊。后来看了几篇博客感觉有点懂了。记录下来防止自己忘了吧。尽量用大白话。了解RPN网络的整个应用流程。

1.明确输入输出:输入是CNN卷积后的特征图 输出是候选框图  如下图。知乎上盗了张图。 感觉这个是最形象的

                        

                                                                                                          图1

2.先形象解释一下:左侧是特征图 ,立方体厚度决定于特征图维度。右侧红框就是经过该网络后提取出的感兴趣ROI区域。  这个特征图生成方法很多了,例如 ZF,VGG ,Resnet 什么的都可以。这里就不细说了。RPN不关注具体目标是啥,是车,是人或者狗,楼房都可以。它只是将框内认为是目标,框外认为是背景,做了个二分类。至于框内目标具体是啥,最终是交给分类网络去做。结果会略显潦草,后面会对边框进行提炼。

3.具体做法:以ZF网络计算的特征图作为输入来说吧(不同网络体现在输入上是特征图的尺寸不同,RPN实现都是一致的),当然不同网络的检测结果差异是网络本身决定的了。

3.1.计算RPN的输入特征图(又见无耻的盗图....) 对应于图1的最左侧

                                                                                                                   图2

首先输入图像大小是224*224*3。 然后开始各种卷积 池化。卷积核大小,个数,步长,填充参数都在图上可见。最终,rpn是选择conv5的结果作为其输入,也就是13*13*256这个特征图是RPN网络的输入。具体这个卷积流程去参考其他文章即可。本文重点介绍RPN的处理流程。

3.2.生成Anchors   对应于图1的中间部分

    首先牢记:特征图上的每个点生成一个Anchors,特征图大小与Anchors对应。文中是用9个锚点。所谓Anchors 就理解成9个不同的框好了(框的属性自然就是长宽了,再进一步就是四个点的坐标喽),特征图上的每个点对应于一个Anchors。这九个不同的框按大小,比例生成的,论文中有介绍。这个框的数据(框的左上角坐标(x0,y0),右下角坐标(x1,y1)这四个值都是对应于原图的)对应于原图,就是图1右侧那个红框。下面这个就是原图,红色点就是特征图上的点对应于原图的位置。(接着盗图)。它部署 9 个锚点框:3 个不同宽高比 * 3 个不同大小的锚点框 = 9个锚点框。每一个位置使用 9 个锚点,每个位置会生成 2×9 个目标分数和 4×9 个坐标分数。显然,通过一个中心定义9个不同的框,就是为实现多尺度这个想法。当然这样做获得检测框很不准确,后面会做2次bounding box regression修正检测框位置。

                   

                                                                                                                   图3

下面是卷积的具体过程。

先上总图                

                                                                                                             图4

a.conv fetaure map到 intermediate layer的卷积过程:

    在特征图上用sliding window 3*3的窗口滑动。这个窗口提出来的图 conv feature map大小是3*3*256,上面那个图只显示了1通道的,在它下面还有255层。那么对于特征图上某个点来说,就要用256个大小为3*3*256的卷积核对这个窗口进行卷积,卷积过程显然是对应通道(256channel)卷积,获得1*256维的向量,然后累加获得1*1向量,卷积核有256个,这样的向量就有256个最终结果就是1*256(这个256是卷积核个数)。结果对应于下图intermediate layer。整张特征图卷积结果如下图

(卷积函数 输入通道数决定卷积核的通道数,卷积核的个数决定输出通道数)

                

                            

b.intermediate layer的256维向量后面对应两条分支:

    cls layer分支是目标和背景的二分类(classification),因为k等于9,所以通过1×1×256×18的卷积核得到 2*9 = 18个分数,分别是目标和背景的评分。这次卷积总的流程如下图。最右侧的18层中,每两层代表了某个anchor的特征图上所有点的前景背景概率值。

            

    reg layer分支。如果候选框是目标区域,就去判断该目标区域的候选框位置在哪,这个时候另一条分支就过1×1×256×36的卷积得到4*9个值,每个框包含4个值(x,y,w,h),就是9个候选区域对应的框应该偏移的具体位置Δxcenter,Δycenter,Δwidth,Δheight。如果候选框不是目标区域,就直接将该候选框去除掉,不再进行后续位置信息的判断操作。这里预测的值都是通过模型不断训练得到的。显然最右侧的18层中,每4层代表了某个anchor的特征图上所有点的偏移量的值。

                       

                                                                                                                  

3.3获得最终结果: 对应于图1的右侧部分

    先上个图。里面绿色框就是标注框,是我们样本中框好的,代表了飞机的真实存在框范围,红色框可以看成是候选框的初值,针对特征图上的某个点,这样的框有9个。

                    

                                                                                                                   图5

 

首先是分类问题,简而言之就是存在与否问题。上面红色就是此次认为红色框中存在灰机了。对应于cls layer层的某个锚点的某种形状的框,其判断为目标的概率非常大。我们训练模型,让cls layer更好的区分前景(灰机),背景(非灰机)。在训练之初我们先对前景和远景分别用正样本(1)和负样本(0)进行标签工作

 正样本标签: 与某一个GT有最高的IOU重叠的Anchor box。与任意一个GT的IOU重叠部分大于0.7的Anchor box 。

 负样本标签: 给与所有GT包围盒的IOU重叠部分都小于0.3的Anchor box。

    然后通过损失函数softmax loss(cross entropy loss)进行计算,这里的监督标签就是GT(1,0),它不断告诉训练出的结果对还是不对。就这样训练到最后我们的RPN分类训练完成。这个步骤获得了红色框

然后是回归问题,简而言之就是修正边框而已。上面的蓝色就是在红色框基础上去修正得来的,对应于reg layer层。我们通过不断训练它,让其得到的四个值,x,y,w,h能与真实的GT坐标不断靠拢,能更接近真实目标的坐标。看上面那个飞机图,Region Porposal 是我们RPN给出的一个候选区域初值。把上面红色框图的信息给下一次最终的分类模块,它可能识别不出飞机。因为框的太少了。 所以在训练的时候,就需要尽可能的使我们的Anchor box的框与真实的GT的框接近。但是我们知道想让A-box=GT,是不太现实的,因为我们没法做到100%。

                                                   

                                                                                                           图6

所以如上图所示,我们的目标就是希望从现有的原始红色的Region  Proposal最终得到蓝色的预测GT,而这个蓝色GT其实与绿色的真实的标定GT非常接近了已经。总而言之,我们如果得到了预测GT,那么目标就达成了。这个步骤对红色框估计获得了蓝色框、这个框显然就是图1中那几个红色的框框了。

多边框回归的参考文献列在下面了。详情见它。简而言之就是已经有个初始框,但是它不准,不准的因素有4个, x,y方向的偏移,x,y方向的缩放比例。然后就用神经网络去训练。让红色框与绿色框尽可能接近,那么对应的这4个参数就是需要训练的值呗

RPN具体的pytorch代码如下。可对照代码和上面理论去对应。

from __future__ import absolute_import import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable from model.utils.config import cfg from .proposal_layer import _ProposalLayer from .anchor_target_layer import _AnchorTargetLayer from model.utils.net_utils import _smooth_l1_loss import numpy as np import math import pdb import time class _RPN(nn.Module): """ region proposal network """ def __init__(self, din): super(_RPN, self).__init__() self.din = din # get depth of input feature map, e.g., 256 FT self.anchor_scales = cfg.ANCHOR_SCALES self.anchor_ratios = cfg.ANCHOR_RATIOS self.feat_stride = cfg.FEAT_STRIDE[0] # define the convrelu layers processing input feature map self.RPN_Conv = nn.Conv2d(self.din, 256, 3, 1, 1, bias=True) # define bg/fg classifcation score layer self.nc_score_out = len(self.anchor_scales) * len(self.anchor_ratios) * 2 # 2(bg/fg) * 9 (anchors) self.RPN_cls_score = nn.Conv2d(256, self.nc_score_out, 1, 1, 0) # define anchor box offset prediction layer self.nc_bbox_out = len(self.anchor_scales) * len(self.anchor_ratios) * 4 # 4(coords) * 9 (anchors) self.RPN_bbox_pred = nn.Conv2d(256, self.nc_bbox_out, 1, 1, 0) # define proposal layer self.RPN_proposal = _ProposalLayer(self.feat_stride, self.anchor_scales, self.anchor_ratios) # define anchor target layer self.RPN_anchor_target = _AnchorTargetLayer(self.feat_stride, self.anchor_scales, self.anchor_ratios) self.rpn_loss_cls = 0 self.rpn_loss_box = 0 @staticmethod def reshape(x, d): input_shape = x.size() x = x.view( input_shape[0], int(d), int(float(input_shape[1] * input_shape[2]) / float(d)), input_shape[3] ) return x def forward(self, base_feat, im_info, gt_boxes, num_boxes): batch_size = base_feat.size(0) # return feature map after convrelu layer rpn_conv1 = F.relu(self.RPN_Conv(base_feat), inplace=True) # get rpn classification score rpn_cls_score = self.RPN_cls_score(rpn_conv1) rpn_cls_score_reshape = self.reshape(rpn_cls_score, 2) rpn_cls_prob_reshape = F.softmax(rpn_cls_score_reshape, 1) rpn_cls_prob = self.reshape(rpn_cls_prob_reshape, self.nc_score_out) # get rpn offsets to the anchor boxes rpn_bbox_pred = self.RPN_bbox_pred(rpn_conv1) # proposal layer cfg_key = 'TRAIN' if self.training else 'TEST' rois = self.RPN_proposal((rpn_cls_prob.data, rpn_bbox_pred.data, im_info, cfg_key)) self.rpn_loss_cls = 0 self.rpn_loss_box = 0 # generating training labels and build the rpn loss if self.training: assert gt_boxes is not None rpn_data = self.RPN_anchor_target((rpn_cls_score.data, gt_boxes, im_info, num_boxes)) # compute classification loss rpn_cls_score = rpn_cls_score_reshape.permute(0, 2, 3, 1).contiguous().view(batch_size, -1, 2) rpn_label = rpn_data[0].view(batch_size, -1) rpn_keep = Variable(rpn_label.view(-1).ne(-1).nonzero().view(-1)) rpn_cls_score = torch.index_select(rpn_cls_score.view(-1,2), 0, rpn_keep) rpn_label = torch.index_select(rpn_label.view(-1), 0, rpn_keep.data) rpn_label = Variable(rpn_label.long()) self.rpn_loss_cls = F.cross_entropy(rpn_cls_score, rpn_label) fg_cnt = torch.sum(rpn_label.data.ne(0)) rpn_bbox_targets, rpn_bbox_inside_weights, rpn_bbox_outside_weights = rpn_data[1:] # compute bbox regression loss rpn_bbox_inside_weights = Variable(rpn_bbox_inside_weights) rpn_bbox_outside_weights = Variable(rpn_bbox_outside_weights) rpn_bbox_targets = Variable(rpn_bbox_targets) self.rpn_loss_box = _smooth_l1_loss(rpn_bbox_pred, rpn_bbox_targets, rpn_bbox_inside_weights, rpn_bbox_outside_weights, sigma=3, dim=[1,2,3]) return rois, self.rpn_loss_cls, self.rpn_loss_box

参考的文章太多了,哎   就厚着脸皮写个原创吧 哈哈。 参考文献:

1.https://blog.csdn.net/w437684664/article/details/104238521

2.https://www.jianshu.com/p/468e08f739bd

3.https://www.jianshu.com/p/643cdcf674fc

4.https://blog.csdn.net/YZXnuaa/article/details/79221189

5.https://blog.csdn.net/qq_36269513/article/details/80421990

6.https://blog.csdn.net/zijin0802034/article/details/77685438/ 边框回归的

7.https://blog.csdn.net/wangwei19871103/article/details/100929543 VGG主干网络与RPN的结合 基于keras的



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有