(五)目标检测- 基于候选区域的目标检测器
1、RCNN的关键点
(1) 用selective search生产RP(Region Proposals),RP的大小不一样,之后通过warp,把RP变成统一的227*227的大小
(2) 将227*227的RP输入到CNN中进行特征提取
(3) 用独立的SVM对RP进行特征分类
(4) 用Bb回归(Bounding box regression)校正原来的RP,生产预测窗口的坐标

2、fast rcnn
(1) 用Selective Search生成约2K个RP
(2) 整张图像输入CNN中,提取feature map
(3) 把RP映射到CNN的最后一层卷积的feature map上
(4) 通过ROI pooling层使得每个RP成为固定尺寸的feature map
(5) 利用Softmax Loss和Smooth L1 loss对分类概和Bb回归联合训练
测试时:
(1) (1)~(4)同训练
(2) 用Softmax Loss探测分类概率
(3) 用Smooth L1 loss探测边框回归
(4) 用Bb回归值校正原来的RP,最终生成预测窗口的坐标

3、Faster rcnn
训练
(1) 把整张图像送入CNN中进行feature map的提取
(2) 用RPN生产RP,每张图片生产300个
(3) RP映射到最后一层feature map
(4) 在Roi pooling层把每个ROI生成固定大小的feature map
(5) 利用softmax loss和smooth L1 loss对分类概率和Bb回归联合训练
测试
(1) (1)~(4)同训练
(2) 用softmax loss探测分类概率
(3) 用smooth L1 loss探测边框回归
(4) 用Bb回归值校正原来的RP,最终生产预测窗口的坐标
4、Faster RCNN详细过程

(1) feature extraction
支持输入任意大小的图片,进入网络之前对图片进行规整化尺度的设定,如可设定图像短边不超过600,图像长边不超过1000,假定M*N=1000*600(图片少于该尺寸,边缘补0)
①13个conv层:kernel_size=3,pad=1,stride=1;
卷积公式:![]()
②13个relu层:激活函数,不改变图片大小
③4个pooling层:kernel_size=2,stride=2;
pooling层会让输出图片是输入图片的1/2,经过feature extraction,图片大小变成(M/16)*(N/16),即:60*40(1000/16≈60,600/16≈40);
(2) RPN
Feature Map进入RPN后,经过3*3卷积,特征图大小60*40*512

①rpn_cls_score:60*40*512-d⊕1*1*512*18==>60*40*9*2 逐像素对其9个anchor box进行二分类
②rpn_bbox_pred:60*40*512-d⊕1*1*512*36==>60*40*9*4 逐像素得到9个anchor box四个坐标信息(偏移量)
(2.1) anchors的生成规则
经过feature extraction后,图片大小变成原来的1/16,令feat_stride=16,在生成anchors时,定义一个base_anchor,大小为16*16的box(因为特征图(60*40)上的一个点,可以对应到原图(1000*600)上一个16*16大小的区域),源码中转化为[0,0,15,15]数组,参数ratios=[0.5,1,2],scales=[8,16,32]
左:先看[0,0,15,15],面积保持不变,长、宽比分别为[0.5,1,2]是产生的Anchors box
中:如果经过scales变化,即长、宽分别均为 (16*8=128)、(16*16=256)、(16*32=512),对应anchor box
右:两种变换,最后生成9个Anchors box

特征图大小60*40,共生成60*40*9=21600个anchor box,源码中,通过width:(0~60)*16,height:(0~40)*16建立shift偏移量数组,再和base_ancho基准坐标数组累加,得到特征图上所有像素对应的anchors的坐标值,是一个[216000,4]的数组.
计算方式:

c是缩放比,r是长宽比
(2.2) nms生成规则
算法对一幅图产生的所有的候选框,以及每个框对应的score(可以用一个5维数组dets表示,前4维表示四个角的坐标,第5维表示分数),阈值thresh。初始,设所有的框都没有被抑制,所有框按照score从大到小排序。从第0个框(分数最高)开始遍历,对于每一个框,如果该框没有被抑制,就将所有与它IOU大于thresh的框设为抑制。返回没被抑制的框。
(2.3) rpn工作原理解析

rpn-data:
(1)产生anchor和shift(每个等位置*_feat_stride)形成候选的rpn_proposal,并对越界进行剔除
(2) 对rpn_labels进行标记,按照如下规则:
②如果anchor box与ground truth的IoU值最大,标记为正样本,rpn_label=1
③如果anchor box与ground truth的IoU>0.7,标记为正样本,rpn_label=1
④如果anchor box与ground truth的IoU<0.3,标记为负样本,rpn_label=0。剩下的既不是正样本也不是负样本,不用于最终训练,rpn_label=-1
⑤对过多rpn_label为1或0进行随机筛选,使得rpn_label=0和rpn_label=1的比例为1:1
(3) 对rpn_bbox_targets进行说明
gt:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*
rpn_proposal:中心点位置坐标x_a,y_a和宽高w_a,h_a
偏移量:△x=(x*-x_a)/w_a △y=(y*-y_a)/h_a △w=log(w*/w_a) △h=log(h*/h_a)
rpn_bbox_targets:(△x,△y,△w,△h)
(4) 对于rpn_label=1的索引bbox_inside_weights中元素为(1.0, 1.0, 1.0, 1.0),其余为0.
对rpn_label=1和rpn_label=0的索引bbox_outside_weights中元素为np.ones((1, 4))*1.0/np.sum(labels>=0),其余为0.
bbox_inside_weights和bbox_outside_weights主要目的在于:total_anchor中有些框尺寸越界,然后对越界进行处理。
(5) rpn_loss_cls:判断anchor有无物体,rpn_labels和rpn_cls_score_reshape的损失函数,其中rpn_label的值可能为-1,0,1,计算时忽略rpn_label=-1的情形。
(6) rpn_loss_bbox:预测偏移量的准确性,目的在于rpn_bbox_pred拥有anchor与gt进行偏移量rpn_bbox_targets的预测能力。计算公式为:
rpn_bbox_outside_weight*SmoothL1(rpn_bbox_inside_weight*(rpn_bbox_pred-rpn_bbox_targets))
proposal:
在rpn_cls_prob_reshape的size中,重新生成60*40*9个anchor box,加上训练好的△x、△y、△w、△h(来自rpn_bbox_pred),得到相较于之前更加准确的预测框rpn_proposal,进行越界剔除和使用nms非最大值抑制,剔除重叠的框,比如,设定IOU为0.7的阈值,仅保留覆盖率不超过0.7的局部最大分数box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个),进入到下一层roi pooling时region proposal大约只有300个。输出rpn_rois(在测试时候这些框作为roipooling)
roi_data:(只存在训练过程中)
输入为rpn_rois(proposal中的)和gt_boxes,对于每个rpn_rois与gt重合率最大的rpn_rois保留下来,然后将重合率大于0.5保留作为前景,将重合率(0.1,0.5)之间作为背景并将label值置0,计算rpn_rois与gt的偏移量,前景ROI与背景ROI的比例在1:3左右。输出rois是经过上面处理保存下来的rpn_rois,输出bbox_targets是rpn_rois与gt的偏移量。
ROI Pooling
输入的是RPN层产生的region proposal(在训练过程中roi_data的rpn_rois,在测试过程中proposal的rois)和VGG16最后一层产生的特征图(60*40*512),遍历每个region proposal,将其坐标值缩小16倍,这样就可以将在原图(1000*600)基础上产生的region proposal映射到60*40的特征图上,从而将在feature map上确定一个区域(定义为RB*)。在feature map上确定的区域RB*,根据参数pooled_w:7, pooled_h:7,将这个RB*区域划分为7*7,即49个相同大小的小区域,对于每个小区域,使用max pooling方式从中选取最大的像素点作为输出,就形成一个7*7的feature map。300个region proposal遍历完后,输出的数组[300,512,7,7],作为下一层的全连接的输入。
rcnn 网络
经过roi pooling层之后,batch_size=300,proposal feature map的大小是7*7,512-d,对特征图进行全连接,参照下图,最后利用softmax loss和L1 loss完成分类和定位。

通过fc层与softmax计算每个region proposal具体属于哪个类别(如人,马,车等),输出cls_prob概率向量;同时利用回归获得每个region proposal的位置偏移量bbox_pred,用于回归获得更加精确的目标检测框。
loss_cls:roi_data中label与fc层分类cls_score进行softmaxWithLoss进行求解。
loss_bbox:roi_data中bbox_target与fc层分类bbox_pred(偏移量)进行SmoothL1Loss求解。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)