Faster R-CNN 全精读:实时目标检测的里程碑之作
论文信息标题Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks会议NeurIPS 2015单位Microsoft Research、Facebook AI Research、University of Science and Technology of China代码https://github.com/ShaoqingRen/faster_rcnn论文https://arxiv.org/pdf/1506.01497.pdf前言在Faster R-CNN出现之前目标检测一直被候选区域生成拖慢速度——Selective Search在CPU上跑1张图要1~2秒比检测网络还慢。这篇论文直接用RPN区域提议网络替代传统候选区域算法和Fast R-CNN共享卷积特征让候选区域生成几乎“零成本”首次实现GPU上接近实时的高精度检测成为两阶段检测的绝对标杆。一、核心创新点Faster R-CNN只做了一件大事但彻底改变检测流程提出RPN区域提议网络全卷积结构在共享特征图上直接生成候选框RPN与Fast R-CNN共享卷积特征消除重复计算候选区域耗时从秒级降到10msAnchor机制用多尺度、多长宽比锚点框解决目标尺度问题不用图像金字塔4步交替训练让两个网络完美共享权重统一成一个端到端模型二、整体架构RPN Fast R-CNN 统一网络Faster R-CNN是单网络、两模块的结构共享全部卷积层。图 1针对不同尺度和大小的处理方案。a构建图像和特征图的金字塔并在所有尺度下运行分类器。b在特征图上运行具有多种尺度/大小的滤波器金字塔。c在回归函数中使用参考框的金字塔。分析 backbone卷积层提取共享特征 → RPN生成候选框 → RoI Pooling采样特征 → 分类回归输出结果。RPN相当于网络的“注意力”告诉模型该看哪里。三、核心模块1RPN 区域提议网络3.1 RPN工作流程图 2Faster R-CNN 是一个用于物体检测的单一、统一的网络。RPN 模块在此统一网络中充当“注意力”角色。1. 在共享卷积特征图上用3×3卷积滑动窗口提取特征2. 接两个1×1卷积层分别做前景背景分类和框回归3. 每个滑动窗口位置预设k个Anchor框默认9个4. 用NMS筛选高分候选框送给Fast R-CNN3.2 Anchor 锚点机制最核心设计图 3左图区域提议网络RPN。右图使用 RPN 提出的候选区域在 PASCAL VOC 2007 测试集上的示例检测结果。我们的方法能够检测到各种大小和比例的物体。Anchor是固定尺寸、固定长宽比的参考框解决多尺度目标检测问题。默认配置3种尺度(128²、256²、512²) 3种长宽比(1:1、1:2、2:1)每个特征点9个Anchor特性平移不变性、参数量极小、无需图像金字塔通俗解释Anchor就是提前在图上“撒”一堆不同大小形状的框让网络只需要学习偏移量不用从零预测框。3.3 RPN损失函数多任务损失总损失由分类损失回归损失加权组成L ( { p i } , { t i } ) 1 N c l s ∑ i L c l s ( p i , p i ∗ ) λ 1 N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) L(\{p_i\},\{t_i\})\frac{1}{N_{cls}}\sum_i L_{cls}(p_i,p_i^*)\lambda\frac{1}{N_{reg}}\sum_i p_i^*L_{reg}(t_i,t_i^*)L({pi},{ti})Ncls1i∑Lcls(pi,pi∗)λNreg1i∑pi∗Lreg(ti,ti∗)L LL总损失p i p_ipiAnchor i 预测为物体的概率p i ∗ p_i^*pi∗真实标签正样本1负样本0t i t_iti预测框的4个归一化偏移量t i ∗ t_i^*ti∗真实框的4个归一化偏移量N c l s N_{cls}Ncls分类归一化项batch大小256N r e g N_{reg}Nreg回归归一化项Anchor数量约2400λ \lambdaλ平衡系数默认10L c l s L_{cls}Lcls二分类交叉熵损失L r e g L_{reg}LregSmooth L1 回归损失框回归公式归一化偏移t x ( x − x a ) / w a , t y ( y − y a ) / h a t w log ( w / w a ) , t h log ( h / h a ) t_x(x-x_a)/w_a,\quad t_y(y-y_a)/h_a \\ t_w\log(w/w_a),\quad t_h\log(h/h_a)tx(x−xa)/wa,ty(y−ya)/hatwlog(w/wa),thlog(h/ha)x / y / w / h x/y/w/hx/y/w/h预测框中心、宽、高x a / y a / w a / h a x_a/y_a/w_a/h_axa/ya/wa/haAnchor框中心、宽、高t x / t y / t w / t h t_x/t_y/t_w/t_htx/ty/tw/th网络输出的归一化偏移四、核心模块2RPN 正负样本定义训练RPN必须严格划分正负样本否则无法收敛正样本2种与真实框IoU最高的Anchor与任意真实框IoU 0.7负样本与所有真实框IoU 0.3忽略样本不属于正/负不参与损失计算Batch采样每张图随机采256个Anchor正负比例≈1:1。五、训练策略4步交替训练法为了让RPN和Fast R-CNN共享权重论文提出4步交替训练训练RPN用ImageNet预训练权重初始化训RPN训练Fast R-CNN用RPN生成的候选框训独立检测网络用检测网络初始化RPN固定共享卷积层只微调RPN独有层固定共享层微调Fast R-CNN两个网络完全共享权重统一模型六、实验结果与分析6.1 速度对比最震撼的提升表格1 检测速度对比VGG-16K40 GPU系统卷积耗时候选区域耗时检测后续耗时总耗时帧率SSFast R-CNN146ms1510ms174ms1830ms0.5fpsFaster R-CNN141ms10ms47ms198ms5fps表格1 出处Faster R-CNN原文分析候选区域从1510ms→10ms速度提升9倍精度还更高。6.2 VOC 2007 检测精度表格2 VOC 2007 测试集mAP方法候选区域数训练数据mAP(%)SSFast R-CNN2000VOC0766.9Faster R-CNN不共享300VOC0768.5Faster R-CNN共享300VOC0769.9Faster R-CNN共享300VOC071273.2表格2 出处Faster R-CNN原文分析只用300个候选框mAP超过2000个框的Selective Search。6.3 Anchor 消融实验表格3 Anchor设置对mAP影响设置尺度长宽比mAP(%)1尺度1比128²1:165.81尺度3比128²3种68.83尺度1比3种1:169.83尺度3比3种3种69.9表格3 出处Faster R-CNN原文分析多尺度Anchor提升最明显多长宽比进一步小幅增益。七、核心代码实现PyTorch简化版importtorchimporttorch.nnasnnimporttorch.nn.functionalasF# --------------------------# 1. RPN 网络结构# --------------------------classRPN(nn.Module):def__init__(self,in_channels512,mid_channels512,n_anchor9):super().__init__()# 3x3 滑动窗口特征提取self.convnn.Conv2d(in_channels,mid_channels,3,1,1)# 分类前景/背景 2*9self.clsnn.Conv2d(mid_channels,2*n_anchor,1)# 回归4*9 坐标偏移self.regnn.Conv2d(mid_channels,4*n_anchor,1)defforward(self,x):xF.relu(self.conv(x))cls_scoreself.cls(x)# [B, 18, H, W]reg_offsetself.reg(x)# [B, 36, H, W]returncls_score,reg_offset# --------------------------# 2. Smooth L1 损失RPN回归用# --------------------------defsmooth_l1_loss(x,target,beta1.0):difftorch.abs(x-target)losstorch.where(diffbeta,0.5*diff**2/beta,diff-0.5*beta)returnloss.mean()# --------------------------# 3. IoU 计算# --------------------------defiou(box1,box2):# 转成 (x1,y1,x2,y2)b1_x1,b1_y1box1[:,0]-box1[:,2]/2,box1[:,1]-box1[:,3]/2b1_x2,b1_y2box1[:,0]box1[:,2]/2,box1[:,1]box1[:,3]/2b2_x1,b2_y1box2[:,0]-box2[:,2]/2,box2[:,1]-box2[:,3]/2b2_x2,b2_y2box2[:,0]box2[:,2]/2,box2[:,1]box2[:,3]/2inter_x1torch.max(b1_x1,b2_x1)inter_y1torch.max(b1_y1,b2_y1)inter_x2torch.min(b1_x2,b2_x2)inter_y2torch.min(b1_y2,b2_y2)intertorch.clamp(inter_x2-inter_x1,0)*torch.clamp(inter_y2-inter_y1,0)unionbox1[:,2]*box1[:,3]box2[:,2]*box2[:,3]-interreturninter/union八、全文总结Faster R-CNN RPN Fast R-CNN共享卷积特征实现实时检测RPN全卷积、Anchor驱动、零成本候选区域替代传统Selective SearchAnchor多尺度多长宽比完美解决目标尺度变化问题速度革命从0.5fps→5fpsVGG-16精度同时大幅提升历史地位两阶段目标检测的基石后续Mask R-CNN、Cascade R-CNN全部基于它扩展