睿智的目标检测yolov4 目标检测算法yolo_数据集


前言

大家好,这是目标检测算法解读系列的第一篇文章,在这个系列中小糖豆会对经典的目标检测算法进行解读,在每个算法原理讲解完后,会有相应的源代码解析。小糖豆认为学习一个算法,既要弄清楚它的原理,又要真正读懂它的源代码,这样才会彻底掌握它。好了,闲话不多说,我们开始吧。

说到目标检测,yolo系列可以说是非常经典的算法,yolov1是第一个端到端的单阶段目标检测模型,也开创了目标检测领域anchor-free的先河。对于一个新的模型算法,小糖豆建议大家重点了解三大模块:模型架构、数据集和损失函数。

yolov1整体架构

yolov1整体架构如下图所示:


睿智的目标检测yolov4 目标检测算法yolo_ide_02


yolov1处理图像的流程是非常简单直观的,首先将输入图像调整到448x448大小,然后将图像送入卷积神经网络,并对预测的结果执行非极大值抑制算法。

那么yolov1中的卷积神经网络长什么样子呢?


睿智的目标检测yolov4 目标检测算法yolo_yolo算法_03


网络的输入是448x448x3的图像,经过了24个卷积层和2个全连接层,得到输出为7x7x30的预测张量。网络的具体结构已经表示的很明确了,就是卷积层和池化层的堆叠。小糖豆认为这里需要重点关注的是最终输出的预测张量。7x7x30按照论文的思想可以拆分成7x7x(2x5+20)。yolov1将输入图像划分为7x7的网格,每个网格负责检测中心落在该网格内的物体,预测其2个bounding box及对应的confidence scores,20对应的是数据集的类别数,原论文是基于Pascal Voc数据集训练的,因此数据集的类别是20。如果说想在其他数据集上训练yolov1模型,只要将20修改为对应数据集的类别即可。

数据集

在理解了模型架构之后,我们就可以进一步弄清楚训练数据集的标签是怎么设置的。下面以一张经典的图像为例进行讲解。


睿智的目标检测yolov4 目标检测算法yolo_数据集_04


上图中有三个需要识别的物体,它们的中心点分别落在了对应的红色网格区域内,而剩余的网格由于没有我们识别的物体,所以对应的真值标签的bounding box的xywh和confidence以及类别数都为0。红色网格分别包含了不同的物体,因此bounding box的confidence为1,xywh为bounding box的中心坐标和宽高,类别数根据对应的物体进行one-hot设置。

总结,上图的标签数为7x7x(2x(x+y+w+h+confidence)+20)。由于大多数的标签均为0,所以在数据集中保存label文件时只保留需要识别物体的信息即可。

损失函数

现在我们来到了最难的部分,面对30维的高维张量,如何设置合理的损失函数是非常关键的。这里给出原论文中的计算公式。


睿智的目标检测yolov4 目标检测算法yolo_睿智的目标检测yolov4_05


现在对公式中的每一部分进行详细介绍。

1、confidence损失(置信度损失)


睿智的目标检测yolov4 目标检测算法yolo_数据集_06


confidence损失是区分正负样本的关键部分:

(1)对于包含物体中心点的网格来说,confidence包含了两层信息:所预测的bounding box中含有物体的confidence和这个bounding box预测的有多准。


睿智的目标检测yolov4 目标检测算法yolo_数据集_07


(2)对于没有包含物体中心点的网格来说,只需要预测confidence,而不必关心其他信息。对于一张图像,大多数的网格都不会包含物体,使得这些网格中confidence的损失趋向于0,这将极大的削弱真正包含物体中心点的网格预测的confidence的影响力,因此加入了λnoobj=0.5进行弱化。

2、coordinate损失(坐标损失)


睿智的目标检测yolov4 目标检测算法yolo_数据集_08


对于包含了物体中心点的网格,需要计算coordinate损失。xy坐标通过对应的网格左上角的坐标可以归一化到0-1之间,wh通过图像的宽和高也归一化到0-1之间。前面说到,每个网格会预测两个bounding box,训练的时候,会选择与ground truth box的IOU最大的那个bounding box进行训练,这样做的好处是随着训练的逐步深入,不同的bounding box会逐渐适应特定尺寸的物体(也有其他说法认为好处是可以从两个bounding box的预测中择优,小糖豆认为都能解释得通)。

细心的读者可能会发现wh的计算进行开根号,这是作者人为添加的一个小技巧,大的bounding box的损失会超过小的bounding box的损失,平方根有助于减少二者之间的差距。同样的,为了抵制过多的不含物体的网格confidence损失的影响力,避免真正有意义的、包含物体的bounding box信息被湮没,加入了λcoord=5进行加强。

3、类别损失


睿智的目标检测yolov4 目标检测算法yolo_ide_09


类别损失没有什么特别之处,对于包含有物体的网格预测物体的类别信息,这里作者只是简单用了下平方损失函数。

预测

预测的时候,由于有全连接层的存在,输入的图像必须调整到448x448大小,在获得7x7x30的预测张量后执行非极大值预测即可得到最终的结果。关于非极大值预测小糖豆会在后续对源代码解析时单独进行详细的介绍,这里不再赘述。

与其他模型的比较


睿智的目标检测yolov4 目标检测算法yolo_yolo算法_10


总结

1、优势

(1)yolov1采取了端到端的网络架构,非常易于模型构建和训练;

(2)网络推理速度很快,在Titan X GPU上运行时可以在实现63.4%mAP的基础上达到45FPS,精度是当时实时目标检测算法最高精度的两倍;

(3)由于网络直接关注整张图像,因此背景误检率较低,实验数据表明,yolov1背景误检率低于fast RCNN的一半;

(4)通用性强,yolov1能够学到更通用的特征表征,在迁移到其他领域如艺术领域时有着更好的表现;

2、不足之处

(1)yolov1对bounding box预测施加了很强的空间约束,因为每个网格单元只能预测两个bounding box,并且必须属于同一个类。这个空间约束限制了yolov1可以预测的邻近物体的数量,同时yolov1在针对成群出现的小物体的情况进行预测时会有困难,如成群的鸟;

(2)yolov1直接从数据中学习预测bounding box,所以它很难推广到具有新的或不常出现的宽高比的物体;

(3)yolov1的损失函数没有处理好小的bounding box和大的bounding box之间的区别。因为大的bounding box的低误差通常是良性的,但小的bounding box的低误差对IOU的影响要大得多。yolov1的主要误差来源是定位误差。

yolov1虽然摘得了实时目标检测的桂冠,但是带有诸多不足的它很快就被后来居上的SSD模型所取代。然而yolo作者并没有就此停止探索的脚步,相继推出yolov2和yolov3,尤其是yolov3更是在推出之时横扫目标检测界,称霸武林。具体的原理小糖豆下期再给大家介绍。

最后,放几张yolov1的预测图,供大家欣赏。


睿智的目标检测yolov4 目标检测算法yolo_ide_11