废话不多说,本篇博客就是为什么总结一下yolo系列的主体思想,方便回头查看。有任何问题欢迎交流
YOLO v1
一、主体思想
1. 将输入图片划分为S×S的网格。如果一个目标的中心落入一个网格单元中,则该网格单元负责检测该目标。
2. 每个网格单元预测B个bounding boxes和这些bboxes的置信度分数(confidence scores)。置信度分数反映了该模型对box包围目标的信心,以及它预测box的准确程度。
置信度的定义:Pr(object)*IOU(truth,pred)。公式解释:如果单元格中存在目标,Pr(object)=1否则等于0;IOU(truth,pred)即为真实框和预测框的重叠度。这样置信度的定义就很容易理解了。
3.对于每个bboxes都有5个预测值:x, y, w, h ,confidence。其中**(x, y)坐标表示box相对自己所在网格单元边界的中心点坐标**。w, h则是相对于整张图预测的宽度和高度(原文这样表述,其含义我推测是w,h最后要相对整张图的宽和高做归一化处理)。confidence就是2中介绍的这个式子。
4.目标检测除了检测框还要分类目标啊,所以每个网格单元还预测C个类别的条件概率Pr(Classi|Object)。当然概率预测的前提是该网格单元包含被检测目标,否则不需要预测。对于每个单元格我们只预测一组类别概率,而不管该单元格预测的bboxes的数量B是多少。
5.**Pr(Classi|Object)*Pr(Object)IOU(truth,pred) = Pr(Classi)IOU(truth,pred) 这个式子提供了对于每个框的特定类别置信度分数。这个分数反映了该类Classi出现在该框中的概率以及该框拟合目标的程度。
如果在Pascal VOC上评估YOLO,因为其有20个标注类,所以C=20,假设我们 S=7, B=2,则我们最终预测了一个7730大小的张量。
因为YOLO将检测建模为回归问题,它将图像划分成S*S的网格,并且每个网格预测B个bboxes(每个bboxes的5个预测值:x, y, w, h ,confidence),以及C个类的概率。所以这些预测被编码成S×S×(B×5+C)的张量。
(如果有人想问为什么不是S×S×B×(5+C),4中最后一句话解释了为什么)。
二、训练
1.在ImageNet1000上以输入图片一半的分辨率(224×224)对backbone进行预训练,然后将分辨率加倍(448×448)来进行检测(检测通常需要细粒度的视觉信息)。
2.最后一层预测类概率和边界框坐标。我们通过图像宽度和高度来规范边界框的宽度和高度,使它们落在0和1之间。我们将边界框x和y坐标参数化为特定网格单元位置的偏移量,所以它们边界也在0和1之间。并对最后一层使用线性激活函数而所有其他层的激活函数使用leaky relu。
分类误差与定位误差的权重是一样的,这可能并不理想。另外,在每张图像中,许多网格单元不包含任何对象。这将这些单元格的“置信度”分数推向零,通常压倒了包含目标的单元格的梯度。这可能导致模型不稳定,从而导致训练早期发散。
3.为了改善上述这一点,我们提高了边界框坐标预测的损失值,并减少了不包含目标的边界框的置信度预测损失值。我们使用两个参数λcoord和λnoobj来完成这个工作。我们设置λcoord=5和λnoobj=0.5。
4.平方和误差也可以在大boxes和小boxes中同样加权误差。我们的错误指标应该反映出,大boxes小偏差的重要性不如小boxes小偏差的重要性。为了部分解决这个问题,我们直接预测边界框宽度和高度的平方根,而不是宽度和高度。
5.YOLO每个网格单元预测多个边界框。在训练时,每个目标我们只需要一个边界框预测器来负责。我们指定一个预测器“负责”根据哪个预测与真实值之间具有当前最高的IOU来预测目标。这导致边界框预测器之间的专业化。每个预测器可以更好地预测特定大小,方向角,或目标的类别,从而改善整体召回率。
损失函数:
其中1(obj,i)表示目标是否出现在网格单元i中,1(obj,(ij))表示网格单元i中的第j个边界框预测器“负责”该预测。)
关于loss,需要特别注意的是需要计算loss的部分。并不是网络的输出都算loss,具体地说:
1)有物体中心落入的cell,需要计算分类loss,两个predictor都要计算confidence loss,预测的bounding box与ground truth IOU比较大的那个predictor需要计算xywh loss。
2)特别注意:没有物体中心落入的cell,只需要计算confidence loss。