单级物体探测器(Single-stage object detectors)
YOLO (You Only Look Once) v1
主要思想:避免多个步骤(如区域提议、区域分类等),直接在卷积神经网络(CNN)中为每个类别预测直接的热图。
步骤
- 图像被划分为 S×S 的网格,每个网格单元负责检测中心点落在该单元内的物体。
- 每个网格单元预测 M 个边界框(bounding boxes,简称bboxes)和这些边界框的置信度(confidence)。置信度反映了边界框中包含物体的概率和预测准确度的乘积。
- 每个边界框有5个参数:中心点的 x 和 y 坐标、框的高度 hh、宽度 ww 以及上述的置信度。
- 同时,系统会对每个网格单元生成 N 张概率图(class probability maps),每张图对应一个物体类别,表示该单元内包含特定类别物体的概率。
输出
YOLO模型的输出包括两个主要部分:
-
N 类概率图(class probability maps),每个图表示网格单元中包含特定类别物体的概率。
-
M 个边界框参数图(bounding box parameter maps),包含每个预测边界框的位置和尺寸参数,以及置信度。
损失函数
损失函数:YOLO使用的是均方误差(sum-squared error) 来计算真实值和预测值之间的差异,并对不同的预测部分赋予不同的权重:
- 边界框的位置参数(bbox location parameters) 在损失函数中具有更高的权重,这是因为准确的位置对于目标检测的性能至关重要。
- 那些不包含对象(objects)的网格单元 不会对分类损失(classification loss)做出贡献,意味着它们不会影响分类准确性的损失计算。
- 边界框参数的惩罚是基于它们的置信度的,这种设置鼓励 M 个边界框针对不同对象进行专门化(specialise),也就是说,模型被鼓励学习为不同的对象预测不同的、特化的边界框。
优/缺点
优点
- 快速:YOLO因为只需要对图像进行一次遍历就能检测出对象,所以它的速度非常快,适用于实时目标检测。
- 准确性高(对于实时对象检测器来说) :尽管YOLO是为速度优化,但它在实时检测场景中仍然保持了相对较高的准确度。
缺点
- 空间精度有限:由于YOLO将图像分割为网格并在每个网格中进行预测,这可能导致空间精度上的限制,尤其是对于小物体或者当物体相互靠得非常近时。
- 一般比较慢的检测器准确率低:虽然YOLO在实时检测中表现出色,但与一些非实时(non-real time)的、更注重准确性的算法相比,其准确性通常较低。
(该算法有多个版本,每个新版本都在原有方法的基础上有所改进) YOLO算法自推出以来已经有了多个版本,每个版本在速度、准确性和其他方面都有所提高。
SSD: Single shot multibox detector
类似于YOLO:YOLO模型的一大特点是它不生成区域建议(region proposals),而是直接预测一组类别加上边界框的热图(class+bbox heatmaps)。
- 对于每个锚点(anchor point):会有 k 个边界框,每个边界框包含 N 类的置信度和4个边界框参数(通常是中心点的x,y坐标和宽度、高度)。
主要变化 :在多个卷积层中使用锚点(anchor),允许在不同的尺度上进行检测。
优/缺点
- 相较于Faster R-CNN这类基于区域提议的方法,SSD有更快的处理速度。
- 通常情况下,SSD的准确率会低于那些基于区域提议的方法。
- SSD在其网络的早期层中使用锚点技术,这有助于改进空间定位的精度,并提升对小尺寸物体检测的能力。
对边界框定位方法的替代方案
CornerNet:预测物体边角的两个点。
CenterNet:预测物体的中心点。
小结
- 单级检测器(Single-stage detectors)跳过了区域提议(region proposal)步骤,直接预测物体类别和边界框。
- 单级方法通常比如Faster R-CNN这样的双级方法(two-stage methods)速度更快,但准确度稍低。
- 一些最新方法简化了预测过程,通过预测单个点而不是边界框来识别物体。
实例分割(Instance segmentation)
语义分割(Semantic segmentation)对像素进行分类,但它不区分不同的实例。
怎么进行区分?
常见的方法:
- 运行对象检测器,提取边界框和标签。
- 在每个边界框内执行二元(前景/背景)分割。
常用的架构:Mask R-CNN。
Mask R-CNN
基本上就是在Faster R-CNN上增加了一个额外步骤 ---> 每个区域通过一个全卷积网络,预测一个二进制分割掩模。
区域损失 变成: <math xmlns="http://www.w3.org/1998/Math/MathML"> L = L c l s + L b o x + L m a s k L = L_{cls} + L_{box} + L_{mask} </math>L=Lcls+Lbox+Lmask
<math xmlns="http://www.w3.org/1998/Math/MathML"> L c l s L_{cls} </math>Lcls: 分类损失(classification loss)
小结
- 实例分割可以被建模为先进行目标检测,然后再进行二元分割(前景/背景)。
- 一种常见的架构是Mask R-CNN,这是对Faster R-CNN的改进。
评估目标探测器(Evaluating object detectors)
通常情况下,目标检测器会返回许多重叠的检测结果。这些重叠的检测结果可能是不同的对象,或者是同一个对象在多个尺度/位置上的检测。
将其视为多个检测结果处理?还是选择其中一个作为最终预测?
非极大值抑制(NMS)
非极大值抑制(NMS)在物体高度重叠时可能会遗漏一些正确的检测。
但总体而言,这比重复计算同一物体多次要好。
步骤
- 从得分最高的边界框开始
- 删除与该方框重叠超过某个 IoU 临界值(如 0.7)的较低分数的边界方框
- 以此类推,继续对下一个得分最高的边界框执行相同的操作
这个过程往往在每个对象类别中独立进行
示例
最终结果
评估(Evaluation)
在考虑到一张图片上可能存在多个对象/检测情况下如何评估?
通常使用的方法包括:
- 在整个测试集上进行目标检测
- 执行非极大值抑制(NMS)以消除重叠的检测
- 对于每一个物体分类,计算平均精度(AP),即精确率-召回率(P-R)曲线下面积。
步骤
-
检测结果排序: 所有狗的检测结果按分数排序。
-
真实框标记: 展示了所有真实的狗边界框(Ground-Truth, GT)。
-
评估步骤:
-
从最高到最低分数对检测结果进行排序。
-
对每个检测结果执行以下步骤:
-
如果检测到的边界框与真实边界框的IoU(交并比)大于0.5,则将其标记为正检测,并移除该真实边界框以避免再次匹配。
-
否则,将其标记为负检测。
-
在精确率-召回率(Precision-Recall, P-R)曲线上绘制一个点。
-
- 平均精度(AP) : 计算平均精度(AP),它等于P-R曲线下的面积。
- 平均精度的平均值(mAP):多个类别AP值的平均,综合考虑了所有类别的检测性能。
Mean Average Precision(mAP)
单一IoU阈值mAP
示例:
- Bird AP = 0.65
- Cat AP = 0.80
- Dog AP = 0.86
mAP@0.5 = 0.77(mAP是前三个类别的AP的平均值)
COCO mAP
它考虑了从0.5到0.95(以0.05为步长) 的一系列IoU阈值。这种方法可以更全面地评估模型在不同重叠程度的检测性能,因为它不仅仅考虑了最小的重叠阈值(0.5),还包括了更严格的阈值直到0.95。
示例:
- mAP@0.5 = 0.77
- mAP@0.55 = 0.72
- ...
- mAP@0.95 = 0.19
COCO mAP = 0.45
小结
评估对象检测器的常用指标是mAP(或COCO mAP)
NMS(非极大值抑制)和P-R(精确度-召回率)步骤都需要IoU(交并比)阈值;不同的阈值可以改变结果。
对象检测是复杂的 -> 单一数字不是非常有信息量的。
-
对象分类的准确性如何?
这是指检测器能否准确地识别出图像中的对象属于哪个类别。评估这一点通常涉及到查看模型对于实际类别的预测准确度。
-
边界框的准确性如何?
这涉及到模型预测的边界框与实际对象的位置和大小的吻合程度。这通常通过计算预测框和真实框(ground truth)之间的交并比(IoU)来评估。
-
模型正在犯哪些类型的错误(漏检、误报)?
漏检(misses) 是指模型未能检测到实际存在的对象,
误报(false alarms) 是指模型错误地将背景或错误的对象标记为感兴趣的对象。
这些错误类型通常通过混淆矩阵来分析,这个矩阵展示了每个类别的真正例、假正例、真反例和假反例的数量。
上下文中的物体检测(Object detection in context)
场景上下文提供了全局和局部先验知识:
- 全局先验(Global prior):物体出现的可能性
- 局部先验(Local prior):给定位置上物体出现的可能性
包含这些先验可以帮助减少误检(false detections)
缺点
- 过度依赖先验知识:如果模型过分依赖先验知识,它可能会错过那些不符合先验分布的真实检测。例如,如果一个物体通常出现在图像的一部分,模型可能不会在罕见的情况下检测到它出现在不常见的位置。
- 泛化能力降低:模型可能在训练数据集中学习到的场景上下文先验可能不适用于所有可能的实际场景,这可能限制了模型的泛化能力。
- 数据集偏差:如果训练数据中某些对象的出现位置非常固定,模型可能会学习到这种局部先验,导致在真实世界应用时性能下降,因为真实世界中的对象位置更加多样化。
- 更新难度:随着时间的推移,环境和物体出现的上下文可能会发生变化,如果模型严重依赖旧的上下文信息,它可能不会很好地适应新情况。
小结
物体检测通常被视作一个区域(patch)分类的问题。
解决分类问题有多种方式:包括两阶段的区域提议检测器 和单阶段检测器等。
然而,这并非物体检测的唯一解决方案 ------ 实际上,区域之外的信息(也就是场景上下文)也能被用来预测物体是否存在及其位置。