Fast RCNN目标检测
Fast RCNN目标检测
Fast RCNN是作者Ross Girshick继RCNN之后的续作。
使用VGG16作为Backbone,与RCNN相比,
- 训练时间快9倍
- 测试推理时间快213倍
- 准确率提升4% (62% -> 66% @Pascal Voc)
- 一张图像利用Selective Search方法生成1K~2K个候选区域
- 对每个候选区域,利用深度网络提取特征
- 特征送入每一类的SVM分类器,判别是否属于该类
- 使用回归器精细修正候选框位置
Fast RCNN算法概括
- 一张图像生成1K~2K个候选区域。(依旧是Selective Search)
- 将图像输入网络,得到特征图,将SS生成的候选框投影到特征图上得到相应的特征矩阵。
RCNN中是将每一个特征区域分别送入网络得到特征向量,Fast RCNN是把整幅图像输入到CNN网络中,得到一个特征图,再通过SS算法,在原图上生成的候选区域,直接映射到特征图中来。 - 将每个特征矩阵通过ROI pooling(Region of Interest)Layer缩放到7 * 7大小的特征图,接着将特征图展平,通过一系列全连接层得到预测结果(类别与位置)。
在RCNN中专门训练了SVM分类器,用于对候选区域分类,和一个回归器对候选区域边界框调整。在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中不再有此限制)

损失函数设计

由上图知道我们的目标是:
- 其中,对于分类器:
输入N+1个类别的概率(1为背景) - 对于边界框回归器:
输出对应N+1个类别的候选框回归参数(dx,dy,dw,dh),共(N+1) * 4个节点
![边界框回归器]()
- 如果得到了预测回归参数如何计算最终的预测边界框
![边界框回归计算]()
也就是说损失计算分为两个部分:分类损失\(Loss_1\)和边界框回归损失\(Loss_2\)。总的\(Loss=Loss_1 + λ * Loss_2\)

其中,
- 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}
\]



浙公网安备 33010602011771号