30

[译] YOLO v3 有哪些新特点?

 5 years ago
source link: https://mp.weixin.qq.com/s/cmVGnQT98CWKsrL-hlvhHw?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文编译自medium上的文章:What’s new in YOLO v3? 略有删减。

点击阅读原文,可以直达原文,需要翻墙哦!

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

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

  • YOLO v1

  • YOLO v2

  • 一篇不错的关于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架构现在的样子:

bU3IJbN.jpg!web

三种尺度的检测

新架构值得夸耀的有残差跳连接(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。由该核生成的特征映射具有与先前特征映射相同的高度和宽度,并且具有沿着如上所述的深度的检测属性。

2y2QBrY.jpg!web

图片源自: https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/

在进一步讨论之前,我要指出 网络的步幅,即一个层被定义为它对输入进行下采样的比率 。在以下示例中,我假设我们有一个大小为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的损失功能看起来像这样。

ui26zir.png!web

图片来自: https://pjreddie.com/media/files/papers/yolo_1.pdf

我知道这个公式很可难,但请注意最后三个式子。其中,第一个惩罚负责预测对象的边界框的对象分数预测(理想情况下这些分数应为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及其的变体更好。以下是论文中给出的性能对比。

YVfIJbN.jpg!web

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

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

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

ENF7Vba.jpg!web

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

体验一下

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

不同的尺度

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

UVniEfr.jpg!web

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

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

yimYnir.jpg!web

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

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

YFjEVbn.jpg!web

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

不同的输入分辨率

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

aaInEzB.jpg!web

输入图像分辨率:320 x 320

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

vyeimaQ.jpg!web

输入图像分辨率:416 x 416

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

Vray6f3.jpg!web

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

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

IbU7bqv.jpg!web

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

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

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

进一步阅读

  • YOLO v3:渐进式改进

  • 如何计算mAP?

VBreEnM.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK