我们提出了一种新的目标检测方法- YOLO。以前的目标检测工作重复利用分类器来完成检测任务。相反,我们将目标检测框架看作回归问题,从空间上分割边界框和相关的类别概率。单个神经网络在一次评估中直接从整个图像上预测边界框和类别概率。由于整个检测流水线是单一网络,因此可以直接对检测性能进行端到端的优化。
我们的统一架构非常快。我们的基础 YOLO 模型以 45 帧/秒的速度实时处理图像。Fast YOLO 是 YOLO 的一个较小版本,每秒能处理惊人的 155 帧图像,同时实现其它实时检测器两倍的 mAP。与最先进的检测系统相比,YOLO 虽然存在较多的定位错误,但很少将背景预测成假阳性(其它先进的目标检测算法将背景预测成目标的概率较大)。最后,YOLO 能学习到目标非常通用的表示。当从自然图像到艺术品等其它领域泛化时,它都优于其它检测方法,包括DPM 和 R-CNN
人们瞥一眼图像,立即知道图像中的物体是什么,它们在哪里以及它们如何相互作用。人类的视觉系统是快速和准确的,使我们能够执行复杂的任务,例如如驾驶车辆时不会刻意地进行思考或思想。快速、准确的目标检测算法可以让计算机在没有专用传感器的情况下驾驶汽车,使辅助设备能够向人类用户传达实时的场景信息,并具有解锁通用目的和响应机器人系统的潜力。
目前的检测系统重复利用分类器来执行检测。为了检测目标,这些系统为该目标提供一个分类器,并在不同的位置对其进行评估,并在测试图像中进行缩放。像可变形部件模型(DPM)这样的系统使用滑动窗口方法,其分类器在整个图像的均匀间隔的位置上运行[10]。
最近的许多方法,如 R-CNN 使用 region proposal 方法首先在图像中生成潜在的边界框,然后在这些提出的框上运行分类器。在分类之后,通过后处理对边界框进行修正,消除重复的检测,并根据场景中的其它目标重新定位边界框[13]。这些复杂的流程很慢,很难优化,因为每个单独的组件都必须单独进行训练。
我们将目标检测进行重构并看作为单一的回归问题,直接从图像到边界框坐标和类别概率。使用我们的系统,您只需要在图像上看一次(you only look once, YOLO),以预测出现的目标和位置。
YOLO 新奇又很简单:如图 1 所示。单个卷积网络同时预测这些框的多个边界框和类别概率值。YOLO 在全图像上训练并直接优化检测性能。这种统一的模型比传统的目标检测方法有一些好处。
首先,YOLO 速度非常快。由于我们将检测视为回归问题,所以我们不需要复杂的流程。测试时我们在一张新图像上简单的运行我们的神经网络来预测检测。我们的基础网络以每秒 45 帧的速度运行在 Titan X GPU 上没有批处理,快速版本运行速度超过 150fps。这意味着我们可以在不到 25 毫秒的延迟内实时处理流媒体视频。此外YOLO 实现了其它实时系统两倍以上的 mAP。关于我们的系统在网
络 摄 像 头 上 实 时 运 行 的 演 示 , 请 参 阅 我 们 的 项 目 网 页 :http://pjreddie.com/yolo/
其次,YOLO 在进行预测时,会对图像进行全局地推理。与基于滑动窗口和 region proposal 的技术不同,YOLO 在训练期间和测试时会看到整个图像,所以它隐式地编码了关于类的上下文信息以及它们的外形。Fast R-CNN 是一种顶级的检测方法[14],但因为它看不到更大的上下文,所以在图像中会将背景块误检为目标。与 Fast R-CNN相比,YOLO 的背景误检数量少了一半
第三,YOLO 学习目标的泛化表示。当在自然的图像上进行训练并对艺术作品进行测试时,YOLO 大幅优于 DPM 和 R-CNN 等顶级检测方法。由于 YOLO 具有高度泛化能力,因此在应用于新领域或碰到非正常输入时很少出故障
YOLO 在准确度上仍然落后于最先进的检测系统。虽然它可以快速识别图像中的目标,但它仍在努力精确定位一些目标,尤其是一些小目标。我们在实验中会进一步检查这些权衡。
我们将目标检测的单独组件集成到单个神经网络中。我们的网络使用整个图像的特征来预测每个边界框。它还可以同时预测一张图像中的所有类别的所有边界框。这意味着我们的网络全面地推理整张图像和图像中的所有目标。YOLO 设计可实现端到端训练和实时的速度,同时保持较高的平均精度。
我们的系统将输入图像分成 S×S 的网格。如果一个目标的中心落入一个网格单元中,该网格单元负责检测该目标。
每个网格单元预测这些box的 B 个边界框和置信度分数。这些置信度分数反映了该模型对box是否包含目标的置信度,以及它预测盒 子 的 准 确 程 度 。 在 形 式 上 , 我 们 将 置 信 度 定 义 为 P r ( O b j e c t ) ∗ I O U t r u t h p r e d Pr(Object)∗IOU_{truthpred} Pr(Object)∗IOUtruthpred。如果该单元格中不存在目标,则置信度分数应为零。否则,我们希望置信度分数等于预测框与真实值之间联合部分的交集(IOU)。
每个边界框包含 5 个预测:x、y、w、h 和置信度。(x,y)坐标表示边界框相对于网格单元边界框的中心。宽度和高度是相对于整张图像预测的。最后,置信度预测表示预测框与实际边界框之间的 IOU
每个网格单元还预测 C 个条件类别概率 r ( C l a s s i ∣ O b j e c t ) r(Classi|Object) r(Classi∣Object)。这些概率以包含目标的网格单元为条件。每个网格单元我们只预测的一组类别概率,而不管边界框的的数量 B 是多少。
在测试时,我们乘以条件类概率和单个box的置信度预测值
它为我们提供了每个框特定类别的置信度分数。这些分数编码了该类出现在框中的概率以及预测框拟合目标的程度。
为了在 VOC 上评估 YOLO,我们使用 S=7,B=2。VOC 有 20 个标注类,所以 C=20。所以最终的预测是 7×7×30(30=2*5+20) 的张量。
我们将此模型实现为卷积神经网络,并在 VOC 检测数据集[9]上进行评估。网络的初始卷积层从图像中提取特征,而全连接层预测输出概率和坐标。
我们的网络架构受到 GoogLeNet 图像分类模型的启发[34]。我们的网络有 24 个卷积层,后面是 2 个全连接层。我们只使用 1×1 降维层,后面是 3×3 卷积层,这与 Lin 等人[22]的模型结构类似,而不是GoogLeNet 使用的 Inception 模块。完整的网络如图 3 所示。
我们还训练了快速版本的 YOLO,旨在挑战快速目标检测的界限。快速 YOLO 使用具有较少卷积层(9 层而非 24 层)的神经网络,在这些层中使用较少的卷积核。除了网络规模之外,YOLO 和快速YOLO 的所有训练和测试参数都是相同的。
我们网络的最终输出是 7×7×30 的预测张量。
我们在 ImageNet 1000 类竞赛数据集[30]上预训练我们的卷积层。对于预训练,我们使用图 3 中的前 20 个卷积层,接着是平均池化层和全连接层。我们对这个网络进行了大约一周的训练,并且在ImageNet 2012 验证集上获得了单一裁剪图像 88%的 top-5 准确率,与 Caffe 模型池中的 GoogLeNet 模型相当。我们使用 Darknet 框架进行所有的训练和推断[26]。
然后我们转换模型来进行检测任务。Ren 等人表明,预训练网络中增加卷积层和连接层可以提高性能[29]。按照他们的例子,我们添加了四个卷积层和两个全连接层,并且对权重进行随机初始化。检测通常需要细粒度的视觉信息,因此我们将网络的输入分辨率从224×224 变为 448×448。
我们的最后一层预测类别概率和边界框坐标。我们通过图像宽度和高度来归一化边界框的宽度和高度,使它们落在 0 和 1 之间。我们将边界框 x 和 y 坐标参数化为特定网格单元位置的偏移量,所以它们边界也在 0 和 1 之间
我们对最后一层使用线性激活函数,所有其它层使用下面的leaky ReLU 激活函数:
L e a k y R e L U ( x ) = { x i f x > 0 0.1 x o t h e r w i s e Leaky ReLU(x)=\begin{cases} x \qquad if \ x>0 \\ 0.1x \quad otherwise \end{cases} LeakyReLU(x)={xif x>00.1xotherwise
我们优化了模型输出的平方和误差。我们使用平方和误差是因为它很容易进行优化,但是它并不完全符合我们最大化平均精度的目标。分类误差与定位误差的权重是一样的,这可能并不理想。另外,在每张图像中,许多网格单元不包含任何对象。这将导致这些单元格的“置信度”分数为零,通常压倒了包含目标的单元格的梯度。这可能导致模型不稳定,从而导致训练过早发散
为了改善这一点,我们增加了边界框坐标预测的损失,并减少了不包含目标边界框的置信度预测的损失。我们使用两个参数 λ c o o r d λcoord λcoord 和 λ n o o b j λnoobj λnoobj 来完成这个调整工作。我们设置 λcoord=5 和 λnoobj=0.5。
平方和误差也可以在大box和小box中同样加权误差。我们的误差指标应该反映出,大box中小偏差的重要性不如小box中小偏差的重要性。为了部分解决这个问题,我们直接预测边界框宽度和高度的平方根,而不是宽度和高度。
YOLO 每个网格单元预测多个边界框。在训练时,每个目标我们只需要一个边界框预测器来负责。我们根据哪个预测器的预测值与真实值之间具有当前最高的 IOU 来指定哪个预测器“负责”预测该目标。这导致边界框预测器之间的专一化。每个预测器可以更好地预测特定大小、长宽比或目标的类别,从而改善整体召回率。
在训练期间,我们优化以下由多部分组成的损失函数:
其中 1 i o b j 1^{obj}_i 1iobj 表示目标是否出现在网格单元 i 中, 1 i j o b j 1^{obj}_{ij} 1ijobj 表示网格单元 i 中的第 j 个边界框预测器“负责”该预测。
注意,如果目标存在于该网格单元中(前面讨论的条件类别概率),则损失函数仅惩罚分类误差。如果预测器“负责”真实边界框(即该网格单元中具有最高 IOU 的预测器),则它也仅惩罚边界框坐标误差。
我们在 Pascal VOC 2007 和 2012 的训练和验证数据集上进行了大约135个迭代周期的网络训练。在Pascal VOC 2012上进行测试时,我们的训练包含了 Pascal VOC 2007 的测试数据。在整个训练过程中,我们使用了 64 的批大小,0.9 的动量和 0.0005 的衰减率.
我们的学习率方案如下:对于第一个迭代周期,我们慢慢地将学习率从 1 0 − 3 10^{−3} 10−3提高到 1 0 − 2 10^{−2} 10−2。如果我们从高学习率开始,我们的模型往往会由于梯度不稳定而发散。我们继续以 1 0 − 2 10^{−2} 10−2 的学习率训练 75 个迭代周期,然后用 10−3的学习率训练 30 个迭代周期,最后用 1 0 − 4 10^{−4} 10−4的学习率训练 30 个迭代周期。
为了避免过度拟合,我们使用 dropout 和大量的数据增强。在第一个连接层之后,dropout 层使用 rate=0.5 的比例,防止层之间的互相适应[18]。对于数据增强,我们引入高达原始图像 20%大小的随机缩放和转换。我们还在 HSV 色彩空间中使用高达 1.5 的因子来随机调整图像的曝光和饱和度。
先将ImageNet图像分辨率转为224x224,输入网络进行预训练,然后转换模型进行检测任务。
与训练时一样,预测测试图像的检测只需要一次网络评估。在Pascal VOC 上,每张图像上网络预测 98 个边界框(译者注:每张图像被划分成 7*7 的格子,每个格子预测两个边界框,总共 98 个边界框)和每个框的类别概率。YOLO 在测试时非常快,因为它只需要运行一次网络评估,不像基于分类器的方法。
网格设计强化了边界框预测中的空间多样性。通常很明显一个目标落在哪一个网格单元中,而网络只能为每个目标预测一个边界框。然而,一些大的目标或靠近多个网格单元边界的目标可以被多个网格单元很好地定位。非极大值抑制(译者注:NMS)可以用来修正这些多重检测。对于 R-CNN 或 DPM 而言,虽然非极大值抑制对性能影响不大,但会增加 2−3%的 mAP。
YOLO 对边界框预测强加空间约束,因为每个网格单元只预测两个框,只能有一个类别。这个空间约束限制了我们的模型可以预测的邻近目标的数量。我们的模型对成群出现的小物体(比如鸟群)预测效果较差。
由于我们的模型学习从数据中预测边界框,因此它很难泛化到新的、不常见的长宽比或配置中的目标。我们的模型也使用相对较粗糙的特征来预测边界框,因为我们的架构具有来自输入图像的多个下采样层。
最后,当我们训练一个近似检测性能的损失函数时,我们的损失函数会同样的对待小边界框与大边界框的误差。大边界框的小误差通常是良性的,但小边界框的小误差对 IOU 的影响要大得多。我们的主要误差来源是定位误差。
目标检测是计算机视觉中的核心问题。检测流程通常从输入图像上提取一组鲁棒特征(Haar [25],SIFT [23],HOG [4],卷积特征[6])开始。然后,分类器[36,21,13,10]或定位器[1,32]被用来识别特征空间中的目标。这些分类器或定位器在整个图像上或在图像中的一些子区域上以滑动窗口的方式运行[35,15,39]。我们将 YOLO 检测系统与几种顶级检测框架进行比较,以突出了主要的相似性和差异性。
可变形部件模型(DPM)。可变形零件模型(DPM)使用滑动窗口方法进行目标检测[10]。DPM 使用不相交的流程来提取静态特征,对区域进行分类,预测高评分区域的边界框等。我们的系统用单个卷积神经网络替换所有这些不同的部分。网络同时进行特征提取、边界框预测、非极大值抑制和上下文推理。网络内嵌训练特征而不是静态特征,并优化它们完成检测任务。我们的统一架构获得了比 DPM 更快、更准确的模型。
R-CNN R-CNN 及其变种使用 region proposals 而不是滑动窗口来查找图像中的目标。Selective Search [35]产生潜在的边界框、卷积网络提取特征、SVM 对边界框进行评分、线性模型调整边界框、非极大值抑制消除重复检测。这个复杂流程的每个阶段都必须独立地进行精确调整,所得到的系统非常慢,测试时每张图像需要超过 40 秒[14]。
YOLO 与 R-CNN 有一些相似之处。每个网格单元提出潜在的边
界框并使用卷积特征对这些框进行评分。但是,我们的系统对网格单元提出进行了空间限制,这有助于缓解对同一目标的多次检测。我们的系统还提出了更少的边界框,每张图像只有 98 个,而 Selective Search 则需要 2000 个左右。最后,我们的系统将这些单独的组件组合成一个单一的、共同优化的模型。
其它快速检测器。Fast 和 Faster R-CNN 通过共享计算和使用神经网络替代 Selective Search 来提出区域加速 R-CNN 框架[14 28]。虽然它们提供了比 R-CNN 更快的速度和更高的准确度,但两者仍然不能达到实时性能。
许多研究工作集中在加快 DPM 流程上[31] [38] [5]。它们加速HOG 计算,使用级联,并将计算推动到 GPU 上。但是,实际上 DPM [31]实时运行只达到 30Hz
YOLO 不是试图优化大型检测流程的单个组件,而是完全抛弃流程,为提升检测速度而重新设计。
像人脸或行人等单类别的检测器可以被高度优化,因为他们只需处理更少的多样性[37]。YOLO 是一种通用的检测器,可以学习同时检测不同的多个目标。
下面还有与MultiGrasp、OverFeat、Deep MultiBox的对比,这些模型我也没看过,就不翻译了
实验部分说的是自己的评价指标
论文中没说后处理操作,这边着重介绍下后处理。
与训练时一样,预测测试图像的检测只需要一次网络评估。在VOC 上,每张图像上网络预测 98 个边界框(图像被划分成 7*7 的格子,每个格子预测两个边界框,总共 98 个边界框)和每个框的类别概率。YOLO 在测试时非常快,因为它只需要运行一次网络评估。
网格强化了边界框预测中的空间多样性。然而,一些大的目标或靠近多个网格单元边界的目标可以被多个网格单元很好地定位。非极大值抑制(NMS)可以用来修正这些多重检测。
在得到推理结果后,如何获取我们真正想要的信息呢?
yolo后处理就是模型的输出进行处理,得到我们想要的坐标框的 x y w h xywh xywh以及 c o n f i d e n c e confidence confidence
学习笔记
这是yolov1的模型,他将图像划分成了7x7个网格,每个网格负责预测两个边界框,每个边界框都有5个信息 x 、 y 、 w 、 h 、 c o n f i d e n c e x、y、w、h、confidence x、y、w、h、confidence ,(这个confidence是该区域有目标框的概率),共预测20个类,每个类都有一个置信度信息(这个confidence是这个框是猫是狗的概率),所以最终输出为 7 ∗ 7 ∗ 30 7*7*30 7∗7∗30
然后每个边界框的confidence 乘以所有类别的confidence就是边界框的全概率
这样每个grid cell都能有两个20维向量,一共49个grid cell,所以共有98个向量
这些向量就组成如下的很多边界框
下一步就是筛选出真正的边界框
第一步:这张图片上并不是有20个类的,所以先有个阈值将大于这个阈值的类别筛选出来,比如筛选出了dog、bicycle、car
然后分别对这三个类处理,比如先对dog,从dog类的所有96个置信度进行从大到小排个序,设置一个阈值,confidence小于这个阈值的就被舍去了。
但确实还有真正包含某个物体的多个框,比如下面四个bbox的置信度都比较大,那怎么从这多个框中选择最合适的呢?
下面就是非极大抑制NMS
应该先将置信度最大的拿出来,然后后面的每一个都与第一个最大的作比较,如果IOU大于某个阈值,则认为两个识别了同一个物体,则把低置信度的那个抑制掉。比如bbox20和bbox47重合度较大,所以认为两个是同一物体。
如果IOU小于这个阈值,就说明两个框不是识别的同一个物体,保留。bb15和bb7与bb47的重合度较小,所以认为两个box不是同一个物体。
然后选取剩下的第二大置信度作为基box,其他框再与这个框比较,比如bb7和bb15重合度较大,认为这两个box内是同一个物体。
合适的阈值下可能只留下一个框,当然某些阈值下可能会保留更多的框,阈值的设置应该是根据目标任务设置的,越高的阈值(越不容易置零,即越宽容)会检测出越多的目标。
对其他类别也是同样操作,就得到了所有的目标框。
当然注意,在训练阶段是不需要剔除框的,所有框对我们反向传播参数更新都是有用的,只是在推理阶段需要这样做。
每个grid cell 预测两个bbox,但只负责预测一个物体,也就是整张图片最多预测49个物体,这也就是为什么yolov1对密集小目标检测效果不好的原因。
yolov1的损失函数分为三部分
YOLO 对边界框预测强加空间约束,因为每个网格单元只预测两个框,只能有一个类别。这样就限制了模型可预测的邻近目标的数量。因此对物体较为密集的场景预测效果较差。
模型学习从数据中预测边界框,因此它很难泛化到新的、不常见的长宽比或配置中的目标。