YOLO2,是比较快的物体检测算法之一。虽然它不再是最精确的物体检测算法,但是当你需要实时检测时,它是一个非常好的选择,而不会损失太多精度。
本文重点解释YOLO v3中引入的变化。而不是一个讲解YOLO3是什么。我假设你知道YOLO v2是如何工作的。如果你不了解YOLO,那么请看文章深入理解deep learning目标检测方法之YOLO,了解YOLO如何运作。
YOLO V3:更好的,不是更快,更强
YOLO v2纸的官方标题似乎是YOLO是一种基于牛奶的儿童健康饮料,而不是物体检测算法。它被命名为“YOLO9000:更好,更快,更强”。
因为时间YOLO 9000是最快的,也是最准确的算法之一。然而,几年之后,它已不再是像RetinaNet这样的算法最准确的,而且SSD在准确性方面表现优于它。然而,它仍然是最快的之一。
但是,为了提高YOLO v3的准确性,这种速度已被取消。虽然早期版本在Titan X上以45 FPS运行,但当前版本的时钟约为30 FPS。这与称为Darknet的底层架构的复杂性增加有关。
暗网- 53
YOLO v2采用了自定义深度架构darknet-19,最初是19层网络,另外还有11层用于对象检测。YOLO v2采用30层架构,经常遇到小对象检测。这归因于细粒度特征的丢失,因为层对输入进行了下采样。为了解决这个问题,YOLO v2使用了身份映射,连接了前一层的特征映射以捕获低级特征。
然而,YOLO v2的架构仍然缺少一些最重要的元素,这些元素现在是大多数最先进算法的主要元素。没有剩余块,没有跳过连接,也没有上采样。YOLO v3包含所有这些。
首先,YOLO v3使用Darknet的变体,最初在Imagenet上训练了53层网络。对于检测任务,在其上堆叠了53层,为YOLO v3提供了106层完全卷积的底层架构。这就是YOLO v3与YOLO v2相比速度缓慢的原因。以下是YOLO的架构现在的样子。
三个尺度的检测
较新的架构拥有剩余跳过连接和上采样。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。此内核生成的特征映射具有与前一个特征映射相同的高度和宽度,并具有沿着该特征映射的检测属性。如上所述的深度。
在我们进一步讨论之前,我想指出网络的步幅,或者一个层被定义为它对输入进行下采样的比率。在以下示例中,我假设我们有一个大小为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的特征映射经历几个卷积层,然后被2x上升到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的相同图像,预测框的数量是10,647。这意味着YOLO v3预测YOLO v2预测的盒子数量的10倍。可以很容易地想象为什么它比YOLO v2慢。在每个尺度上,每个网格可以使用3个锚来预测3个框。由于有三个刻度,所以总共使用的锚箱数量为9个,每个刻度3个。
损失函数的变化
YOLO v2的损失函数如何。
我知道这是令人生畏的,但请注意最后三个条款。其中:
- 第一个惩罚负责预测对象的边界框的对象分数预测(理想情况下这些分数应为1)
- 第二个对于没有对象的边界框(理想分数应该为零)
- 最后一个惩罚预测对象的边界框的类预测。
YOLO v2中的最后三个项是平方误差,而在YOLO v3中,它们已经被交叉熵误差项取代。换句话说,现在通过逻辑回归预测YOLO v3中的对象置信度和类别预测。
当我们训练探测器时,对于每个地面实况框,我们分配一个边界框,其锚点与地面实况框最大重叠。
没有更多的softmaxing类
YOLO v3现在对图像中检测到的对象执行多标记分类。
在早期的YOLO中,作者习惯于将类得分最大化,并将具有最高得分的类作为包含在边界框中的对象的类。这已在YOLO v3中进行了修改。
Softmaxing类依赖于类是互斥的假设,或者简单地说,如果一个对象属于一个类,那么它就不属于另一个类。这在COCO数据集中工作正常。
- 但是,当我们在数据集中有Person和Women等类时,上述假设就失败了。这就是为什么YOLO的作者没有采用softmaxing类的原因。相反,使用逻辑回归预测每个类别分数,并且使用阈值来预测对象的多个标签。分数高于此阈值的类将分配给该框。
标杆
YOLO v3与其他先进的探测器(如RetinaNet)相当,同时在COCO mAP 50基准测试中速度更快。它也比SSD和它的变体更好。以下是对论文表现的比较。
但是,但是,但是,YOLO在COCO基准测试中失去了较高的IoU值,用于拒绝检测。我不打算解释COCO基准是如何工作的,因为它是超出了工作范围,但50中50 COCO是基准的预测边框如何做对齐对象的地面真值块的措施。这里50对应于0.5 IoU。如果预测和地面实况框之间的IoU小于0.5,则预测被分类为误定位并标记为假阳性。
在基准测试中,此数字较高(例如,COCO 75),框需要更完美地对齐,以免被评估指标拒绝。这里是YOLO被RetinaNet超越的地方,因为它的边框不像RetinaNet那样对齐。这是一个详细的表格,可用于更广泛的基准测试。
RetinaNet在COCO 75基准测试中的表现优于YOLO。请注意,RetinaNet如何在小型对象(AP)的AP基准测试中表现更好。
做一些实验
你可以使用本文提供的Github存储库中提供的代码在图像或视频上运行检测器。该代码需要PyTorch 0.3 +,OpenCV 3和Python 3.5。
不同的尺度
以下是不同检测层的内容。
python detect.py --scales 1 --images imgs / img3.jpg
python detect.py --scales 2 --images imgs / img3.jpg
python detect.py --scales 3 --images imgs / img3.jpg
分辨率输入不同
python detect.py --reso 320 --images imgs / imgs4.jpg
python detect.py --reso 416 --images imgs / imgs4.jpg
python detect.py --reso 608 --images imgs / imgs4.jpg
python detect.py --reso 960 --images imgs / imgs4.jpg
在我们的情况下,较大的输入分辨率没有多大帮助,但它们可能有助于检测小物体的图像。另一方面,较大的输入分辨率会增加推理时间。这是一个超参数,需要根据应用进行调整。你可以通过转到repo来试验其他指标,例如批量大小,对象置信度和NMS阈值。
本文暂时没有评论,来添加一个吧(●'◡'●)