在前文中,我们对目标检测有了基本的认识。本文是在前文的基础上,梳理下YOLOv1算法,v1是理解v2-v5的基础。
本节将不再详细介绍v1的论文理解,而是只梳理算法的关键部分。部分细节,请参考:【精读AI论文】YOLO V1目标检测,看我就够了_哔哩哔哩_bilibili
正如,前文所说,理解目标检测的关键在于将预测和训练分开理解。
根据前文,先来分析v1的架构。
其中,64、192、128...表示使用多少卷积核,s为步长。
由于v1发布的较早,我们可以将 整个架构分为: Backbone + Detection head。
推理阶段:
Detection head输出 7 * 7 * 30,然后进行后处理,就得到了检测结果。
需要注意的是: x,y为相对于当前 grid cell 的值,在 0~1 之内。 w,h为相对于整个图 的值,在 0~1 之内。c 为置信度, 表示 预测框 中有目标。
20个类别值中的某一个值为条件概率,即 当前 grid cell 有目标的条件下,目标是某一类的概率。
那么为什么 置信度c 为上式中的呢?
为了弄清楚,我们不得不说明 训练阶段 中的 置信度。
当 某个真实框 的 中心坐标 在某个 grid cell 中,那么 这个 grid cell 是有2个框b1、b2,都有 置信度c, 分别设为 c1、c2, 那么 如何优化 c1 和 c2 ,使它们可以反映这2个框有目标和定位精度呢?作者很巧妙的 将 b1 和 b2 中与 真实框具有最大的IOU值作为 标签 c_hat = IOU_big。 这里,Pr(Object) = 1 。 为什么选最大的IOU呢?显然,如果 按b1和b2 分别的IOU 作为标签,那么较小的IOU的b的目标过低。这就像两个小孩b1、b2,一个想考哈佛(IOU 大),另外一个想家里蹲(IOU 小),那么我们把b2的目标也改成考哈佛,他不就要更努力了嘛。所以 (c1 - c_hat)^2 + (c2 - c_hat)^2 要减小,c1 和 c2 就要接近于 大的IOU值。
当 所有 真实框 的 中心坐标 都没有在某个 grid cell 中,那么 这个 grid cell 是有2个框b1、b2, 它们的标签值 c_hat = 0。这里,Pr(Object) = 0,也就不用关心IOU了,因为也没真实框。那么 (c1 - 0)^2 + (c2 - 0)^2 ,因此 c1 和 c2 会在迭代中接近于 0。
所以,置信度c 有两重含义:
- 当前 grid cell 有目标时(真实框 的 中心坐标 在 grid cell 中),如果 预测框 和 真实框的 IOU接近1,说明定位准,c 会 接近 1 ,否则,c会反映定位不准。
- 当前 grid cell 没有目标时,标签值为0,c会接近 0,反映了对背景区分的程度,当模型训练不好时,c可能不为 0 ,说明没有区分好背景。
那么样本是什么?
样本 我认为是 所有的 预测框, 一共 7 * 7 * 2 个。
如何从正负样本的角度理解?
- 当前 grid cell 有目标时,当前grid cell的预测框b1和b2是正样本, 其他 7 * 7 * 2 - 2 个是负样本。正样本的预测值为c,标签值 为 c_hat 。
- 当前 grid cell 没有目标时,当前grid cell的预测框b1和b2是正样本, 其他 7 * 7 * 2 - 2 个是负样本。正样本的预测值为c,标签值 为 0。
为了理解 置信度c ,此处说明了 训练阶段 , 置信度c 的 标签值是什么。因此,在 Backbone + Detection head 训练好后, c 自然就代表了上文中的两重含义。
为什么可以使用 L2 Loss?
- 当前 grid cell 有目标时,IOU值保证了 c优化的范围为 0~1 之间。
- 当前 grid cell 没有目标时,c优化的目标为0。
搞清楚了 置信度c, 我们还需要搞清楚 20-dim 的分类概率。 从公式来看,这是条件为 grid cell 有目标时,一个条件概率 。把该 条件概率 * 置信度c = 7 * 7 * 2 个 class scores。class scores表示 全概率 * IOU,见公式1。IOU和grid cell有物体的信息隐藏在 置信度c 中,所以 class scores 反映了 分类精度 和 定位精度。
如何从正负样本的角度理解条件概率p?
- 当前 grid cell 有目标时(条件),当前grid cell的预测框b1和b2是正样本, 其他 7 * 7 * 2 - 2 个是负样本。正样本的预测值为p(20-dim的向量),标签值 为 p_hat (20-dim的 one-hot 向量)。
后处理:
因此,得到 7 * 7 * 2 个 class scores,维度为类别数。 后处理是在这个张量上进行的。分别为 针对每个类,小于阈值的置0,降序排序,NMS, 重复类别数次,该张量会存在很多0。然后分别判断每个框,如果其中最大的大于0,那么保留该框,全为0,则删除。
这里有一个幻灯片中的问题,为什么蓝色框消失了?
这里我觉得是作者为了展示效果,按NMS算法应该保留,并且第一步阈值判断应该已经置0了。
训练阶段:
在预测阶段,已经说明了 置信度c 和 条件概率p 的含义。还剩下 (x, y, w, h)。
(x_hat, y_hat, w_hat, h_hat)都是相对值,在0~1之间,表示真实框, w_hat = w / W, h_hat = h / H。
如何从正负样本的角度理解 (x, y, w, h)优化?
- 当前 grid cell 有目标时,当前grid cell的预测框b1和b2的图像区域是正样本, 其他 图像区域 是负样本。正样本的预测值为 (x, y, w, h),标签值 为 (x_hat, y_hat, w_hat, h_hat)。损失是L2 Loss。
因为v1 没有对这些图像区域进行约束, 不像 anchor based 方法约束了图像区域的范围,通过中心点在grid cell的真实框作为优化目标,这可能也是导致 YOLOv1 定位不准的原因。但是,由于没有这种约束,网络开始生成的框可能比较随机,在训练中引入了噪声,或许是图像分类的精度较 fast rcnn 高的原因。此外,优化目标是相对值,这使得模型的输出的 (x, y, w, h) 向 坐标 (x, y)在 grid cell 内部,(w, h) 在图像内的方向进行优化。
YOLOv1的优缺点:
待续
如何优化YOLOv1?
-
改进Backbone
-
引入Neck
-
改进Detection head
-
引入 Anchor
- 损失函数重设计
- 添加Batch Normalization层...
参考:
除了文中的参考链接,请参考:
https://www.youtube.com/watch?v=L0tzmv--CGY