三、算法概述
在近些年的发展中,各类目标检测算法层出不穷,不过大体上可为以R-CNN为代表的两阶段算法以及以YOLO为代表的单阶段算法,下面将对这两种算法进行简单概述:
1、两阶段算法
两阶段算法主要包含区域提议和区域识别两个阶段,通过结合先进Backbone和多尺度FPN技术可以实现较为优越的检测精度,使用范围也较广。
R-CNN
R-CNN中采用Selective Search方式生成候选提议框,避免了传统方法中穷举式滑窗所带来的繁琐。在生成候选区域后,R-CNN模型采用基于AlexNet的CNN模型进行特征提取,以取代传统HOG特征或Haar特征方法。提取出的特征会被送到SVM分类模型中,每个类别对应一个SVM分类器,选取最高置信度作为结果。
在模型测试阶段,R-CNN中采用NMS非极大值抑制方法以获取无冗余的区域子集。
虽然这种方法相较于传统DPM方法在效率和精度上有所提升,但在候选区生成阶段,由于模型至少生成2000个以上候选框,每个框在CNN中传播时都要耗费大量时间,且由于重叠部分会通过相同卷积核计算两次,缩放会导致计算结果不同,从而检测出不同结果。例如对于重叠的人骑马部分,有时会检测成人,有时会检测成马。
Fast R-CNN
Fast R-CNN是为了减少R-CNN计算量而诞生的,该方法在产生提议框阶段保留了R-CNN中的Selective Search方法,仍依赖传统CV方法。但针对第二阶段区域识别任务,该模型将卷积层由之前的仅应用提议框改为应用到全图,从而一次性计算出所有位置图像特征,随后裁剪出提议框所对应区域的特征图,将其送入全连接层进行计算分类,不过需要注意的是,由于提议框大小不同,因此特征区域需要通过RoI Pooling或RoI Align方法处理为固定尺寸后,才可输入全连接层。
2、单阶段算法
与两阶段算法中对锚框进行二分类来区分是否存在目标物体不同,单阶段算法在生成全局特征图后,直接对每个锚框进行多分类来以此提高检测效率,通过这种方法提出的模型结构简单、速度快,且易于在设备上部署,在工业界很受欢迎,虽然早期因为主干网络和多尺度技术不成熟问题在性能上弱于两阶段算法,但随着算法性能的不断提升,目前逐渐成为目标检测的主流方法。
YOLO
作为最早的单阶段算法之一,YOLO将目标检测问题转化为直接从图像中提取边界框和类别概率的回归问题,直接输出目标类别和位置,其自行设计的DarkNet结构由两层全连接层作为检测头预测结果,输出预测框位置以及预测框和真实值的IoU Score。
YOLO将原图切分成 S×S 大小的格子,对应预测图上 S×S 个位置,如果原图上某个物体的中心位于某个格子内,则对应位置的预测值应给出物体类别和B组边界框位置,其余位置则预测为背景类别,不涉及边界框预测结果
在Pascal VOC数据集上,YOLO使用VGG 16作为backbone后,相较于同样backbone的Fast R-CNN,可以达到三倍的检测速度
但由于每个格子只能预测 1 个物体,因此对重叠物体、尤其是大量重叠的小物体容易产生漏检,而直接回归边界框有难度,回归误差较大,故自YOLO v2 开始使用锚框。
样本不均衡问题: 需要注意的是,在单阶段算法中,需要对每个锚框进行多分类任务,在训练时计算每个预测的分类损失。但是显然在图像中,锚框的数量常常远大于真值框,即存在大量的锚框其所预测的真值仅为背景部分,这部分数据即为目标检测时的负样本。这些负样本占据数据的主要部分,会使得训练出的分类器更倾向于预测背景,从而出现漏检现象,而两阶段检测器通过区域提议拒绝了大量负样本,区域检测头接收的正负样本比例并不悬殊,因而不会出现该问题,检测精度也高得多。
对于这种样本不均衡问题,单阶段算法需要进行专门处理,YOLO中针对正负样本采用了不同的权重,面对比例严重失衡时效果颇为不错。SSD中则是采用困难负样本挖掘策略,即选取分类损失最大的部分负样本(困难负样本)计入损失,将正负样本比例在 1:3。
3、无锚框算法
四、目标检测新范式 —DETR
在之前的目标检测任务中,大部分的目标检测方法还需要NMS进行后处理来消除冗余框,但由于并非所有硬件都支持NMS,因此使得模型的调参和优化都非常困难。DETR脱离了密集预测范式,依靠Transformer的全局建模能力,其将目标检测建模转为集合预测问题,也避免了造成冗余框产生
1、主要工作
- DETR将一系列锚框看作一个集合,针对给定的图像去预测该集合,实现了将目标检测问题转为集合预测问题
- 去掉了对人先验知识的依赖,如NMS和Anchor生成,真正实现了End-to-End的目标检测框架
- 采用二分图匹配策略,强制模型输出唯一的预测结果,避免了大量冗余框生成
- 采用Transformer Encoder和Decoder结构,在采用解码器时还加入了另一个输入可学习的Object Query,在给定Object Query后,DETR会根据这些Query和全局图像的结合,采用注意力操作生成唯一预测框
- DETR在全景分割领域也取得了不错的结果,仅需在尾部加一个DETR专用的分割头,大体结构无需变化
2、主体结构
DETR的最终输出是一个固定的集合,对于任意的Input均有N个输出,通常N的数量要大于图像中的实际物体数,在论文中,作者设置的N=100
-
二分图匹配
DETR中采用最优二分图匹配(匈牙利算法)减少冗余框生成,假设存在3个工人,对于其完成三个任务x,y,z所组成的损失矩阵,二分图的本质是找到一个唯一解,使得完成三个工作的代价最低。
-
损失函数
在DETR中,三个工人即为N个生成框,ground truth即为需要完成的三个工作,损失矩阵cost matrix即为分类loss和框的准确度loss。
L o s s = − l { c i ≠ ϕ } P ^ σ ( i ) ( c i ) + l { c i ≠ ϕ } L b o x ( b i , b ^ σ ( i ) Loss=-l_{\{c_i \not=\phi \}}\hat{P}_{{\sigma(i)}}(c_i)+l_{\{c_i \not=\phi \}}L_{box}(b_i , \hat{b}\sigma(i) Loss=−l{ci=ϕ}P^σ(i)(ci)+l{ci=ϕ}Lbox(bi,b^σ(i)
加号前部分为分类Loss,后面部分为框Loss -
主体
为了让模型收敛更快,作者在计算loss时在Decoder后加入很多Auxiliary Loss,即额外目标参数,这种思路在目标检测和分割领域很常见,即不仅在最后一层计算loss,在Decoder层中也进行Loss计算,因为每个Decoder的输出均为100x256,故均可在这些100x256输出上作FFN来获得输出,这些FFN参数共享
3、训练流程
- CNN进行特征提取,将特征输入到Transformer Encoder-Decoder结构中
- Encoder进一步学习全局信息,为后续Decoder作铺垫
- Decoder输出生成框,在Decoder过程中,Object Query会不停与特征进行交互,限定生成框数量,在Decoder中进行自注意力操作,生成最终生成框
- 模型推理阶段不同于训练阶段,无需最后的二分图Loss,仅在第三步处设置一个阈值来规定输出置信度即可,模型会保留大于置信度的物体,剩余归为背景类
注:在DETR论文中,框数被认为限制为100,即针对每张Input都会生成100个框,为了令100个框与Ground Truth作匹配计算loss,作者将之看作集合预测问题,通过二分图匹配的方法计算Loss
五、评估方法与评价指标
- 正确结果(TP):算法检测到物体,图中也有该物体,检测结果正确
- 假阳性(FP):算法检测到物体,图中没有这个物体,检测结果错误
- 假阴性(FN):算法没有检测到物体,图中有该物体,检测结果错误
- 正确结果(TN):算法没检测到物体,图中没有物体,检测结果正确
检测到的衡量标准:对于某个检测框,图中存在同类型的真值框且与之交并比大于阈值(通常取0.5)
准确率: 表示正确识别物体数占总识别出物体数的百分比,用来衡量算法模型的查准程度
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
Precision = \frac {TP} {TP + FP}
Precision=TP+FPTP
召回率: 表示正确识别物体数占测试集中物体总数的百分比,用来衡量算法模型的查全程度
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Recall = \frac {TP}{TP+FN}
Recall=TP+FNTP
真值框总数(TP+FP)与检测算法无关,因此只需将检测结果区分为 TP 和 FP 即可计算 recall 和 precision
AP(average precision):计算单类别的平均准确度。
m AP @0.5:计算每一类别 IoU 设为 0.5 时的 AP,对所有类别的 AP 求平均值。