YOLO精讲------YOLOV1
阅读原文时间:2023年08月11日阅读:2

CV小白说YOLOV1

目标检测是什么?

它是在图像中对一类或多类感兴趣的目标进行查找和分类,确定它们的类别和位置。由于各类物体有不同的外观、形状和姿态,加上成像时各种因素的干扰,目标检测一直是计算机视觉领域具有挑战性的问题。

我在CSDN上看到的一篇文章,用通俗的话语讲述了在计算机视觉中的四大类常见任务:

(1)分类:解决“是什么”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。

(2)定位:解决“在哪里”的问题,即定位出这个目标的的位置。

(3)检测:解决“在哪里,是什么”的问题,即定位出这个目标的位置并且知道目标物是什么。

(4)分割:分为实例的分割和场景分割以及语义分割,解决“每一个像素属于哪个目标物或场景”的问题(个人目前接触较少)。

​ 其实还存在一些其他的任务:关键点检测等等

​ 因此,我们可以发现目标检测网络是一个多任务的网络,因为图像中有多个类别的多个物体,所以它不仅要进行一个分类还要进行定位回归。

目标检测中需解决的问题:

(1)分类问题:即图片或某个区域中的图像属于哪个类别。

(2)定位问题:目标可能出现在图像的任何位置。

(3)大小问题:目标有各种不同的大小。

(4)形状问题:目标可能有各种不同的形状。

对于目标检测问题的解决模型一般分为两种,一种是单阶段的one-stage,另一种是两阶段的two-stage:

​ (1) one-stage: 不提取预测框,直接把全图喂到模型里面,算法能够直接输出目标检测的结果,输入端到输出端,一步到位。(Yolo系列属于此)

​ (2) two-stage: 先从图像中提取若干的预测框,再逐一的对预测框进行分类和甄别,以及调整他们的坐标最后得出结果。

两种模式各有特长,one-stage速度比two-stage快,但是精度上没有two-satge高。

1.预测阶段

预测是:假设我们已经训练好一个YOLOV1的模型,输入待测图像,进行前向推断,获得目标检测结果的过程。

​ (1) 输入数据(现在的Yolo不局限于图像数据),把数据分成很多的小格子(相当于s * s个格子),每个格子作为中心要产生B种(YOLOV1指定为2,一个长方形,一个正方形)不同大小的预测框,最终会产生s * s * 2个预测框。

​ (2) 每个预测框看和实际的物体的匹配情况即为置信度(它的可视化视觉为框线的粗细,线越粗置信度越高,表示框住的是一个完整物体的概率越大),置信度的分数反映了预测框的准确程度,置信度的值理解为:如果产生该预测框的单元格中不存在物体,则置信度分数应为零。否则,我们希望置信度分数等于IOU,置信度的计算如下所示:

​ 其中,第二项IOU的计算是真实的物体框值与预测的框值的交集/真实的物体框值与预测的框值的并集,效果如下:

​ (3)如下图被划分为了7 * 7个格子的图片,则会产生了7 * 7 * 2=98个预测框,且现知道预测框预测出来的不仅仅有x,y,w,h,还有预测框对应的置信度。以预测的角度来看,在下图中我们只有三个物品,对应我们最多只可能输出三个框,YOLOV1通过使用NMS非极大值抑制就可以达到这个效果。

什么是NMS非极大值抑制以及如何通过其进行效果预测?

​ 在生成上述的信息时,每个小格子还会生成对应数据集的所有分类的条件概率预测值,例如:YOLOV1产生时是对PASVOC进行目标检测,该数据集有20个类,每个小格子还会预测对于这20类的条件概率Pr(Class(i)∣Objiect):(具体在上面彩色图有体现用颜色来代表类别,紫色区域的小格子对Car的预测概率较高,蓝色区域的小格子对Dog的预测概率较高等等)。将格子预测出来的对应每个类别的条件概率与格子的俩个预测框的置信度相乘据,效果如下所示(下面 出现了7 * 7 * 30的张量,在网络部分有详细解读):

​ 每个预测框都能乘出来1 * 20维的全概率值向量(如下所示),两个预测框就是2个1 * 20维的全概率值向量 ,即98个预测框就是98个1 * 20维的全概率值向量,其可视化就是98个带颜色的框(上面黑色框,彩色化了)。

​ 现在获得了98个概率向量,以狗这个类别为例,某些预测框计算出的狗这个类别的概率很小,现在设置一个阈值如0.2,将所有检测框预测狗的概率小于0.2的概率值全部变成0,然后按照狗类别的概率值高低排序所有的预测框。

​ 对排好顺序的概率值进行NMS非极大值抑制,先把概率值最大的预测框拿出来,然后把剩下的预测框逐一和概率最大的预测框比较,如果两个框的IOU大于某个阈值(阈值设置的很低时,稍微有一点的交,就会触发NMS),就认为这两个检测框重复识别了同一个目标物体,把低概率的预测框过滤掉,把IOU满足要求的预测框保留下来。如下图,假设bb47橘色预测框和bb15绿色预测框的IOU大于0.5,表明两个框预测了同一个目标物体,将概率小的绿框的概率值变成0。bb15与bb47的IOU值比0.5小,故bb15保留了下来,同里bb47也保留了下来,一直比对到bb98与bb47比完。

​ 概率值最高的与其余概率比完后,接下来再把概率值第二高bb15(bb20被赋值为0了)的预测框拿出来,和剩下的预测框逐一计算交并比。bb15蓝框和bb7紫框的交并比超过阈值,表示重合,概率值小的紫框的概率值置为0。同理依次对所有预测框比较。

​ 最终比较完剩下橘框和蓝框预测结果是狗被保留下来,分别对这20个类别使用NMS,最终的计算结果一个稀疏矩阵,有很多元素被置为0。将98个预测框中概率值不为0的框找出来,找到类别索引和概率值,就能获得最终的目标检测结果。

2.训练阶段

前面预测阶段是模型已经训练好,那么模型是如何训练出来的?

​ 首先我们要明确YOLOV1是一个监督学习模型(监督学习模型在训练集上已经人工标注了真实目标的检测框(lableme/labelImg(推荐)),而算法要使得预测框尽量去拟合真实检测框,监督学习的模型是通过梯度下降和反向传播方法,通过迭代微调神经元的权重,使得损失函数最小化的过程。

​ 以labelImg进行数据标注的界面解读如下所示:

​ 接下来我们来了解一下YOLOV1是如何操作。在训练时,我们传入标注好真实检测框的数据,真实检测框的中心点落在哪个网格中,就需要哪个网格生成的预测框去拟合真实的检测框。由于每个网格生成两个预测框,那么就需要通过比较两个这两个预测框与我们标注的真实预测框求IOU值大的一个框去拟合真实检测框,并且这个网格输出的类别也必须是我们标注好的真实检测框的类别。对于没有我们标注框中心点落在的小格子,它预测出来的俩个框都会被舍弃,它们是有置信度的,但是会让他们的置信度接近于0。

​ 举个例子如下图所示,蓝色实线框是我们标注好的真实检测框,假设这个真实检验框的中心点落在红色格子中,这个格子会生成了两个预测框,黄色和橘色虚线框。基于预测框和真实框的IOU值大的预测框负责拟合真实框的原则,所以下图就是黄色虚线框来拟合真实框。调整预测框尽量逼近真实框的样子。让IOU值小的预测框的置信度越小越好。

如何调整IOU值较大的预测框尽量逼近真实的框呢?

​ 要想结果尽可能准去,这里就要用到损失函数进行拟合,损失函数(同济子豪兄批注)如下所示:

​ YOLOV1的损失函数包含五项,都是回归问题的损失函数,预测出一个连续的值,将该值和标注值比较,越接近越好。

(1)第一个是预测框的中心点与标注的真实框的中心点误差,目的是让预测框和真实框的中心点在横,纵坐标上尽可能的一致,且我们将其误差通过λcoord给予更多的权重,这里设置为5。

(2)第二项是预测框与真实框的宽和高误差,目的是预测框的宽高要和真实框的宽高尽可能一致,式子中求根号能使小框对误差更敏感(思想:大物体移动一点的时候不敏感,而小物体移动一点都会很敏感,加强了对尺寸的关注),且我们将其误差通过λcoord给予更多的权重,这里设置为5。

​ (这里解释为什么λcoord设为5:定位误差比分类误差更大,所以增加对定位误差的惩罚。对这个的理解就是,我们在利用yolo检测时,经常会发现,他定位的很准,但是识别错了。)

(3)第三项是含有物体的预测框的置信度误差,标签值是预测框和真实框的IOU值,预测值是从模型正向推断出的置信度,目的是让预测值与标签值越接近越好。

(4)第四项是不含物体的预测框(背景)的置信度误差,它们不用来拟合真实框的预测框,它们的预测值很低,标签值是0,再将其误差通过λnoobj给予更少的权重,这里设置为0.5。

(5)第五项是含有物体的网格的分类误差,若某个网格负责预测物体,那么这个网格在20个类别中狗这个类别的概率越接近于1(标注的框的正确类别)越好。

3.网络架构

YOLOV1网络结构较为简单,输入的是维度为448 * 448 * 3的图片,经过有24个卷积层和4个池化层进行图片特征的提取,最后接入2个全连接层用来预测目标的位置和类别概率,最终reshape输出7 * 7 * 30的预测结果,下图为YOLOV1论文(论文地址:https://arxiv.org/abs/1506.02640)上的网络结构图示:

(1)输入: 448 * 448 * 3的图像,448 * 448 是尺寸,而3是RGB通道,这个尺寸是固定的,原因是因为网络最后2层是全连接层,所以要求整个网络具有固定尺度的输入。

(2)输出: 7 * 7 * 30的张量,7 * 7是:在将输入图片划分为s * s规格的网格时,YOLOV1将S指定为了7,30是:每个小网格又生成2个预测框,而预测框的信息有x,y两个中心点的定位坐标和w,h两个预测框的信息以及对应的置信度 ,此时有5*2=10个。每个小格子还会预测对于所有类别概率Pr(Class(i)∣Objiect),5 * 2 + 20 最终总计为长度30的向量。

(3)中间过程:

这里补充一下卷积和池化计算

W:为输入图像大小。F:为卷积大小。P:为填充大小。S:为步长 。 K: 卷积核的个数。

​ 输入图像参数为W1 * H1 * D1

​ 输出图像参数为W2 = (W-F+2P)/S+1(卷积计算公式) * H2 = (W-F)/S+1(池化计算公式) * D2 = K

​ 一般而言: F=3时,P=1 F=5时,P=2 F=7时,P=3

第一层卷积:

​ 输入448 * 448 * 3的图像,第一层的卷积为7 * 7 * 64且步长为2(即W=448,F=7,P=3,S=2,K=64)

​ 输出为224 * 224 * 64 (448 - 7 + 2 * 3) / 2) + 1 = 224

第一层MAX池化(计算量过大,进行特征压缩,由大变小):

​ 输入为 224 * 224 * 64,第一层的池化为2 * 2 * 1,步长为2(即W = 224, F = 2, S = 2)

​ 输出为 112 * 112 * 64 (224 - 2) / 2 + 1 = 112

其余过程依次类推

到全连接层前的最后一个卷积层为7 * 7 * 1024,然后拉平放入一个有4096个神经元的全连接层中,输出4096维的向量,然后又导入有1470个神经元的全连接层中,输出1470维的向量,然后reshape一下形式,变成最后的7 * 7 * 30的张量进行输出。

4.YOLOV1的局限

​ (1) 每个格子仅能预测一个类别 eg:有两个物体大小相同且高度重合,就很难进行预测

​ (2) 标签模糊(多标签乱)无法实现预测 eg:结果为20分类选取最大的情况,仅展示一个标签

​ (3) 小物体检测不到 eg:框的尺寸固定,易受到大物体的影响,长宽比虽然可选,但是单一,非常规的物体,预测困难

​ (4) 图像的输入大小固定 eg:这与YOLOV1的全连接层有关,由于全连接层的尺寸是固定的,其与最后一个卷积的参数矩阵也是定的。

参考文章的连接:

http://t.csdn.cn/VymBL

http://t.csdn.cn/agAoQ

http://t.csdn.cn/R6LHO

http://t.csdn.cn/IF8sh

http://t.csdn.cn/xFW7R

http://t.csdn.cn/9y8vt

http://t.csdn.cn/TmbkX

http://t.csdn.cn/9XGdo

Objection Detection in 20 Years:A Survey 计算机视觉发展的重要模型和数据集汇总介绍的论文

bilibili UP主: 同济子豪兄/跟李沐学AI/唐雨迪博士(迪哥有点愁)/啥都会一点的研究生