目标检测是理解图像内容的基础,它涉及识别图像中的一个或多个对象,并确定它们的位置。
YOLOv1将目标检测视为一个单一的回归问题。它将整个图像分割成一个个网格,每个网格负责预测中心点落在该网格内的目标对象。
YOLOv1的架构基于卷积神经网络(CNN),它通过一个单一的网络流程来预测多个边界框和类别概率。网络的输入是一张图片,输出是多个边界框的坐标、置信度以及类别概率。(yolov1的损失函数很重要)
目录
一. yolov1推理过程
1. 网络框架
YOLOv1的网络结构是一个24层(可以数一下,池化层不算)卷积层+2层全连接层的深度卷积神经网络。24层卷积层提取特征,2层全连接层回归得到7x7x30的tensor。
网络的输入是一个448x448x3(将彩色图片缩放成448x448)的图片,经过若干卷积核池化层,得到了一个7x7x1024的feature map。
将这个feature map拉平,输入到一个4096维的全连接层中,得到一个4096维的向量,再将这个向量输入到一个1470维的全连接层中,得到一个1470维的向量。经过reshape得到7x7x30。
YOLOv1的输出是一个7x7x30的张量,其中7x7表示输入图像被划分的网格数,每个网格负责预测该区域内的目标。每个网格输出30个预测值,包括边界框的坐标、置信度以及类别概率。如图所示:
2.输出结果分析
yolov1先将图片分成7x7的grid cell,每个grid cell生成两个预测框bounding boxes,两个预测框的中心点落在所属的grid cell中。每个预测框包含5个信息(该框中心点的坐标x,y 框高宽h,w 以及一个判断该框是否包含对象的置信度)。图中用框的粗细代表置信度大小。
每个grid cell还生成一组条件类别概率,即假设包含对象的前提下是某个物体的概率。将每个框中的bounding box的置信度乘以条件类别概率(每个grid cell的bounding box共享这组类别概率)就得到了grid cell的各类别概率。
yolov1输出7x7x30的向量,也就是7x7x(2x5+20)。2代表每个grid cell生成两个预测框,5代表每个预测框包含五个信息。20代表20个类别。下图展示了每个grid cell条件概率最高的那些类别。
每个grid cell只能预测出1个物体,yolov1最多只能预测7x7=49个物体。这也是yolov1检测小目标和密集目标效果差的原因。
如图所示,yolov1的输出的通道内容为右边的长条。前面两个长度为5的线段是每个grid cell预测的两个bounding boxes,每个bounding box包含5个内容。后面的20为类别的概率。
每个bounding box的置信度乘以包含物体条件下各个物体类别(20个物体)的概率就是真正类别的概率。每个grid cell有两个bounding boxes,所以有7x7x2=98个20维的向量。
3.后处理
在之前的输出结果分析中已经知道了最终能得到7x7x2=98个bounding boxes,类似于中间的结果。那么怎么得到最后的检测结果呢,肯定是要进行一些后处理来去除重复和不必要的预测结果。
有98个20维的向量,假设第一维的类别是狗,首先设定一个阈值进行筛选,比如将阈值设为0.2,狗的概率中小于0.2的置0,然后将这98个向量按照狗的概率进行从大到小排序,此时0在最后面。
之后就要进行非极大值抑制了,如下图。
排序之后,第一个检测狗的概率值是最大的。此时计算后面每一个bounding box分别与第一个的IOU,设置一个阈值(比如0.5),如果大于这个阈值说明识别到的是同一个东西,就将概率小的那个概率置0,如果小于就保留其概率值。
之后开始下一轮比较,概率第二大的(原本是bb20,置0后变成bb25第二大)与后面的每一个的IOU进行进行比较,根据之前的阈值决定是否置零0.
所有的非0概率的IOU比较完之后,就得到了98个bounding box中检测到狗的非0概率的那些框。假如有两个非0(一般这样操作过后非0很少),那么说明检测到了两只狗。
之后对所有类别进行重复操作。
(注意只有推理过程中需要NMS非极大值抑制,训练过程不用!因为训练过程需要每一个bounding box的信息作损失)
二、yolov1训练过程
1. grid cell存在物体与不存在物体
yolov1每个grid cell产生两个bounding boxes。
当label的中心点落在该grid cell时(代表该grid cell检测到物体),训练中利用其中与label的IOU最大的那个bounding box进行拟合。如上图所示,产生两个框,利用与label的IOU最大的进行拟合(就是外面那个大框)。
当没有label的中心点落在该grid cell时,此时只需要让这两个框的置信度逼近0就好(损失函数会解释),如上图所示。
2. 损失函数
上图是别人批注好的yolov1损失函数,主要分为五个部分。
图中最左列已经将五项损失说的很清楚了,接下来介绍一下需要关注的细节。
- 首先是右上角的注释,红框中的项代表该bounding负责检测物体时为1,否则为0。而绿框中的项与其相反。通过选择性地计算损失,模型既能学习到哪些地方存在物体,也能学习到哪些地方不存在物体。并且不存在物体的权重较低,模型可以更专注于那些对于提高整体性能更关键的预测。
- 其次是第二项中的w和h都用了根号,这是因为当w和h很小时,根号可以让两者各自的差放大(比如0.16开根号后是0.4,变大了),可以让模型更关注。
- 第三项中的置信度标签值是预测框与标签框的IOU,每次都会变化。代表这个框包含物体的概率。
- 最后是右上角的蓝框,代表是否包含物体。这样当grid cell中不包含物体时,不用计算这一项;包含物体时,两个bounding boxes的这一项是一样的。