Fast RCNN目标检测

Fast RCNN目标检测

原大佬视频地址

Fast RCNN是作者Ross Girshick继RCNN之后的续作。
使用VGG16作为Backbone,与RCNN相比,

  • 训练时间快9倍
  • 测试推理时间快213倍
  • 准确率提升4% (62% -> 66% @Pascal Voc)

RCNN算法流程回顾:

  • 一张图像利用Selective Search方法生成1K~2K个候选区域
  • 对每个候选区域,利用深度网络提取特征
  • 特征送入每一类的SVM分类器,判别是否属于该类
  • 使用回归器精细修正候选框位置

Fast RCNN算法概括

  1. 一张图像生成1K~2K个候选区域。(依旧是Selective Search)
  2. 将图像输入网络,得到特征图,将SS生成的候选框投影到特征图上得到相应的特征矩阵
    RCNN中是将每一个特征区域分别送入网络得到特征向量,Fast RCNN是把整幅图像输入到CNN网络中,得到一个特征图,再通过SS算法,在原图上生成的候选区域,直接映射到特征图中来。
  3. 将每个特征矩阵通过ROI pooling(Region of Interest)Layer缩放到7 * 7大小的特征图,接着将特征图展平,通过一系列全连接层得到预测结果(类别与位置)。
    在RCNN中专门训练了SVM分类器,用于对候选区域分类,和一个回归器对候选区域边界框调整。在Fast RCNN中,都结合在一个网络中。不需要单独去训练分类器和回归器。

Fast RCNN总体流程:
Fast RCNN算法概览

与RCNN的区别

2.1 一次性计算整张图像特征

Types RCNN Fast RCNN
Diff 依次将候选框区域送入卷积神经网络得到特征(可以先经过缩放) 将整张图像送入网络,得到特征图(参考自SPPNet)。紧接着从特征图像上提取相应的候选区域(通过候选区域与原图的映射关系)。这些候选区域的特征不再需要重复计算

计算特征的方式

2.2 数据采样改变

虽然Fast RCNN使用的依旧是Selective Search算法提取候选区域,但并非是采用SS算法提供的所有的候选区域。
SS算法得到的大约2K个候选框,训练时只采用其中一小部分。
而且对于采样的数据,还区分正样本负样本

正样本 负样本
含义 候选框中确实存在我们所需检测目标的样本(候选框与真实目标边界框IOU>0.5) 背景,不含我们想要检测样本(IOU<0.5)
原因 为了解决样本不均衡问题 猫狗分类器为例,如果猫的样本数量>>狗的样本数量,网络在预测时,就会更偏向猫

在Fast RCNN中,对于每张图片,从2K个候选区域中,采集64个,而且64个候选区域中,一部分是正样本,一部分是负样本。

2.3 RoI Pooling layer

在上一步,得到了训练样本,且解决了样本不均衡问题。接下来,把用于训练样本的候选框,通过RoI Pooling层,缩放到统一的尺寸。
其方法为:

  • 假设左图向日葵是一个候选区域在特征图上对应的特征矩阵,把该特征矩阵划分为7 * 7 = 49等份。
  • 而后,对每一区域执行最大池化下采样(Max Pooling)。
  • 这样,无论候选区域的特征矩阵是什么样的尺寸,最后都得到一个7 * 7的特征矩阵。

(在RCNN要求输入227,Fast RCNN中不再有此限制)
RoI Pooling

损失函数设计

Fast RCNN概述
由上图知道我们的目标是:

  • 其中,对于分类器:
    输入N+1个类别的概率(1为背景)
  • 对于边界框回归器:
    输出对应N+1个类别的候选框回归参数(dx,dy,dw,dh),共(N+1) * 4个节点
    边界框回归器
  • 如果得到了预测回归参数如何计算最终的预测边界框
    边界框回归计算

也就是说损失计算分为两个部分:分类损失\(Loss_1\)和边界框回归损失\(Loss_2\)。总的\(Loss=Loss_1 + λ * Loss_2\)
Loss

其中,

  • p是分类器预测的softmax概率分布。\(p=(p_0,p_1,p_2,...,p_k)\)(即K个目标总类,K=N+1)
  • u是目标真实的类别标签
  • λ是固定的比例系数
  • []是艾弗森括号,代表当u>=1,等于1,否则等于0。
    u代表目标的真实标签,u>=1说明候选区域,确实属于所需检测的某一类别(正样本),这个时候才有边界框回归损失,否则代表为背景负样本。
  • \(t^u\)是边界框回归器预测的对应类别u的回归参数\((t^u_x,t^u_y,t^u_w,t^u_h)\)
  • v是真实目标的边界框回归参数\((v_x,v_y,v_w,v_h)\)

Loss1 分类损失

论文中采用的softmax交叉熵损失:

\[ L_{cls}(p,u)=-logp_u \]

\(p_u\)代表分类器预测,当前候选区域为类别u的概率
更进一步回顾Cross Entropy Loss交叉熵损失:

  • 针对多分类问题(softmax输出,所有输出概率和为1)

\[ H=-\sum_i{o^*_i}log(o_j) \]

其中\(o^*_i\)代表真实标签值,
\(o_i\)为预测值,
默认log以e为底,
\(o^*_i\)只在正确地方的类别等于1,错误的类别为0。
(举一个例子假设真实标签为[0,0,...,1,...,0],预测概率为[0.1,0.3,...,0.4,...,0.1]。则loss=-log0.4)

  • 针对2分类问题(sigmoid输出,每个输出节点之间互不相干)

\[H=-{1\over N}\sum^N_{i=1}[o^*_ilogo_i + (1-o^*_i)log(1-o_i)] \]

Loss2 边界框回归损失

\[Loss2 = \lambda[u>=1]L_loc(t^u,v) \]

其中,\(t^u\)对应边界框回归器预测的对应类别u的回归参数\((v_x,v_y,v_w,v_h)\),v对应真实的回归参数。

\[L_{loc}(t^u,v)=\sum_{i ∈ \{ x,y,w,h\}}smooth_{L_1}(t^u_i-v_i) \\ smooth_{L_1}(x) = \begin{cases} 0.5x^2 & |x|<1 \\ |x| - 0.5 & other \\ \end{cases} \]

posted @ 2022-04-10 14:49  白柒  阅读(98)  评论(0)    收藏  举报