??其实在写这篇博客的时候yolov1~yolov8的所有网络结构以及算法思想和源码都已经研究很久了,回过头继续读v1会发现有很多细节是自己没有留意的,也算是对自己的学习进行总结了。
??yolo最开始是在2015年提出的,该论文发表在cvpr2016上,至今为止已经更新迭代到了v8版本,如果想要真正理解yolo算法思想,还是需要仔细阅读yolov1论文。论文链接:yolov1
yolo主页:
有兴趣的朋友可以直接到yolo官网参观一下yolo的主页:https://pjreddie.com/
??yolo的作者是Joseph Redmon,可以通过谷歌学术了解该作者的相关信息,虽然目前yolo系列已经更新到了v8,但是只有前三个版本是该作者提出的,从谷歌学术上面可以看的,目前yolov1、yolov3和yolo9000的引用率达到了上万条,因为担心人工智能会更多的用于军事方面,从而导致人类的毁灭,所以在v3版本提出之后,该作者就宣布推出yolo系列的更新,所以之后的所有系列都是其他科学研究人员进行更新迭代。
作者简历:
??其实最有意思的是Joseph Redmon的简历,从简历可以看出作者是一个非常有个性的人,他介绍了他在计算机科学系当了两年的助教。他喜欢把自己的知识传授给每一匹对计算机科学感到兴奋的小马!在右边紫色栏中介绍了他的主修课程已经成绩分数等信息。
??yolov1的检测网络有24个卷积层和2个全连接层。交替使用1x1个卷积层减少了前一层的特征空间。我们在ImageNet分类任务上以一半的分辨率(224x224输入图像)对卷积层进行预处理,然后将分辨率提高一倍进行检测,也就是将图片尺寸提高448x448。输入图片shape为448x448x3,在经过卷积层以及4096和1470两个全连接层之后,输出7x7x30的特征图。
??为什么会输出7x7x30的特征图? 因为我们的图片被划分为SxS的个网格(grid cell),每个网格又生成两个预测框(bounding box),这两个预测框的中心点都落在网格里面,每个预测框是由预测框中心点坐标、宽、高、物体置信度(x,y,w,h,c),组成,下图中黑色框线的粗细代表置信度confidence大小;假设在有物体置信度的情况下,每一个网格生成某一个物体类别的概率,也就是下图中彩色格子图片,把每一个bounding box的置信度与类别的条件概率相乘,就能得到每一个bounding box的类别概率,也就是下图中的最后一个带预测框的图片。
??grid cell的条件概率指的是在当前置信度存在的情况下,预测的20个类别概率最高的类别,所以每个grid cell只能预测出一个物体,7x7=49个grid cell最多只能预测49个类别,下面浅蓝色区域表示是狗的类别,这也是yolov1无法精准预测密集目标和小目标的原因
?? 每一个bounding box的置信度与类别的条件概率结合得到如下预测框,一共是49x2=98个框,每个预测框都有置信度与类别,这98个框再经过一系列后处理,比如说过滤掉低置信度的候选框,再进行nms非极大值抑制处理过滤掉重复的候选框,最后每个物体只保留一个检测框,得到了我们最终的目标检测图像。
后处理—置信度过滤和NMS
1、置信度过滤
首先需要了解一下什么事条件概率;条件概率是指在已知一些相关信息或事件发生的条件下,另一个事件发生的概率。简而言之,条件概率是指在给定某个条件下,另一个事件发生的可能性。
条件概率可以用P(A|B)表示,其中A和B是两个事件。P(A|B)代表在事件B已经发生的情况下,事件A发生的概率。
计算条件概率时,可以使用以下公式:
P(A|B) = P(A∩B) / P(B)
其中,P(A∩B)表示事件A和事件B同时发生的概率,P(B)表示事件B发生的概率。
下图中每一个黄色的束状条表示该bounding box的置信度与该grid cell 20个类别条件概率的乘积的到的全概率,每个bounding box会得到两个竖条,一共是98个。
设置阈值,进行概率筛选,每个竖条同维度概率值与阈值进行比较,假设第一个维度都是狗的概率,阈值设置为0.5,如果概率低于0.5的都设置为0,并且放到靠后的位置,这样我们过滤掉概率较低的值,经过置信度过滤之后就需要进行NMS非极大值抑制处理。
2、NMS非极大值抑制
经过置信度过滤之后得到如下概率图,按照类别概率高低进行排序,将每一个概率值都与最大概率值进行对比,我们设置IOU交并比阈值,如果两个概率的IOU交并比大于这个阈值,就可以看做两个bounding box重叠,舍弃掉概率值低的bounding box;
目标检测任务是一个典型的监督学习问题;
在监督学习中,我们使用已有的带有标签(或者称为标记)的数据集,通过训练模型来学习输入与输出之间的映射关系,通过梯度下降等方法对神经元的权重进行微调,使得损失函数最小化的过程,从而能够对新的未标记数据进行预测或分类。
监督学习的基本概念可以通过以下几个要素来描述:
在训练过程中我们希望bounding box尽量逼近我们真实框(ground truth),每个grid cell会生成两个预测框(黄色),我们比较两个预测框与真实框(红色) 的IOU值,保留IOU值最大的框,也就是下图中较大的黄色框,剩下的小的黄色框会在损失函数计算过程中给它一个非常小的权值进行忽略。我们训练过程中需要较大的黄色框尽量逼近我们已经打好标签的红色框。
注意!如果我们的预测框和真实框的中心点不落在同一个grid cell里面,会将这两个预测框都进行忽略,因为每个grid cell会预测一个类别。
损失函数
在yolov1目标检测过程中一共需要计算5个误差:
1、负责检测物体bbox中心点定位误差
2、负责检测物体bbox宽高定位误差
这里求根号的原因是使小框对误差更敏感。
3、confidence回归误差
注意:绿色框中不负责检测物体的boxx有两类,一类是中心点落在grid cell中但是与真实框IOU值太小而被淘汰的框,另外一类是中心点没和真实框落在同一个grid cell中两个框全被淘汰。
4、负责检测物体的grid cell分类误差
损失函数细节