YOLO_V1总结

前文链接:图像分类和目标检测中的正负样本划分以及架构理解

在前文中,我们对目标检测有了基本的认识。本文是在前文的基础上,梳理下YOLOv1算法,v1是理解v2-v5的基础。

本节将不再详细介绍v1的论文理解,而是只梳理算法的关键部分。部分细节,请参考:【精读AI论文】YOLO V1目标检测,看我就够了_哔哩哔哩_bilibili

正如,前文所说,理解目标检测的关键在于将预测和训练分开理解

根据前文,先来分析v1的架构。

YOLO_V1总结

其中,64、192、128...表示使用多少卷积核,s为步长。

由于v1发布的较早,我们可以将 整个架构分为: Backbone + Detection head。

推理阶段:

参考该PPT:https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.g137784ab86_4_1668YOLO_V1总结https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.g137784ab86_4_1668

Detection head输出 7 * 7 * 30,然后进行后处理,就得到了检测结果。

YOLO_V1总结

 需要注意的是: x,y为相对于当前 grid cell 的值,在 0~1 之内。 w,h为相对于整个图 的值,在 0~1 之内。c 为置信度, 表示 预测框 中有目标

YOLO_V1总结

20个类别值中的某一个值为条件概率,即 当前 grid cell 有目标的条件下,目标是某一类的概率。

YOLO_V1总结

 YOLO_V1总结

 那么为什么 置信度c 为上式中的呢?

为了弄清楚,我们不得不说明 训练阶段 中的 置信度。

YOLO_V1总结

当 某个真实框 的 中心坐标 在某个 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。

YOLO_V1总结

搞清楚了 置信度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)。

YOLO_V1总结

 (x_hat, y_hat, w_hat, h_hat)都是相对值,在0~1之间,表示真实框, w_hat = w / W, h_hat = h / H。

YOLO_V1总结

如何从正负样本的角度理解  (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

上一篇:8. abstract 、static 和final修饰符


下一篇:图片标注工具LabelImg,打包好的exe版本,可直接运行