目录
- 一、背景介绍
- 1.1 yolo发展历史
- 1.2 作者介绍
- 二、算法精讲
- 2.1 预测阶段
- 2.2 训练阶段
- 三、论文细节
一、背景介绍
其实在写这篇博客的时候yolov1~yolov8的所有网络结构以及算法思想和源码都已经研究很久了,回过头继续读v1会发现有很多细节是自己没有留意的,也算是对自己的学习进行总结了。
1.1 yolo发展历史
yolo最开始是在2015年提出的,该论文发表在cvpr2016上,至今为止已经更新迭代到了v8版本,如果想要真正理解yolo算法思想,还是需要仔细阅读yolov1论文。论文链接:yolov1
yolo主页:
有兴趣的朋友可以直接到yolo官网参观一下yolo的主页:https://pjreddie.com/
1.2 作者介绍
yolo的作者是Joseph Redmon,可以通过谷歌学术了解该作者的相关信息,虽然目前yolo系列已经更新到了v8,但是只有前三个版本是该作者提出的,从谷歌学术上面可以看的,目前yolov1、yolov3和yolo9000的引用率达到了上万条,因为担心人工智能会更多的用于军事方面,从而导致人类的毁灭,所以在v3版本提出之后,该作者就宣布推出yolo系列的更新,所以之后的所有系列都是其他科学研究人员进行更新迭代。
作者简历:
其实最有意思的是Joseph Redmon的简历,从简历可以看出作者是一个非常有个性的人,他介绍了他在计算机科学系当了两年的助教。他喜欢把自己的知识传授给每一匹对计算机科学感到兴奋的小马!在右边紫色栏中介绍了他的主修课程已经成绩分数等信息。
二、算法精讲
2.1 预测阶段
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;
2.2 训练阶段
目标检测任务是一个典型的监督学习问题;
在监督学习中,我们使用已有的带有标签(或者称为标记)的数据集,通过训练模型来学习输入与输出之间的映射关系,通过梯度下降等方法对神经元的权重进行微调,使得损失函数最小化的过程,从而能够对新的未标记数据进行预测或分类。
监督学习的基本概念可以通过以下几个要素来描述:
- 输入数据(特征):监督学习中的输入数据通常被称为特征,表示为X。这可以是一组数值、图像、文本等形式的数据。
- 输出数据(标签):与每个输入数据对应的目标输出,通常被称为标签,表示为Y。标签可以是类别,也可以是数值。
- 训练数据集:由带有标签的输入数据和相应的输出数据组成。这个数据集被用于训练模型,模型通过学习训练数据中的特征与标签之间的关系。
- 模型:监督学习中的模型是一个函数,通过输入数据来预测输出数据。模型的选择可以根据具体的问题来进行,例如线性回归、决策树、支持向量机、神经网络等。
- 损失函数:用来衡量模型预测结果与实际标签之间的差异。监督学习的目标是最小化损失函数,使模型的预测结果尽可能接近真实标签。
- 预测:经过训练后的模型可以用于预测新的未标记数据的输出。通过输入数据,模型可以根据学到的映射关系,得出预测的结果。
在训练过程中我们希望bounding box尽量逼近我们真实框(ground truth),每个grid cell会生成两个预测框(黄色),我们比较两个预测框与真实框(红色) 的IOU值,保留IOU值最大的框,也就是下图中较大的黄色框,剩下的小的黄色框会在损失函数计算过程中给它一个非常小的权值进行忽略。我们训练过程中需要较大的黄色框尽量逼近我们已经打好标签的红色框。
注意!如果我们的预测框和真实框的中心点不落在同一个grid cell里面,会将这两个预测框都进行忽略,因为每个grid cell会预测一个类别。
损失函数
在yolov1目标检测过程中一共需要计算5个误差:
- 负责检测物体bbox中心点定位误差。
- 负责检测物体bbox宽高定位误差。
- 负责检测物体bbox置信度confidence误差
- 不负责检测物体bbox置信度confidence误差
- 负责检测物体的grid cell分类误差
1、负责检测物体bbox中心点定位误差
2、负责检测物体bbox宽高定位误差
这里求根号的原因是使小框对误差更敏感。
3、confidence回归误差
注意:绿色框中不负责检测物体的boxx有两类,一类是中心点落在grid cell中但是与真实框IOU值太小而被淘汰的框,另外一类是中心点没和真实框落在同一个grid cell中两个框全被淘汰。
4、负责检测物体的grid cell分类误差
损失函数细节
三、论文细节
数据集
yolov1使用的数据集是voc2007, PASCAL VOC(Visual Object Classes)数据集是一个用于目标检测和图像分割任务的常用数据集之一。它包含一系列的图像,每个图像都标注了其中物体的位置和类别。以下是关于PASCAL VOC数据集的详细信息:
1、版本:
- PASCAL VOC 数据集有多个版本,例如 VOC2007、VOC2012 等。每个版本都包含了不同数量的图像和标注。
2、任务:
- VOC 数据集通常用于目标检测和图像分割任务。目标检测任务要求模型检测图像中的物体,并给出它们的位置和类别。图像分割任务要求模型对图像中的每个像素进行分类,将图像分割成不同的区域。
3、类别:
- VOC 数据集包含了20个不同的物体类别,如人、车辆、动物、家具等。每个类别都有相应的标签。
4、图像:
- VOC 数据集的图像来自不同的场景,包括室内和室外。图像的分辨率和质量也有所不同。
6、标注:
- 每个图像都有相应的 XML 文件,包含了物体的边界框坐标、类别标签以及其他相关信息。对于图像分割任务,还可能包含每个像素的分割标签。
7、训练集和测试集:
- VOC 数据集通常划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。
8、评估指标:
- 在目标检测任务中,常用的评估指标包括精确度(Precision)、召回率(Recall)和平均精确度(mAP)。mAP 是种综合考虑所有类别的评估指标。
9、使用领域:
- VOC 数据集被广泛用于评估目标检测和图像分割算法的性能。许多研究论文和竞赛采用了这个数据集作为基准。
与其他方法比较
与其他实时算法相比,在实时目标检测算法中yolo是最准的。
与其他非实时目标检测算法相比,yolo的精度居中,但是速度最快,每秒中可以检测45张图片。
yolo与fast r-cnn错误比较
在背景background误差上面我们能看到,fast r-cnn的误差更大,因为fast r-cnn是两阶段模型,它并不能识别全图的信息,只是把候选区域的一小块进行分析,缺乏全局性,所以会将很多背景误判为目标。
yolo是把整个图片放到模型当中,所以区分背景和物体的能力比较强,能够区分背景和前景的关系。
yolo的定位能力比较弱,一方面由于输入的图片像素比较小,其次整个网络把目标检测所有的事情全部都做完了,没法实现高精度定位。
与其它网络融合
这也是我们改网络过程中经常会用到的方法,将两个网络进行融合,弥补互相的缺陷,将fast与其他模型进行融合发现性能提升的比较小,但是与yolo模型进行融合之后,性能提升到了75。
泛化能力强
其实很多模型在实际训练集已经验证集上的测试效果非常好,但是如果应用到一些艺术品上面,检测效果就会下降,在这一方面,yolo的表现非常的好,通过现实数据集训练的模型,即使放在艺术品的检测上已经拥有较好的性能。
左图是在毕加索数据集的召回精度曲线。右图是在VOC 2007, Picasso和People-Art数据集的定量结果。毕加索数据集评估AP和最佳F1得分。