目标检测YOLOv1学习

YOLO系列,YOLOv1学习总结

  • YOLOv1
    • 总体网络结构
    • 1. 卷积部分结构
    • 2. 全连接层部分
      • 怎么转换成7×7×30
      • (1) anchor置信度
      • (2) anchor位置大小
      • (3) 类别预测分数
    • 损失
      • 位置损失
        • 参数解释
        • 为什么采用均方差?
      • 置信度损失
        • 参数解释
      • 类别损失
        • 参数解释
    • 缺点
    • 总结

YOLOv1

总体网络结构

目标检测YOLOv1学习_第1张图片
总体结构如上图,就是通过一个卷积神经网络,直接对目标检测预测框的 类别、x、y、w、h 直接进行回归。

1. 卷积部分结构

目标检测YOLOv1学习_第2张图片
卷积部分其实就是一个特征图提取和计算的过程,如上图红色框部分。
个人理解就是能实现很复杂计算的一个特征提取部分,将输入的图片转换成特征图层,并基于这个卷积部分提取的特征图层,结合后面的全连接层进行anchor的(x, y, w, h)、置信度、和各个类别分数的回归。

2. 全连接层部分

目标检测YOLOv1学习_第3张图片

全连接层部分就是将特征图层转换成我们想要的 7×7×30,上图红色框部分。
为什么是 7×7×30 呢,原因如下图
我们可以看到 7×7×30 里包含了两个anchor框的位置大小信息(x, y, w, h),两个anchor框置信度(是目标还是背景),还有二十个类别的预测分数。
目标检测YOLOv1学习_第4张图片

怎么转换成7×7×30

我们仔细来看这一部分,就会发现特征图层在这一部分前面是 7×7×1024,原论文是这样处理的,
先将特征图层 flatten() 展平,然后接一个 4096 的全连接层,后面再接一个 1470 的全连接层。1470 = 7×7×30
这样,直接通过一个 reshape 将全连接层转换成 7×7×30 的预测特征图层,7×7×30里面的每个1×1×30就包含了前面提到的:
box1(x, y, w, h) + confidence1 + box2(x, y, w, h) + confidence2 + 20个类别预测分数
目标检测YOLOv1学习_第5张图片

(1) anchor置信度

这里的anchor的置信度是判断目标框还是背景框,起着去除多余框的作用,如下图,如果没有置信度来判断目标框还是背景框,根据(x, y, w, h)画出来的预测框是下图这个样子的,有很多黑框,但是只有加粗的黑框才是有用的。
目标检测YOLOv1学习_第6张图片
因此我们加入置信度,判断黑框是否是目标框,就可以去除掉背景框的预测,如下图。
目标检测YOLOv1学习_第7张图片

(2) anchor位置大小

训练时,回归的是 中心点落在这个像素位置范围内的 Ground Truth 框的(x, y, w, h)。
x, y:框中心点的 x, y;
w, h:框的宽(width)和高(height)

(3) 类别预测分数

由于YOLOv1论文使用的数据集只有20各类别,因此,是用20个数值来表示各类别的预测分数;如果是30各类别,则需要30个数值,就需要转换成 7×7×40 的 tensor 进行回归训练。

损失

目标检测YOLOv1学习_第8张图片
整个算法的损失均使用了均方误差的方式来实现,包括:

  1. 预测框的坐标误差;
  2. 有无包含物体的置信度误差;
  3. 网格预测类别的误差;

这里损失中用了权重系数来进行平衡,对于不同的损失用不同的权重。

位置损失

坐标损失分为两部分,坐标中心误差 和 位置宽高的误差。
目标检测YOLOv1学习_第9张图片

参数解释

L(obj)(ij) 表示第i个网格中的第j个预测框是否负责obj这个物体的预测,只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值,和ground truth box的IoU是不是在那个网格的所有box中最大。
入coord 表示权重参数,取5。

为什么采用均方差?

目标检测YOLOv1学习_第10张图片
蓝色为预测框,两个红色框则分别表示两个ground truth框,如果不采用均方差,我们会发现A与B、B与C的损失是一样的
但是从面积上看,B框是A框的25倍,C框是B框的81/25倍。B框跟A框的大小偏差更大,所以不应该有相同的loss。如果W和h加上平方根,那么B对A的位置loss约为3.06,B对C的位置loss约为1.17,B对A的位置loss的值更大,这更加符合我们的实际判断。所以,算法对位置损失中的宽高损失加上了平方根。

置信度损失

目标检测YOLOv1学习_第11张图片

参数解释

L(obj)(ij) 表示第i个网格中的第j个预测框负责obj这个物体的预测,当 负责 obj这个物体预测的时候置为 1;
L(noobj)(ij) 表示第i个网格中的第j个预测框不负责obj这个物体的预测,当不负责 obj这个物体预测的时候置为 1;
入(noobj) 的作用是在对没有object的box的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5;而有object的box的confidence loss和类别的loss的loss weight正常取1。

类别损失

类别损失

参数解释

L(obj)(i) 表示第i个网格是否需要进行类别预测。
(pi© - pi©)^2就是通过平方差计算损失,这里用交叉熵进行计算或许更好。

缺点

  1. 每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果较差;
  2. 原始图片只划分为7x7的网格,当两个物体靠的很近时,效果比较差;
  3. 最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到);
  4. 对于图片中比较小的物体,效果比较差;

总结

YOLOv1就是通过卷积神经网络提取图片中的特征信息,并将特征图层转换成我们想要的7×7×30,直接对预测框的 置信度、位置大小、类别分数 进行训练回归。

有什么补充或者问题,欢迎交流。
如有错误,恳请各位大佬指正。

你可能感兴趣的:(目标检测,学习,深度学习)