YOLO的核心原理预览
- YOLO将输入的图片resize成448 x 448,并且为 S x S(S = 7)个grid,如果物体的中心落入该grid中,那么该grid就需要负责检测该物体。
- 一次性输出所检测到的目标信息,包括类别和位置。
- 类别是指网格(grid cell)内的物体的类别,(注意,网格是物体的中心)。位置是用边界框(bounding boxs)确定的图像内这个物体的大小和物体所在的完整区域。
- 网格负责检测物体类别,网格内存在物体的中心,即物体的中心落在了网格内。边界框负责框选物体的位置和大小。
针对每个图片进行7x7的网格分割,然后经过卷积网络和全连接网络后在reshape后,每个cell的每个边界框(bounding boxs)得到一个1x30的Tensor。
-
对于每一个网格(grid),都会预测出B个bounding boxes(B=2),这个bounding boxes有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及这次预测的置信度(confidence score)。
-
Bounding Box指矩形框的中心 (x,y),矩形框的宽高(w,h)以及置信度c,这5个值的范围在0和1之间,通过Sigmoid函数来实现。
矩形框中心 (x,y)的含义:x,y就是bounding box的中心坐标,每个Bounding Box相对于grid cell的偏移值,与grid cell对齐(即相对于当前grid cell的偏移值),使得范围变成0到1。
矩形框的宽高 (w,h)的含义: 每个Bounding Box的宽高相对于整个图像的大小。w和h进行归一化(分别除以图像的w和h,这样最后的w和h就在0到1范围)。
-
要注意:每个grid产生两个bounding boxs,如下左图中狗的中心点对应两个黄色框,以及自行车后轮外面的图像中心点对应的两个红色框,其中狗的中心点对应的两个bounding boxs(黄色),相对于自行车后轮外面的图像中心点对应的两个bounding boxs(红色)尺寸是不一样的,也说明bounding boxs的尺寸是根据目标自适应的:
-
每个框还要负责预测这个框中的物体是什么类别的,共预测C个类。
-
综上,S×S 个网格,每个网格要预测 B个bounding box ,还要预测 C 个类。网络输出就是一个 S × S × (5×B+C)。(S x S个网格,每个网格都有B个预测框,每个框又有5个参数(矩形框的中心 (x,y),矩形框的宽高(w,h)以及置信度c,这5个值的范围在0和1之间),再加上每个网格都有C个预测类,默认C=20,即可以将物体检测为20个类别)
-
每个bounding box都对应一个confidence score,如果grid cell里面没有object,confidence就是0,如果有,则confidence score等于预测的box和ground truth的IOU值,见上面公式。所以如何判断一个grid cell中是否包含object呢?答案是:如果一个object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。
每个grid cell都预测C个类别概率,表示一个grid cell在包含object的条件下属于某个类别的概率,如下图:注意grid cell和bounding box的区别,类别概率是针对grid cell的。
由于图像中包含物体对象的Bounding Box数量远远小于不包含物体的Bounding Box数量,因此若两者的权重相等,那么计算的损失函数会偏向于给出背景的结果。Yolo1算法论文设置包含物体的Bounding Box的权重为5,不包含的Bounding Box的权重为0。
由于宽度w和高度h进行了归一化,x和y是对应网络单元格*(grid)的偏移量。因此,x、y、w和h都在 0 和 1 之间。每个网络单元格有 20 个条件类概率。条件类概率是检测到的对象属于特定类别的概率(每个单元属于每个类别的概率)。因此,YOLO 的预测形状为 (S, S, B×5 + C) = (7, 7, 2×5 + 20) = (7, 7, 30)。
下图为一张图中的7x7x30的Tensor:
对于这个长度为30的向量(一维的Tensor可以称为一维向量)中,1—>5为第一个边界框(bounding boxs)的预测参数,包括x1,y1,w1,h1,Confidence score1,6—>10为第二个边界框(bounding boxs)的预测参数,包括x2,y2,w2,h2,Confidence score2.后面的11—>30是这个格子(是grid cell,不是bounding boxs)中的物体对20种分类的预测的置信度(confidence score):
由于每个网格cell的边界框(bounding boxs)都会输出一个1x30的Tensor。而每个网格cell都有2个边界框,因此整张图像得到了7*7*2=98个Bounding Boxes的参数Tensor。
-
包含物体和不包含物体的权重分别记为:
Yolo算法把定位和检测目标看成是一个回归问题,因此对于所有的输出变量,我们都使用和平方误差表示损失函数。
每个grid cell包含了2个Bounding Box和1个条件类概率,
其中:
表示第i个grid cell的第j个Bounding Box是否包含物体对象,若包含,则
等于1;若不包含,则
等于0。
表示第i个grid cell是否包含物体对象,若包含,则
等于1;若不包含,则
等于0。
对于不同大小的Bounding Box,小的Bounding Box对于偏差的容忍度更低,比如千万富翁丢失1000块钱与普通家庭丢失1000块钱的意义不一样。为了缓和这个问题,我们对Bounding Box的宽和高取平方根。如下图:
YOLO-V1的网络架构:
输入图像大小: 448×448×3
过程中的参数含义:
损失函数:
①涉及的预测的位置参数值与对应的损失函数描述:
x, y, w, h :
对应的损失函数要尽量减小预测值与真实值之间的差距。
函数公式中 x, y 是使用 平方差值 来描述,而对于 w, h 使用了根号,是为了检测小物体时候,减小偏移量小的时候对于小物体的的敏感度。
损失函数中的系数,是相应的权重。
②关于置信度的损失函数(与类别有关):
平方置信度与真实值之间的差异(分为不同的情况讨论:前景(要检测的物体)、背景(无目标处))
③分类相关的损失函数:交叉熵损失函数
非极大值抑制:
只取出保留 IOU 数值最大的框。
YOLO-V1小结
YOLO-V1 整体网络架构简单,检测速度快。
网络中,每个 cell 只预测一个类别,若物体的位置重合时,检测困难。
每个点只有两个候选框,小物体考虑的少。
如何定位目标物体的grid cell和Bounding Box
我们知道了损失函数如何计算,yolo算法预测每个grid cell的Bounding Box?训练阶段,我们需要知道物体的实际grid cell和Bounding Box。
如何定位?若目标物体的中心点在某一个grid cell,则该目标物体属于这一个grid cell,然后以整个图像宽高为尺度,计算该物体所在grid cell的宽高。如下图的红框grid cell标记的狗: