史上最直观最全面的YOLO算法理解
史上最直观最全面的YOLO算法理解
YOLO(You Only Look Once)算法是目前最流行的目标检测算法之一,广泛应用于自动驾驶、安防监控、医学影像分析等领域。本文将通过直观的图示和详细的解释,帮助读者深入理解YOLO算法的核心原理和优化方法。
物体的边缘坐标是否可以被训练?
在VGG模型中,我们可以对不同种类的图片进行标记和训练,从而得到一个图像检测器,能够识别出图片中的物体类别,例如猫、狗等。
如果我们的训练目标不仅限于识别物体的类别,而是进一步加上物体边框的坐标信息,是否可行呢?如图所示:
让物体四个角的坐标逼近真实值进行训练理论上是可行的,但实际操作中会遇到很大的挑战。因为四个点连起来形成的线需要完美地包围住物体,这个训练过程会极其复杂和耗时。此外,四个点也不总是形成矩形,如图所示:
保证边框是矩形的方法
为了解决上述问题,YOLO算法采用了一种更简洁的方法:不直接训练四个角的坐标,而是训练中心点和宽度、高度。这样既能保证边框是一个矩形,又能减少训练参数的数量。从9个参数(8个坐标参数+1个分类)减少到5个参数(中心点x和y坐标+宽高+分类),如图所示:
检测方法
即使使用了矩形坐标,训练逼近的过程仍然可能很慢。因为初始的矩形边框可能会跑到图像的外面,甚至很远的地方,这样逼近到正确的边框需要很长时间。因此,需要将图像边框限定在图像范围内,以加快训练速度。如图所示:
但是,如果目标物体在图像中很小,即便将边框限定在图片中,进行检测也会非常慢,因为逼近这个物体的真实边框需要走很长的路。如图所示:
滑动窗口
为了解决上述问题,YOLO引入了滑动窗口的概念。滑动窗口用于检测目标,如果窗口中有目标则开始回归,没有则不用。这样可以限定边框与检测窗口的位置关系,从而加快训练逼近的过程。例如,左上角的检测滑动窗口如果没有物体,就不必去做回归。如图所示:
然后滑动窗口遍历整个图像,直到所有内容都被检测一遍。这样做需要再训练一个值,即目标的中心点是否在检测窗口中,称为置信度。如图所示:
当检测窗口框到如图所示的位置时,可以发现物体的大部分内容都在检测窗口中,这时候就可以开始进行训练逼近了。并且要限定中心点必须在检测窗口之中,这样有了支点再去逼近物体边框就容易得多,起点就不那么随机,离真相也越来越近。如图所示:
滑动检测窗口的优化
检测窗口不可能总是刚好框住并检测物体的。下两个图中物体的中点都在检测框中,选哪个好呢?通常选择置信度更高的那个。再次强调这里不是给物体打边框,而只是确认使用哪个滑动检测框来进行初始化逼近真实坐标。如图所示:
先验框
下图中先从黑色的滑动检测框找到物体的中心,然后给出蓝色的先验框,然后根据先验框的坐标去逼近真实的边框坐标,这样就比从从黑色的滑动检测框直接逼近真实框要快一些。如图所示:
YOLO的作者利用k均值算法在COCO训练集中发现9个尺寸的先验框更可能符合万物的形状。所以有涉及多个先验框的情况,如左图所示(蓝色是先验框),哪个先验框才是训练需要的呢?可以是使先验框与真实边框的IOU(交并比,用于确认两个框的重叠面积公式为:交集/并集)决定哪个先验框才是最佳的。如图右所示,箭头处的先验框与真实框(红色)的IOU更大,所以该先验框是我们需要使用的先验框。如图所示:
这时候再用该先验框去逼近真是框将极大极大的减少了递归的代数。大幅增加算法的训练的速度。YOLO v2便是这样的思想。
有些人可能会意识到,按照检测窗口去检测目标,难道不是每次都要执行一次CNN吗?速度岂不是更慢?但是研究发现,CNN中滑动过滤器的过程刚好和我们检测图片滑动窗口的过程一致了,所以大部分计算共享!如图所示:
YOLOv3思想
假设物体很大,滑动检测窗口很小。那么要检测的内容那个太多,猫咪落在大部分网格上,这样就需要很多检测去识别。所以设计不同的网格大小跟适合检测大小不同的物体,可以更快更准确的检测到猫咪的中点。如图所示:
检测更小的物体时则可以设计更密集的边框。如图所示:
所以YOLOv3采用三个检测窗口的尺寸分别是1313,2626,52*52。至此呢训练阶段就完成了。需要注意的进行缩放后的图片打框需要偏移量进行还原。
预测阶段优化
预测阶段不外乎去掉标签,走一遍模型即可。如图所示:
但会遇到如下问题,如果要检测图像中的人体,检测的结果可能是这样的。因为预测过程中每个检测框的置信度不可能总是0,只要有概率就会打出边框,所以就造成这样很多边框的结果。如图所示:
为了解决这个问题应该设一个置信度的阈值例如0.5。这样就会去掉置信度较低的边框如图所示:
有人可能会问为什么不直接保留置信度最高的边框呢?如果只保留置信度最高的边框,左边人物的两个边框就会被去掉,因为他们都小于0.9,所以该办法不能对多目标打边框。
还有的人会说直接对照标签不就行了,但注意这里是预测阶段,没有任何标签。不然训练就无意义了。
正确的做法是。首先找出最高置信度的边框,例如0.9的边框命名为A边框,然后查找A边框与他重合边框有哪些,这个过程直接计算IOU即可,凡是IOU大于某个阈值时,则说明该边框与A边框重叠过多,他们多半是同一个物体上的不同预测结果,则可以删除,例如图中设置IOU为0.5,那么右边人体的边框把0.8与0.7置信度的边框就会去掉。而左侧任务的边框则不会被影响。后接着在寻找剩下的边框重复以上过程。最终找到最符合图像的边框。需要强调的是,此时的IOU和训练的提到的IOU完全不是一回事。另外该IOU阈值不能太低,因为现实中确实存在着重叠的物体。如图所示:
至此直观理解到此结束。下一篇会会讲解算法模型。