跳转至

YOLO1

概要

YOLO, You Only Look Once, 是一种全新的目标检测方法. 与以往将分类器改造用于检测的方式不同, YOLO将目标检测问题视为一个回归问题, 直接预测图像中空间上分离的边界框及其对应的类别. 具体来说, YOLO使用一个单一的神经网络从完整的图像中直接预测边界框和类别概率, 只需要一次前向传播就可以完成任务. 由于整个检测流程被整合成一个统一的网络, YOLO能够端到端地优化检测性能, 这不仅提高了检测的效率, 还优化了训练过程.

YOLO的架构非常高效, 其基础模型能够实时处理每秒45帧的图像, 而一个更小的版本, Fast YOLO, 甚至可以达到每秒155帧, 同时在实时检测器上实现了其他方法两倍的平均精度(mAP). 和当前SOTA的检测系统相比, YOLO在定位精度上可能会有一些误差, 但是它在减少背景中的FP(False Positives), 即误报方面表现得很好. 此外, YOLO能够学习到非常通用得目标表示能力, 在从自然图像推广到其他领域(比如艺术作品)的应用中, YOLO的表现优于包括DPM和R-CNN在内的其他检测方法.

背景

识别速度的重要性

人类瞥一眼图像, 就能立即知道图像中有哪些物体, 它们在哪里, 以及它们是如何相互作用的. 人类的视觉系统快速而准确, 使我们几乎不需要有意识地思考就能完成驾驶等复杂任务. 快速, 准确的物体检测算法可以让计算机在没有专门传感器的情况下驾驶汽车, 让辅助设备向人类用户传递实时场景信息, 并释放打造通用, 反应灵敏的机器人系统的潜力.

DPM

目前的检测系统都是利用改造的分类器来进行检测. 为了检测一个物体, 这些系统会使用该物体的分类器, 并在测试图像的不同位置和尺度上对其进行评估, DPM等系统使用滑动窗口的方法, 在整个图像上均匀分布的位置上运行分类器.

R-CNN

最近的方法, 如R-CNN使用区域提案, 首先在图像中生成潜在的边界框, 然后在这些提议的边界框上运行分类器. 分类后, 进一步地, 完善边界框, 消除重复检测, 并根据场景中的其他物体对边界框进行重新评分. 这些复杂的流水线既缓慢又无法优化, 因为每个组件必须单独训练.

YOLO

作者将物体检测重构为一个单一的回归问题, 直接从图像像素到边界框坐标和类别概率. 使用他们的系统, 您只需要观察一次图像(YOLO), 就能预测出哪些物体存在以及它们在哪里.

YOLO检测系统. 使用YOLO处理图像是一个简单又直接的过程. 他们的系统 (1) 将图像resize到448*448, (2) 在图像上跑一个卷积网络, (3) 根据模型的置信度对检测结果进行阈值化处理

YOLO简单地令人耳目一新: 见上图. 一个卷积网络可以同时预测多个边界框和这些边界框的类别概率. YOLO在完整图像上进行训练, 并直接优化检测性能. 这和传统的物体检测方法相比, 这种过统一模型具有多种优势.

首先, YOLO速度极快. 由于他们将检测视为一个回归问题, 因此不需要复杂的流水线. 只需要在测试时在新图上运行神经网络, 即可预测检测结果. 他们的基础网络在Titan X GPU上以每秒45帧的速度运行, 没有进行批处理, 而快速版本的运行速度则超过了每秒150帧. 这意味着可以实时处理流媒体视频, 延迟时间不到25毫秒. 此外, YOLO的平均精度也是其他实时系统的2倍多. 如果需要观看他们的系统在网络摄像头上实时运行的演示, 可以访问他们的项目网页: http://pjreddie.com/yolo/.

其次, YOLO在进行预测的时候会对图像进行全局推理. 这和基于滑动窗口和区域提议的技术不同, YOLO在训练和测试的时候看到的都是整幅图像, 所以它可以隐式的对关于类别及外观的上下文信息进行编码. Faster R-CNN, 一个顶级检测方法, 由于看不到更大的上下文, 因此会将图像中的背景patches看成是物体. YOLO的背景错误率(FP)不到一半.

再者, YOLO可以学习物体的通用表征. 在自然图像上进行训练并在艺术品图片上进行测试的时候, YOLO的表现远超过DPM和R-CNN等顶级检测方法. 由于YOLO具有很强的通用性, 因此在用于新领域或者出人意料的输入的时候, 不太可能出现问题.

在准确度方面, YOLO仍然落后于最先进的检测系统. 虽然它能够快速识别图像中的物体, 但是在精准定位某些物体(尤其是小物体)方面却很吃力. 作者将在实验中进一步研究这些权衡问题.

他们的所有训练和测试代码都是开源的, 各种预训练模型也可供下载.

方法论

作者将物体检测的各个组成部分统一到一个神经网络中. 他们的神经网络使用整个图像的特征来来预测每个边界框. 它还能同时预测图像中所有类别的所有边框. 这意味着网络可以对整个图像和图像中的所有物体进行全局推理. YOLO设计可以实现端到端的训练和实时推理, 同时保持较高的平均精度.

图像划分与类别概率计算

该系统会将输入图像划分为\(S\times S\)个cell. 如果一个物体的中心落在一个cell中, 那么该cell负责检测该物体. 每个cell检测\(B\)个box和这些box的置信度. 这些置信度反映了模型对该box内包含一个物体的确定程度, 以及模型认为其预测的box边框的准确度. 正式地, 他们将置信度定义为\(Pr(Object)\times IOU^{truth}_{pred}\). \(Pr(Object)\)表示该box是否包含目标物体的概率. \(IOU^{truth}_{pred}\)表示box预测的的边界框和真实的边界框的重叠程度, 即交并比(Intersection over Union, IOU), 公式表示为:

\[IOU=\frac{\text{预测框和真实框的交集面积}}{\text{预测框和真实框的并集面积}}\]
\[confidence=Pr(Object)\times IOU^{truth}_{pred}\]

每个box由\(5\)个预测值组成, \(x, y, w, h\)和置信度. \((x, y)\)坐标表示相对于cell边界的box中心, 宽度和高度是相对于整个图像的预测值. 置信度表示的是模型对该box内包含一个物体的确定程度, 以及模型认为其预测的box边框的准确度.

每个cell还预测\(C\)个条件概率, 即\(Pr(Class_i|Object)\), 这些概率以包含物体的cell作为条件. 他们只预测每个cell内的一组类别的概率, 和box的数量\(B\)无关, 或者说, 对于所有的box都是这个条件概率都适用.

在预测阶段, 某个cell内的某个box内包含\(Class_i\)的概率为:

\[\Pr(Class_i | Object) \cdot \Pr(Object) \cdot IOU_{\text{pred}}^{\text{truth}} = \Pr(Class_i) \cdot IOU_{\text{pred}}^{\text{truth}}\]

这些分数表示该类出现在box中的概率, 也表示预测的box和物体的匹配程度.

YOLO模型. 他们的模型是一个回归问题. 它将一张图片分成$S\times S$的cell, 对于每个cell预测$B$个box, 这些box的置信度, 和$C$个类别概率. 这些预测被编码为一个$S\times S\times (B*5+C)$的tensor

他们选择在PASCAL VOC上评估YOLO. 设置\(S=7\), \(B=2\). PASCAL VOC有20个标注类别, 所以\(C=20\), 所以预测会产生一个\(7\times 7\times 30\)的tensor.

总结
  1. 将输入图像划分为\(S\times S\)个cell
  2. 每个cell预测\(B\)个box, 每个box的输出是\((x, y, w, h, confidence)\), 其中
    1. \((x, y)\)是预测的box中心相对于它所处的cell的左上角的偏移
    2. \((w, h)\)是预测的box宽高, 相对于整张图像
    3. \(confidence=Pr(Object)\times IOU^{truth}_{pred}\)
  3. 每个cell还预测\(C\)个条件类别概率\(Pr(Class_i|Object)\), 对该cell的所有box共享这组概率
  4. 在推理的时候, 某box属于某类\(Class_i\)的最终置信度分数为\(Pr(Class_i|Object)\times Pr(Object)\times IOU^{truth}_{pred}=Pr(Class_i)\times IOU^{truth}_{pred}\)
  5. 因此模型的最终输出维度为\(S\times S\times (B\times 5+C)\)

网络设计

作者以卷积神经网络的形式实现了这个模型, 并在PASCAL VOC检测数据集上对其进行了评估. 网络的初始卷基层从图像中提取特征, 而全连接层预测输出的概率和坐标.

他们的网络架构受到了GoogLeNet图像分类模型的启发. 网络共有24个卷积层, 然后是2个全连接层. 他们并没有使用GoogLeNet的Inception模块. 取代Inception模块的方式是使用1*1卷积层然后再使用3*3卷积层进行特征提取. 网络架构如图所示.

YOLO网络架构. 使用了24层卷积层和2层全连接层. 交替使用的1*1卷积层缩小了前几层的特征空间. 他们在ImageNet分类任务中以一半的分辨率(224*224)输入对卷积层进行预训练, 然后以两倍的分辨率用于检测.

他们还训练了一个快速版本的YOLO, 旨在突破快速物体检测的极限. 快速YOLO使用的神经网络的卷积层较少, 9层而不是24层, 卷积层中的过滤器也较少. 除了网络的大小, YOLO和快速YOLO的所有训练和测试的参数都是一样的.

网络的最终输出是一个\(7\times 7\times 30\)的预测tensor.

训练

预训练

作者在ImageNet-1K数据集上对卷积层进行了预训练. 在预训练中, 他们使用了上面的架构图👆的前20层卷积层, 然后是平均池化层和全连接层. 他们对网络进行了大约一周的训练, 在ImageNet 2012的验证集上单次裁剪图片预测的top-5准确率为88%, 与Caffe Model Zoo中的GoogLeNet模型相当. 他们使用Darknet框架进行了所有的训练和推理.

推理

然后, 他们将模型用于物体检测. Ren等人的研究表明, 在预训练的网络中同时添加卷积层和连接层可以提高性能. 按照他们的例子, 作者添加了四个卷积层和两个随机初始化权重的全连接层. 由于物体检测通常需要更加精细的视觉信息, 因此他们将网络的输入分辨率从224*224提高到了448*448.

坐标尺寸归一化

最后一层负责预测类别概率和box的坐标. 他们根据图像的宽度和高度对box的宽度和高度进行了归一化处理, 使其位于0和1之间. 他们将box的\(x\)\(y\)坐标定位特定cell位置的偏移量, 使其也介于0和1之间.

激活函数

他们在最后一层使用了线性激活函数, 其他的所有层使用了以下Leaky ReLU激活函数.

\[\phi(x) = \begin{cases} x, & \text{if } x > 0 \\ 0.1x, & \text{otherwise} \end{cases}\]

误差

误差种类

误差由以下几部分组成: 边界框回归损失(Localization Loss), 衡量预测的box坐标, 尺寸和真实box坐标, 尺寸之间的差异; 物体置信度损失(Objectiveness Loss), 衡量预测的box中存在物体的置信度和实际是否存在目标之间的差异; 分类预测损失(Classification Loss), 衡量预测类别概率分布和真实类别分布之间的差异.

损失加权

他们对模型输出的平方误差(sum-squared error, SSE)进行了优化. 使用平方误差是因为它易于优化. 然而, 作者指出它并不能很好地契合实际目标, 即最大化平均精度. 在使用这种误差的时候, 不同误差种类之间的权重未被明确引入, 如 边界框回归损失分类预测损失 都被赋予了相同的权重, 在实际中, 这种等权重的处理可能并不理想, 定位和分类的重要性可能有所不同. 并且, 在每张图像中, 可能许多cell并不包含任何物体, 这会使得这些cell的置信度接近0, 导致它们作为 物体置信度损失 对损失函数的贡献很大, 从而梯度主要来自于这些不包含物体的单元, 这会压倒那些实际包含物体的cell对梯度的影响, 使得模型在训练初期变得不稳定, 甚至导致发散. 所以, 现在很棘手的是怎么解决这几个损失对损失函数贡献权重的问题.

为了解决这个问题, 他们增加了边界框回归损失的权重, 减少了物体置信度损失的权重. 他们使用了两个参数来实现这一目标, \(\lambda_{coord}\)\(\lambda_{noobj}\), 他们设置\(\lambda_{coord}=5\), \(\lambda_{noobj}=.5\).

平方误差同样地, 也赋予了大box和小box误差相同的权重. 误差指标应该反映出, 小box中的小偏差应该比大box中的小偏差更加重要. 为了部分解决这个问题, 作者建议预测box边框宽度和高度的平方根, 而不是直接预测宽度和高度, 这样做的直觉是, 平方根对于大底数的惩罚力度更大, 例如\(\sqrt{64}=8\), \(\sqrt{36}=6\), 可以看到, 64和36相差很多, 但是8和6没差多少, 说明对损失的贡献降低了.

责任分配

YOLO中每个cell负责预测多个box. 为了保证每个物体只由一个box负责, YOLO采取了一种责任分配机制. 对于每个真实的物体, 模型会计算所有预测边界框和该真实物体之间的IOU, 拥有最高当前IOU的预测box将被分配为"负责"预测该物体, 这意味着只有这个预测器会针对该物体进行优化, 而其他的预测器则不会对该物体的预测负责. 通过上述的责任分配, 每个box会逐渐专注于预测特定尺寸, 宽高比或者类别的物体, 从而提高了整体的召回率.

损失函数

YOLO的损失函数是由多个部分组成的:

\[\begin{aligned} &\lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{I}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] \\ &+ \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{I}_{ij}^{\text{obj}} \left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] \\ &+ \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{I}_{ij}^{\text{obj}} \left( C_i - \hat{C}_i \right)^2 \\ &+ \lambda_{noobj} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{I}_{ij}^{\text{noobj}} \left( C_i - \hat{C}_i \right)^2 \\ &+ \sum_{i=0}^{S^2} \mathbb{I}_{i}^{\text{obj}} \sum_{c \in \text{classes}} \left( p_i(c) - \hat{p}_i(c) \right)^2 \end{aligned}\]

\(\mathbb{I}_i^{\text{obj}}\)表示的是物体是否出现在第\(i\)个cell中. \(\mathbb{I}_{ij}^{\text{obj}}\)表示的是第\(i\)个cell中的第\(j\)个box对该预测负责.

请注意, 损失函数只在物体出现在该cell的时候才会对分类错误进行惩罚, 即损失函数的最后一项, 因此才有了前面讨论的条件类概率. 此外, 只有当box对当前的实际物体负责的时候, 即在该cell的所有box中有最高的IOU, 损失函数才会对box坐标进行惩罚, 即损失函数中的第一项和第二项.

其余设置

他们在PASCAL VOC 2007和2012的训练和验证数据集上对网络进行了约135个epoch的训练. 在VOC 2012上测试的时候, 他们还使用VOC 2007测试数据进行训练. 在整个训练过程中, 他们所使用的批次大小为64, 动量为0.9, 权重衰减率为0.0005.

他们的学习率设置如下: 在最初的几个epoch的时候, 学习率从\(10^{-3}\)缓慢提高到\(10^{-2}\). 如果一开始就采取较高的学习率, 模型往往会因为梯度不稳定而发散. 他们继续以\(10^{-2}\)的学习率训练了75个epoch, 然后以\(10^{-3}\)训练了75个epoch, 最后以\(10^{-4}\)的学习率训练了30个epoch.

为了避免过拟合, 他们使用了dropout和密集的数据增强. 在第一个全连接层之后加了一个比率为0.5的dropout层防止层和层之间的共适应(co-adaptation). 在数据增强方面, 他们引入了随机缩放和平移, 最大缩放和平移量为原始图像大小的20%. 他们还随机调整图像的曝光度和饱和度, 在HSV色彩空间中最多调整1.5倍.

推理

和训练一样, 预测测试图像只需要一次正向传播. 在PASCAL VOC上, 网络可以预测每幅图像的98个box以及各个边框的类别概率. 和基于分类器的方法不同, YOLO只需要一次网络传播, 所以在测试的时候速度极快.

非最大抑制

YOLO采用网格设计. 如果图像中的物体较小或者和某个特定区域紧密相关, 很容易判断这个物体属于哪个cell. 然而, 对于一些较大的物体或者靠近多个cell边界的物体, 情况就会复杂一些. 这些物体可能会被多个cell检测到.

为了解决多个cell对同一个物体的重复检测问题, YOLO使用了非最大抑制(NMS)技术, NMS是一种后处理方法, 作用是删除冗余的box, 保留最好的一个. 虽然NMS在YOLO中不是必须的, 因为YOLO的cell设计已经在一定程度上减少了冗余预测的情况, 但是它仍然能够显著提升模型的精度. 具体来说, NMS增加了23%的mAP(平均精度).

局限性

YOLO对box的预测施加了很强的空间约束, 因为每个cell只有两个box, 并且每个cell中只能拥有一个类别. 这种空间约束限制了模型能够预测的靠的比较近的物体的数量. 他们的模型在处理小物体, 尤其是出现在群体中的小物体(例如鸟群)时候的表现较差.

由于他们的额模型是通过数据学习来预测边框的, 因此它在面对新的或者不寻常的纵横比或者configurations时表现不佳. 他们的模型在预测box的时候使用的特征也相对比较粗糙, 因为他们的架构会对输入图像多次下采样.

最后, 金团他们在训练的时候使用了一个近似于检测性能的损失函数, 但是他们的损失函数对于小box和大box的误差处理是近乎相同的, 正如在损失加权中所说, 在大box中, 小误差通常是无害的, 但是在小box中, 小误差的影响更大. 主要误差来源是边界框回归损失.


  1. Redmon, J., Divvala, S., Girshick, R., & Farhadi, A. (2016). You only look once: Unified, real-time object detection (No. arXiv:1506.02640). arXiv. https://doi.org/10.48550/arXiv.1506.02640 

评论