1.目标检测方法
(1).双(多)阶段检测
与单阶段检测器不同,双阶段检测器将目标检测任务分为两个独立的阶段,分别是候选生成 和分类/定位。
特点:
两个独立的阶段: 双阶段检测器将目标检测任务分为两个独立的阶段。在第一个阶段,候选区域(通常是候选边界框)被生成,而在第二个阶段,这些候选区域被用于目标分类和位置定位。
候选生成: 第一个阶段负责生成潜在的目标区域,通常使用区域生成网络(Region Proposal Network,RPN)或其他技术来生成候选区域。这些候选区域是在输入图像上密集生成的,并且具有不同的尺度和长宽比,以覆盖各种目标。
分类和定位: 第二个阶段接受第一个阶段生成的候选区域,并执行目标分类和位置定位。通常,这个阶段使用深度卷积神经网络(CNN)来对候选区域进行分类,同时进行目标位置的回归以确定最终的检测结果。
更高的准确性: 由于双阶段检测器在候选生成和分类/定位之间有两个独立的步骤,因此它们通常在目标检测准确性方面表现得更好。这是因为第一个阶段可以筛选出大多数背景区域,减少了第二个阶段需要处理的候选区域数量,从而提高了计算效率和准确性。
适用范围广泛: 双阶段检测器通常适用于各种目标检测任务,包括静态图像、视频、复杂场景和多类别目标检测。
经典的双阶段检测器包括:
a.可变形部件模型(DPM) 等系统使用滑动窗口方法,在整个图像中均匀分布的位置运行分类器。
b.R-CNN系列 使用区域建议方法,首先在图像中生成潜在的边界框,然后在这些建议框上运行分类器。分类后,后处理用于完善边界框,消除重复检测,并根据场景中的其他物体对边界框重新评分。这些复杂的流水线既缓慢又难以优化,因为每个组件都必须单独训练。
缺点:
1.慢
2将背景进行误分类的概率大.。
(2).单阶段检测
特点:
单阶段检测器: 单阶段检测器直接在输入图像上密集地提取候选框并预测它们的类别和位置。这些检测器通常采用单个神经网络来同时完成目标的分类和定位,使得整个检测过程更加简单和高效。
密集预测: 单阶段检测器通过在图像的不同位置密集地生成候选框,然后对这些候选框进行分类和位置回归。这种密集的预测方式能够帮助检测器更好地处理不同尺度的目标,并且具有一定的位置鲁棒性。
端到端训练: 单阶段检测器往往可以进行端到端的训练,即直接从原始图像开始,通过反向传播来优化网络参数。这使得训练过程更加简单和高效。
速度快: 由于单阶段检测器只需要一次前向传播就可以完成整个检测过程,因此在速度上往往比传统的两阶段检测器更快。
经典的单阶段检测器包括:
YOLO: YOLO是一种著名的单阶段目标检测器,它通过将目标检测任务转化为回归问题来实现端到端的目标检测。
SSD (Single Shot Multibox Detector): SSD是另一种经典的单阶段目标检测器,它通过多尺度特征图来进行密集预测,从而提高了检测的精度。
缺点:
1.精度相对逊色
2.模型
首先将输入图像分成SxS的grid,如果人工标注数据集的中心落入哪一个grid,那么这个grid就负责检测该物体,每个grid预测B个Bounding boxes,以及每个框的置信度 confidence(置信度分数反映了模型对盒子中包含物体的置信度,以及模型认为盒子预测的准确度)
置信度的定义:
Pr(Object) * IOUtruthpred
这里,Pr(Object),如果grid中不存在物体,则为0,否则为1
每个框的预测包含五个维度:(x, y, w, h, confidence)分别是框的x y坐标,以及框的宽 高和置信度
每个grid还预测C个条件概率:即Pr(Classi|Object)(包含物体的情况下是第i类的概率)
在测试的时候将条件概率和置信度相乘:
条件概率公式:
P
(
A
∣
B
)
=
P
(
A
∩
B
)
P
(
B
)
P(A|B) = \frac{P(A \cap B)}{P(B)}
P(A∣B)=P(B)P(A∩B)
将条件概率公式带入得:
算法模型:
YOLO由24层conv以及2层FC组成,最后的输出结果是7x7x30的预测张量(7 x 7 x (B x 5 + C))
前20层conv 在 ImageNet 1000-class competition dataset上进行预训练用作分类任务,随后添加了4个conv层以及2个FC层以用于检测任务,而且由于检测需要更加精细的信息,因此将原始224 x 224的图像提升至448 x 448
在模型的最后一层使用了线性激活函数,所有其他层都使用了Leaky ReLU:
ϕ
(
x
)
=
{
x
i
f
x
>
0
0.1
x
o
t
h
e
r
w
i
s
e
ϕ(x)=\begin{cases} x & if x >0 \\ 0.1x & otherwise \end{cases}
ϕ(x)={x0.1xifx>0otherwise
在optimize时,使用SSE(sum-squared error)进行优化。SSE虽然易于优化,但是它将所有的权重都设为一样,这显然不符合优化目标,另外很多框并不包含物体,他会使得置信度为0,从而导致模型的不稳定。
为了解决这个问题,我们 增加边界框坐标预测的损失 ,减少不包含物体的边界框置信度预测的损失。我们使用两个参数 λcoord 和 λnoobj 来实现这一目标。我们设置 λcoord = 5 和 λnoobj= 0.5。
总方误差也同样权衡大方框和小方框中的误差。我们的误差指标应该反映出,大方框中的小偏差比小方块中的小偏差更重要。为了部分解决这个问题,我们预测了边框宽度和高度的平方根,而不是直接预测宽度和高度。
YOLO 为每个网格单元预测多个边框。在训练时,我们只希望每个对象由一个边界框预测器负责。我们根据当前与地面实况的 IOU 值最高的预测结果,指定一个预测器 "负责 "预测一个对象。这就导致了边界框预测器之间的专业化。每个预测器都能更好地预测特定尺寸、长宽比或类别的物体,从而提高整体召回率。
3.损失函数
YOLO 使用预测与真值之间的误差平方和来计算损失。损失函数包括:
分类损失
如果检测到一个物体,每个单元的分类损失就是每个类别条件概率的平方误差:
定位损失(预测边界框与真值之间的误差)
定位损失测量的是预测边界框位置和大小的误差。我们只计算负责检测物体的边界框:
我们不希望将大方框和小方框中的绝对误差权重相同,即大方框中的 2 像素误差与小方框中的相同。为了部分解决这个问题,YOLO 预测的是边界框宽度和高度的平方根,而不是宽度和高度。此外,为了更加强调边界框的准确性,我们将损失乘以 λcoord (默认值:5)。
设想一下,一个大的物体的检测框的差距很大程度上大于一个小物体的检测框:
在这种情况下,定位损失的主要来源是大的物体的框的损失,因此将 w 和 h 取平方根,就能够一定程度上削减损失函数对大物体的依赖,从而能够更好的检测小物体
置信度损失(边界框的类别)
如果在盒子中检测到一个物体,则置信度损失(测量盒子的物体度)为:
如果未在方框中检测到物体,则会造成置信度损失:
大多数方框都不包含任何物体。这就造成了类不平衡的问题,即我们训练模型检测背景的频率要高于检测物体的频率。为了解决这个问题,我们用系数 λnoobj 来降低这种损失的权重(默认值:0.5)。
总的损失函数为:
如果一个物体被多个边框预测到,可以采用非最大抑制策略,只保留最好的框,将其他框都抹去。
NMS具体步骤:
1.将边框按照置信度排序
2.从最大的开始,如果发现当前预测边框与之前的属于同一类,并且二者的IoU>0.5则忽略当前边框
3.重复第2步,直到所有边框都被检测过
不足
YOLO 对边界框预测施加了很强的空间限制,因为每个网格单元只能预测两个边界框,并且只能有一个类别。这种空间约束限制了我们的模型所能预测的附近物体的数量。
1.很难预测成群出现的小物体
在v1中,将图像分成 7 * 7 的grid cell,每个 cell中包含2个 bounding boxes,因此只能预测98个bounding box,每个 cell 中的两个框只有一个能够用来预测物体(另一个由于confidence score过低被抛弃),因此每个 cell只能预测一个物体,只能预测49个物体
例如对如下图片一共有9个人在左下角,但是YOLO只能检测出5个:
2.模型的定位性能比较差
由于我们的模型是从数据中学习预测边界框的,因此它很难通用于新的或不寻常的长宽比或配置的物体。我们的模型还使用了相对粗糙的特征来预测边界框,因为我们的架构对输入图像进行了多层降采样。
最后,虽然我们使用近似检测性能的损失函数进行训练,损失函数在处理小边界框与大边界框中的错误时是相同的。大包围盒中的微小误差通常是无害的,但小包围盒中的微小误差对 IOU 的影响要大得多。我们的主要错误来源是不正确的定位。
3.map值比较低
由于只经过单阶段,相比与二阶段的区域提案+目标检测,准确率相对较低
4.recall比较低
将全部目标全部检测出来的能力较差,这一点也很有意思,受制于小目标以及密集目标检测能力的短板,导致整体的站汇率也比较低。