欢迎关注下方公众号阿宝1990,本公众号专注于自动驾驶和智能座舱,每天给你一篇汽车干货,我们始于车,但不止于车。
背 景
YOLO,you only look once,是著名的图像目标识别模型系列。YOLO(You only Look Once)以其快速而著称,最初由Joseph Redmon等人在2015年提出。与传统的二阶段目标检测方法不同,YOLO将整个检测过程简化为一个单一的回归问题,通过一次遍历即可同时预测图像中物体的位置和类别。
YOLO的主要优势在于其速度和准确性之间的良好平衡。相比其他目标检测方法(如DPM和R-CNN系列),YOLO不仅检测速度快,而且整体检测精度并不差。此外,据说YOLO还具有较低的误检率,因为它在整个图像上进行全局推理,减少了背景错误的可能性。
但笔者极为有限的工作经验中,几乎不记得任何一款主流自动驾驶系统的图像识别模型,是采用YOLO的。
这是非常奇怪的,因为自动驾驶系统中目标识别的速度就是生命线,目标识别速度越快,留给后面(路径)规划和控制(执行)的时间就越宽裕。而且快速识别对于规避突然出现的目标有明显的行车安全意义。
以快速而著称的YOLO,为什么没有一统江山,成为车辆自动驾驶的绝对主流图像识别方案呢?本文将带着这个问题,梳理整个YOLO模型的技术脉络,阐明原理,从原理出发回答这个问题。
一般的图像识别思路,是先定位再分类,也就是对一种图片中存在的多个目标,每一个用一个最小框框出来,然后把这个最小框喂给分类器,判断里面的东西应该分类到哪一类目标,是车是马,是人是动物,等等。先定位再分类就是two stage两阶段法。
这个最小框的学名叫做bounding box(bbox,有的翻译成边界框),它十分重要。最小是指,如果更小就必然要丢失目标的某一部分,就像截图再小就有一部分截不进来。如果更大,就会把无关背景带进框内,对分类算法造成额外的困难。
这个bounding box除了刚刚好精确地把目标框出来,以帮助对它进行分类外。另外一个重要作用是对目标的精确定位,这对自动驾驶判定和预测障碍物位置,然后精确规划避障路线,十分紧要。
图1 two-stage图像识别,图片来自CSDN
两阶段图像识别是如此的自然,以至于one-stage一阶段目标识别反而让人理解起来比较困难,因为让人觉得不那么直观。
在这里,克服这个不直观”的学习心理学要点是:放弃对目标定位的精确性要求,这里只需要识别目标,但不保证定位目标。
打一个更加直观的比方:识别一只猫,我们只需要框住这只猫足够大的面积,足以判定是只猫就行,至于锚的别的没有框进来的部位在哪里,我们只给一个概率性的猜测就行了。所以走路时要注意,虽然识别出了猫,但走路时还是可能踩到猫的尾巴,如果猫尾巴刚好没被框进来的话,因为不知道完整的猫的精确位置。
具体说来,YOLO(You only Look Once)的作者们认为,目标检测中的两个核心任务——提取候选区域(定位)和逐一识别(分类),完全可以由一个单独的网络来同时完成,而无需分成两个阶段。颠覆了传统的目标检测方法,如R-CNN系列,它们通常分为两个阶段:首先生成候选区域(Region Proposal),然后对这些区域进行分类。YOLO通过一种统一的框架实现了定位和分类的同时处理,以下是具体实现方式:
1.图像划分:YOLO将输入图像划分为一个SxS的网格结构,S是很小的整数,比如7或者13。所以划分出的网格单元是大单元,不是小单元。每个网格单元负责预测位于该网格内的目标的位置和类别。如果一个目标的中心落在某个网格单元内,那么这个网格单元就负责预测该目标。
2.边界框bounding box预测:对于每个网格单元,YOLO预测B(B一般是3-5,不会太大)个边界框以及每个边界框的置信度分数。置信度分数反映了模型对该边界框内存在目标的信心程度,以及边界框与实际目标的吻合程度。置信度分数计算公式为:Pr(Object) * IOU(pred, truth),其中Pr(Object)表示网格单元内存在目标的概率,IOU(pred, truth)表示预测边界框与真实边界框之间的交并比。
3.类别预测:除了预测边界框外,每个网格单元还会预测C个类别概率,即P(c|Object),表示在存在目标的情况下,目标属于某一类别的条件概率。这些类别概率是针对整个网格单元的,而不是针对单个边界框。
4.统一损失函数:YOLO设计了一个统一的损失函数,用于同时优化边界框坐标、置信度分数和类别概率。这种多任务学习的方式使得模型能够在训练过程中平衡定位和分类的任务。损失函数包括定位误差、置信度误差和类别误差三部分。
5.单次前向传播:YOLO通过一次前向传播即可完成目标检测的所有任务。这得益于其独特的网络结构设计,使用卷积层和全连接层相结合的方式来提取特征并进行预测。相比于两阶段的方法,YOLO显著提高了检测速度,能够达到实时检测的效果。
6.回归问题处理:YOLO将目标检测视为一个回归问题,直接从整幅图像中预测出目标的边界框坐标和类别概率。这种方法避免了生成候选区域的过程,简化了检测流程,同时也减少了由于候选区域不准确带来的误差。
总体来说,YOLO是把待处理的图片分为一些面积比较大、数量比较少的网格单元。对每个单元预测单元中存在物体的可能性(用置信度分数表示),以及物体的分类可能性的概率分布。这些网格单元越多,YOLO的计算量就越大。
从上面过程可以看出,YOLO是“看部分推测整体”,从而实现一阶段目标识别的;而两阶段目标识别算法是“看整体推测整体”。“看部分推测整体”,当然也就意味着有一些部分是看不到,既不知道位置,也不知道是什么。除非非常幸运,这个物体恰好完全被包含在某个划分出来的网格单元里面。
YOLO架构和核心技术原理
早期YOLO的架构图最好的体现了YOLO的基本思想,后期添加了太多细节反而模糊了基本原则。所以本文采用早期YOLO的架构图来说明。
图2 YOLO V1的架构图,来自CSDN
图3 典型的卷积神经网络CNN架构图,ALexNet,来自Github
对比YOLO的架构和典型CNN的架构ALexNet,会发现明显的相似性,前面都是从大到小的卷积层(带池化层),用于图像识别;逐步过渡到FC(full connection)的全连接层,也就是典型的前馈神经网络,或者叫多层感知机。
最后输出时略有不同,ALexNet因为只负责分类,也就是通过识别物体属于哪一类来说明物体是是什么东西,所以最后是softmax层输出物体属于某一类物体的概率分布。喂给ALexNet的输入就是框好的物体,定位问题不是主要问题。
图4 仅仅分类而不强调定位的目标识别数据集示例,来自网络
而YOLO的最终输出要丰富得多,不仅是物体的分类信息,也就是属于每一类的可能性,也称为分类置信度ci,还要输出另外一种猜测,对物体的bounding box的猜测,请参见下图:
图5 YOLO对每一块单元格的输出,图片来自网络
YOLO对每一块单元格的输出,具体是:
Pc:这个格子包含物体的概率,比如蓝色格子是背景,没有值得识别的物体,这个概率是0。这里有没有值得识别的物体,是取决于训练数据。训练数据中没有把树叶当作物体,训练出来的模型也就视树叶为无物。
然后b系列是本单元格中预测的物体的bounding box的坐标和长宽。这个boucing box完全可以超出本单元格的范围,与邻近单元格预测的bounding box高度重合。
假设一只猫刚好被划分进左右两个单元格,左边是猫的后半身,右边是猫的前半身。左边的单元格根据后半身,“从局部推测整体”,预测出整只猫的bouncing box,是一个向右延申的大方框;类似的,右边单元格根据前半身,“从局部推测整体”,预测出整只猫的bouncing box,是一个向左延申的大方框。对于良好训练的模型,这两个大方框必然有一定的重合性。
但是敏感的读者会说,猫可是柔韧性很强的动物,猫的后半身在这里,前半身完全可以扭到任意可行方向,反过来也类似。不能从前半身推测猫的后半身位置。
读者的这种担心完全正确,YOLO的核心其实多多少少类似盲人摸象,摸到大象墙壁一样的身体,就宣称识别出了大象,但大象的实际具体位置相比于预测的bounding box,可能偏左一点,偏右一点,偏上偏下一点都有可能。
YOLO这种从局部部分推测整体的能力完全是训练数据集赐给它的礼物,训练数据集就是给它看某个物体的各个不同部分,然后告诉它这个物体的真实位置和分类是什么。YOLO学习的就是这个。
至于输出中的c系列,就是当前单元格如果包含物体的部分,这个物体所属的分类是什么,也就是它属于每一种分类的概率,这些概率加起来是1。比如YOLO2支持9000种分类,那么c系列的长度就是9000,每一种都有一个概率值,概率最大的就是该物体最可能属于的分类。
YOLO编年史
YOLO(You only Look Once)模型代表着计算机视觉领域中目标检测的一个重要里程碑。自2015年首次提出以来,YOLO系列经历了多个版本的迭代和改进,每个版本都在性能、速度和应用场景上有所提升。
图6 YOLO发展史鱼骨图,来自CSDN
发布时间:2015年 。
核心创新:YOLOv1将目标检测问题转化为一个回归问题,直接从整张图像预测边界框和类别概率。这种方法显著提高了检测速度,使其成为首个能够实现实时检测的模型之一。
性能:尽管速度快,但YOLOv1在定位精度上略逊于一些两阶段检测器。
发布时间:2016年 。
改进点:引入了Batch Normalization技术,优化了网络训练过程。
使用更深的Darknet-19网络结构,增强了特征提取能力。
支持更多的类别检测,达到了9000类 。
性能提升:相比YOLOv1,YOLOv2在mAP(mean Average Precision)上有显著提高。
发布时间:2018年。
改进点:使用Darknet-53作为主干网络,进一步提升了特征提取能力。
支持多尺度预测,增强了对小目标的检测能力。
应用场景:YOLOv3在保持实时性的同时,提供了更高的检测精度,适用于复杂的实际场景。
发布时间:2020年。
改进点:引入了CSPDarknet53作为主干网络,减少了计算量并提高了性能。
利用Mish激活函数替代传统的ReLU,提升了网络表现。
采用了多种先进的训练技巧,如CutMix和Mosaic数据增强。
性能:YOLOv4在多个指标上超越了之前的版本,尤其是在资源受限环境下的表现尤为突出。
发布时间:2020年。
开发者:Glenn Jocher。
特点:开源且易于使用,支持PyTorch框架。
提供了多种预训练模型,适应不同的硬件条件。
性能:YOLOv5在速度和精度之间找到了良好的平衡,成为工业应用中的热门选择。
发布时间:2022年。
改进点:优化了模型架构,减少了推理时间。
增强了轻量化设计,更适合边缘设备部署。
应用场景:YOLOv6专注于提高效率和降低功耗,适合移动设备和嵌入式系统。
发布时间:2022年。
特点:在不增加额外计算成本的情况下,显著提升了检测精度。
引入了EfficientRepBackbone等新技术,优化了模型效率。
性能:YOLOv7在多个基准测试中表现出色,特别是在高分辨率图像上的检测能力。
发布时间:2023年。
开发者:Ultralytics LLC。
特点:统一了分类、实例分割和目标检测的任务支持。
作为目前最稳定的版本,提供了更灵活的API和工具链,便于用户定制化开发。
应用场景:YOLOv8扩展了YOLO系列的应用范围,支持更多类型的计算机视觉任务。
YOLOv9 是 YOLO 系列中的一个重要升级版,它引入了多种创新技术来提升模型性能。包括引入了可编程梯度信息 (PGI) 和广义高效层聚合网络 (GELAN) 。
此外,YOLOv9 在架构上支持动态锚点和增强的框抑制技术,这使得模型在处理复杂场景时更加高效 。根据研究团队的说法,YOLOv9 在计算效率和参数减少方面表现出色,适合需要高性能计算的应用场景 。
YOLOv10是YOLOv9 和 YOLOv11 之间的过渡版本。
YOLOv11 是 YOLO 系列的最新版本不仅在精度上高于前辈,还在任务支持的多样性上进行了优化,使其能够适应更广泛的应用场景。YOLOv11 在 Ultralytics 生态系统内进行了优化,以支持高精度和多功能任务。
与 YOLOv9 相比,YOLOv11更注重高精度和任务的灵活性,适用于需要精确检测和多样化任务支持的场合。
YOLO版本
总 结
以快速而著称的YOLO,为什么没有一统江山,成为车辆自动驾驶的绝对主流图像识别方案呢?笔者认为主要还是one-stage带来的目标定位精确性不是特别高。也就是说,YOLO的优势也是它的劣势。
更加具体的,导致YOLO在某些自动驾驶场景中应用受限的因素如下:
定位精度不足:YOLO算法的一个已知问题是其定位精度相对较低,特别是在检测小目标时。这对于自动驾驶来说是一个重要的考量因素,因为需要准确地识别和定位诸如行人、交通标志等较小的目标,可以参考文章《YOLO的局限性和优化方向》
https://wenku.csdn.net/column/4vsyt9pob9
对远距离目标的检测能力有限:有报告指出,YOLO在检测远处的目标(如交通灯)时可能存在困难。这在自动驾驶中是一个关键问题,因为系统需要能够提前识别到远处的交通信号以做出适当的反应。这实际上是小目标识别问题,远处的交通灯在图像上太小了。
多任务需求:自动驾驶不仅需要目标检测,还需要进行路径规划、行为预测等多种任务。虽然YOLO擅长快速目标检测,但可能无法单独满足所有这些需求。因此,在一些复杂的自动驾驶系统中,可能会结合使用多种算法来完成不同的子任务。
计算资源限制:尽管YOLO以其速度和效率著称,但在资源受限的嵌入式平台上运行时,仍需考虑其计算开销。对于高性能计算平台而言,这可能不是问题;但对于计算能力有限的设备,则可能需要选择更轻量级的解决方案。
模型复杂度与训练难度:虽然YOLO系列算法已经发展到了较新的版本(如YOLOv11),但随着模型变得越来越复杂,其训练和调整过程也变得更加具有挑战性。这对开发团队的技术能力和资源投入提出了更高要求。简单说就是YOLO膨胀得太厉害了,不管是规模还是技术复杂度。