YOLOv3深度理解

YOLO系列算法,是目前目标检测算法中速度最快的一种方法。尽管在目标检测的准确率上不是最为准确的检测算法,但是考虑到工业上的实时目标检测应用,YOLO目前仍具有不可替代的优势。换句话说,YOLO将其牺牲的一点准确度极大的弥补在实时性上,在工业目标检测领域,可以完成项目实际的商业落地。

YOLO系列算法的论文:

yolov1

yolov2(yolo9000)

yolov3

这里仅深度理解yolov3,对于之前的系列不做过多的分析。


YOLO v3: Better, not Faster, Stronger


YOLO v2纸的官方标题似乎是YOLO是一种基于牛奶的儿童健康饮料,而不是物体检测算法。 它被命名为“YOLO9000:更好,更快,更强”。

因为时间YOLO 9000是最快的,也是最准确的算法之一。 然而,几年之后,它已不再是像RetinaNet这样的算法最准确的,而且SSD在准确性方面表现优于它。 然而,它仍然是最快的之一。

但是,为了提高YOLO v3的准确性,这种速度已被取消。 虽然早期版本在Titan X上以45 FPS运行,但当前版本的时钟约为30 FPS。 这与称为Darknet的底层架构的复杂性增加有关。


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的架构现在的样子。

YOLOv3深度理解_第1张图片


多尺度检测


 

较新的架构拥有剩余跳过连接和上采样。 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.此内核生成的特征映射具有与前一个特征映射相同的高度和宽度,并具有沿着该特征映射的检测属性。 如上所述的深度。

YOLOv3深度理解_第2张图片

在我们进一步讨论之前,我想指出网络的步幅,或者一个层被定义为它对输入进行下采样的比率。在以下示例中,我假设我们有一个大小为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层检测中等物体。 以下是不同层在同一对象中拾取的不同对象的对比分析。


anchor boxes的选择

YOLO v3,总共使用了9个anchor box。 每个规模三个。 如果在自己的数据集上训练YOLO,则应该使用K-Means聚类来生成9个锚点。
然后,按照尺寸的降序排列anchor box。 为第一个scale分配三个最大的anchor,为第二个scale分配三个anchor,为第三个scale分配最后三个anchor。


为每张图片给更多的bounding box

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

另一方面,YOLO v3预测3种不同尺度的box。 对于416 x 416的相同图像,预测框的数量是10,647。 这意味着YOLO v3预测YOLO v2预测的box数量的10倍。 您可以很容易地想象为什么它比YOLO v2慢。 在每个尺度上,每个网格可以使用3个anchor来预测3个框。 由于有三个scale,所以总共使用的anchor box数量为9个,每个scale3个。


损失函数的变化

yolov2 :

YOLOv3深度理解_第3张图片

yolov2损失函数的后三项是惩罚项,分别对于预测目标的bounding box响应的预测得分惩罚、非目标的预测得分惩罚、目标bounding box的预测分类惩罚。

yolov3主要在这三项上的区别,原先采用的是方差损失,现在改用交叉熵损失。v3的目标置信度和类别预测采用的是LR回归。当我们训练检测器时,对于每一个ground truth box, 分配一个bounding box, 使其anchor和ground truth box有最大的重叠。


不再用softmax分类

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

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

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

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

Benchmarking

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

YOLOv3深度理解_第4张图片

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

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


实验

在这里给出的github仓库中,可以进行图片或者视频的检测,使用的环境:PyTorch 0.3+, OpenCV 3 and Python 3.5

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

一些情况下,较大的输入分辨率没有多大帮助,但它们可能有助于检测小物体的图像。 另一方面,较大的输入分辨率会增加推理时间。 这是一个超级参数,需要根据应用进行调整。
可以试验其他指标,例如批量大小,对象置信度和NMS阈值。 ReadMe文件中提到了所有内容。


从头开始训练yolov3

 

你可能感兴趣的:(dl)