2021SC@SDUSC
前言
为了更好地理解yolov5的算法,我会在对代码分析的中间穿插yolo其它系列的算法分析,这篇是对yolov1的介绍。之前的文章提到了滑动窗口来进行目标检测,然而存在着一定的问题:检测效果与时间耗费上的tradeoff。yolo算法,即you only look once,解决了这个问题。yolo算法是一种实时的目标检测算法,一个特点就是实现端到端的检测。相对于其它目标检测与识别方法,yolo将目标区域预测和目标类别预测整合于单个神经网络模型中,更适合应用环境。
实现方法
论文地址:https://arxiv.org/abs/1506.02640https://arxiv.org/abs/1506.02640
yolo首先将一张图片划分成s*s的网格,
每个网格都要预测b个bounding box,当一个目标落在多个网格上时,该目标的中心在哪个网格上哪个网格就负责这个目标的检测。
除了需要预测出b个bounding box的位置,还需要有每个bounding box的置信度p,这个置信度代表了预测出来的bounding box的概率。
还需要有一个类别信息,记为c,这样每一个网格需要输出的就是(5*b+c),5是(p,x,y,w,h),总共的输出就是s*s*(5*b+c),一个bounding box对应了一个置信度,而一个网格对应了一个类别c,这样一个网格就只能预测一个类别,当一个网格内有多个类别时就无法预测了。一个网格需要预测多个类别时可以让一个bounding box预测一个类别的目标,假设现在需要预测5个类别的目标,可以是重复的,那么输出就变成了s*s*5*(5+c)。
如上图所示,这样做会导致一个问题,那就是可能会有多个网格认为目标是自己负责的,于是一个目标可能会有多个预测bounding box,解决方法是非极大值抑制NMS。
NMS
首先需要知道一个概念,IOU,也就是交并比,指的是交集与并集的比值。
设图中1、2、3区域的面积分别为s1,s2,s3,lou=s1/(s1+s2+s3)
lou值越大,说明两个bounding box的重合部分越多,两个bounding box就越接近
NMS算法就是依据IOU的值来执行的。
1.对所有bounding box进行排序,依据与Ground Truth的IOU比进行打分,分数越高的排名越靠前
2.选取分数最高的bounding box,计算剩下元素与该bounding box的IOU,若IOU大于一个阈值t,就说明这两个bounding box足够靠近,很有可能是在预测同一个目标,那我们只需要保留更好的那一个,也就是将剩下的bounding box去除
3.重复步骤2,直至列表为空
对每一个类别重复以上操作就可以将同一目标的多个bounding box去除掉。
一些细节
输入的是448*448大小的图像,取s为7,也就是将图像划分成了64*64个网格,b为2,一共有20个类别,即c=20 ,这样最终的输出就是7*7*(2*5+20)=7*7*30。
在测试的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score,得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
左边等式的每一项分别是每个网格预测的类别信息、每个boundingbox预测的置信度 、与目标框的IOU。
参考:
YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5_AI小白一枚的博客-CSDN博客_yolo