YOLO v3有哪些新特点?

2,031 阅读10分钟

本文编译自medium上的文章:What’s new in YOLO v3? 略有删减。 点击阅读原文,可以直达原文,需要翻墙哦!

You only look once(你只需看一次),或者YOLO,是目前比较快的目标对象检测算法之一。虽然它不再是最精确的目标对象检测算法,但是当您需要实时检测时,它是一个非常好的选择,不会损失太多精确度。

2018年上半年,YOLO的第三个版本问世,这篇文章旨在解释YOLO v3中引入的变化。这不是一个解释YOLO是什么的文章。 我假设您知道YOLO v2是如何工作的。如果情况并非如此,我建议您查看Joseph Redmon等人的论文,了解YOLO如何运作。

YOLO v3: 更好,但没有更快,更强

YOLO v2纸的官方命名为“YOLO9000:更好,更快,更强”,看起来像一种儿童喝的健康牛奶饮品,而不是目标对象检测算法。

YOLO 9000曾经是最快的,也是最准确的算法之一。然而,随着RetinaNet这样算法的出现,它不再是精确度的。 然而,它仍然是最快的算法之一。

为了提高精确度,YOLO v3在速度方面做了妥协。 虽然早期版本在Titan X上可以以45 FPS运行,但当前版本的时钟频率约为30 FPS。这与其Darknet底层架构的复杂性增加有关。

Darknet-53

YOLO v2使用了自定义深度架构darknet-19,最初是19层网络,外加11层用于对象检测。采用30层架构的YOLO v2,在小对象检测上经常遇到麻烦。这归因于层对输入进行了下采样,导致细粒度特征的丢失。为了解决这一问题,YOLO v2使用了特性映射,连接了前一层的特征映射以捕获低级特征。

然而,YOLO v2的架构仍然缺少一些最重要的元素,这些是目前大多数最新算法的主要元素。比如没有剩余块,没有跳连接,也没有上采样。而YOLO v3包含所有这些。

首先,YOLO v3使用了Darknet的变体,最初在Imagenet上训练出53层网络。然后在其上堆叠了53层进行检测任务,这样YOLO v3就拥有106层完全卷积的底层架构。这就是YOLO v3相较于YOLO v2速度慢的原因。下图是YOLO架构现在的样子:

三种尺度的检测

新架构值得夸耀的有残差跳连接(residual skip connections)和上采样。v3最突出的特点是它可以在三种不同的尺度上进行检测。YOLO是一个全卷积网络,它的最终输出是通过在特征映射上应用1 x 1核生成的。在YOLO v3中,通过在网络中三个不同位置的三种不同大小的特征图上应用1×1核来完成检测

检测核的形状是1 × 1 ×(B ×(5 + C))。这里B是特征映射中每个单元可以预测的边界框的数量,“5”表示4个边界框属性和1个对象置信度,C是类别数目。在使用COCO训练的YOLO v3中,B = 3且C = 80,因此核大小为1 x 1 x 255。由该核生成的特征映射具有与先前特征映射相同的高度和宽度,并且具有沿着如上所述的深度的检测属性。

图片源自: blog.paperspace.com/how-to-impl…

在进一步讨论之前,我要指出网络的步幅,即一个层被定义为它对输入进行下采样的比率。在以下示例中,我假设我们有一个大小为416 x 416的输入图像。

YOLO v3在三个尺度上进行预测,分别对输入图像进行32、16和8的尺寸下采样

第一次检测由第82层进行。对于前81层,图像由网络进行下采样,使得第81层具有32的步幅。如果我们的图像大小为416×416,则得到的特征映射为13×13的大小。这里使用1 x 1检测核,为我们提供13 x 13 x 255的检测特征映射。

接下来,来自第79层的特征映射经历几个卷积层之后,2倍上采样增加到26×26的维度。然后,该特征映射与来自第61层的特征映射做深度连接。再然后,组合的特征映射再次经过几个1×1卷积层以融合来自较早层(61)的特征。通过第94层进行第二次检测之后,产生26×26×255的检测特征映射。

再次重复类似的过程,其中来自层91的特征映射在与来自层36的特征映射做深度连接之前经历少量卷积层。像之前一样,接下来几个1×1卷积层来融合来自先前层(36)的信息。我们在第106层进行最后一个3倍增,产生尺寸为52 x 52 x 255的特征映射。

检测较小的目标对象效果更好

不同层次的检测有助于解决小物体的检测问题,这是YOLO v2的常见问题。上采样图层与先前图层连接有助于保留细粒度特征,这有利于检测小对象。

13 x 13层负责检测大型目标对象,而52 x 52层检测较小的目标对象,26 x 26层检测中等大小目标对象。

选择锚点框

YOLO v3总共使用了9个点框。每个尺度下三个。如果您在自己的数据集上训练YOLO,则应该使用K-Means聚类来生成9个锚点。

然后,按照尺寸的降序排列锚点。为第一个尺度分配三个最大的锚点,为第二个尺度分配下三个锚点,为第三个尺度分配最后三个锚点。

每个图像有更多边界框

如果输入图像大小相同,YOLO v3比YOLO v2预测更多的边界框。例如,原始分辨率为416 x 416时,YOLO v2预测13 x 13 x 5 = 845个框。在每个网格单元,使用5个锚点检测到5个框。

而YOLO v3预测3种不同尺度的方框。对于416 x 416的相同图像,预测框的数量是10647。这意味着YOLO v3是YOLO v2预测的盒子数量的10倍。您可以很容易想到为什么它比YOLO v2慢。在每个尺度上,每个网格可以使用3个锚来预测3个框。由于有三个尺度,所以总共使用的锚点框数量为9个,每个尺度3个。

损失函数的变化

早些时候,YOLO v2的损失功能看起来像这样。

图片来自: pjreddie.com/media/files…

我知道这个公式很可难,但请注意最后三个式子。其中,第一个惩罚负责预测对象的边界框的对象分数预测(理想情况下这些分数应为1),第二个用于没有对象的边界框(理想分数应该为零),最后一个惩罚预测对象的边界框的类预测。

YOLO v2中的最后三个项是平方误差,而在YOLO v3中,它们已经被交叉熵误差项所取代。换句话说,现在通过逻辑回归预测YOLO v3中的对象置信度和类别预测

当我们训练检测器时,对于每个真正的框,我们分配一个边界框,其锚点与真正的框最大重叠。

不再用softmax分类

YOLO v3现在对图像中检测到的对象执行多标记分类。

在早期的YOLO中,作者习惯于进行类别softmax,将具有最高得分的类别作为包含在边界框中的目标对象的类别。这在YOLO v3中得到了修改。

Softmax分类依赖于类别是互斥的假设,简单地说,如果一个对象属于一个类别,那么它就不属于另一个类别。这在COCO数据集中工作正常。

但是,当我们在数据集中有PersonWomen之类的类别时,上述假设就失效了。这就是为什么YOLO的作者没有采用softmax分类的原因。相反,使用逻辑回归预测每个类别分数,并且使用阈值来预测对象的多个标签。分数高于此阈值的类别将分配给该框。

基准测试

YOLO v3与其他先进的探测器(如RetinaNet)表现相当,且在COCO mAP 50基准测试中速度更快。它也比SSD及其的变体更好。以下是论文中给出的性能对比。

YOLO与RetinaNet在COCO 50基准测试中的表现

但是,但是,但是,YOLO在COCO基准测试中失去了更高的IoU值,用于拒绝检测。我不打算解释COCO基准测试是如何工作的,因为它超出了本文范围,但COCO 50基准测试中的50是衡量预测的边界框与物体的真正框的对齐程度。这里50对应于0.5 IoU。如果预测和真正框之间的IoU小于0.5,则预测被分类为误定位并标记为假阳性。

在基准测试中,数值越高(例如,COCO 75),框需要更完美地对齐,以免被评估指标拒绝。这是YOLO被RetinaNet超越的地方,因为它的边框不像RetinaNet那样对齐。下面是一个详细的更多基准测试表格。

RetinaNet在COCO 75基准测试中的表现优于YOLO

体验一下

您可以使用此Github仓库中提供的代码在图像或视频上运行检测器。 该代码需要PyTorch 0.3+ 、OpenCV 3和Python 3.5。下载代码后,您可以在其上进行各种试验。

不同的尺度
python detect.py --scales 1 --images imgs/img3.jpg

在尺度为1的检测中,我们看到有些大的物体被挑选,但漏检测了几辆车。

python detect.py --scales 2 --images imgs/img3.jpg

在尺度2上,我们没有检测到任何目标对象

python detect.py --scales 3 --images imgs/img3.jpg

在最大尺度3上,可以看到只检测到了小目标对象,这些未在尺度为1时检测到。

不同的输入分辨率
python detect.py --reso 320 --images imgs/imgs4.jpg

输入图像分辨率:320 x 320

python detect.py --reso 416 --images imgs/imgs4.jpg

输入图像分辨率:416 x 416

python detect.py --reso 608 --images imgs/imgs4.jpg

这里,我们检测到的椅子比以前少了一把

python detect.py --reso 960 --images imgs/imgs4.jpg 

这里,检测器做了一个错误的检测:右边的“人物”

从上面可以看到,较大的输入分辨率没有多大帮助,但它们可能有助于检测小物体的图像。另一方面,较大的输入分辨率会增加推断时间。这是一个超参数,需要根据应用进行调整。

您还可以试验其他指标,例如批量大小、对象置信度和NMS阈值。ReadMe文件中有详细的说明。

进一步阅读

image