从YOLOv1开始的YOLO学习之路


文章目录

  • 从YOLOv1开始的YOLO学习之路
  • 前言
  • YOLO算法整体思路
  • 核心思想
  • 总结
  • 网络结构学习
  • 总结
  • loss计算
  • 位置损失
  • 置信度损失
  • NMS(非极大值抑制)
  • 预测流程
  • 优缺点


前言

YOLO是一个单阶段的检测算法,他就是把检测问题转化成回归问题,一个CNN就搞定了,同时也可以对视频进行实时检测,应用范围非常广。

YOLO算法整体思路

核心思想

要预测一张图像上的物体,比如要预测一个狗,那么我们要怎么去确定这个狗的位置?

yolov 只能使用python吗_计算机视觉


那么我们首先输入一张yolov 只能使用python吗_python_02的格子的图片(这里为了方便理解,就是把原本的像素点放大成一个又一个格子,在实际的结构当中就是判断像素点的)。那么yolo算法就会把些所有网格都会预测一下,然后确定代表的物体。

但是因为物体的位置比较多,单纯通过网络直接预测的准确率还不够。通过我们人为给定一些框,这些框(上图中的黄框)就是锚点(Anchor)。这些通过经验确定的框肯定是有一些误差,但可以给网络提供一个参考,所以yolo检测本质上就是通过训练之后对我们人为给定的框进行一个修正,对这些框的长和宽进行一个微调,到这里就变成了一个回归任务了,当相于就是找到一个最合适的长和宽,也就是**参数的求解和调整。**所以yolov1中就是先作出两个候选框,针对每一个格子都要去进行这么一个回归的求解

根据之前学习过的IOU这个指标,我们可以先用候选框和实际框分别计算出对应每一个候选框的IOU,因为IOU越大代表越接近实际值。我们对每一个候选框计算IOU,然后就对IOU最大的那个框进行微调。

但这里就会出现一个问题,因为要对每一个位置进行预测,就会导致要对整个图像上每一个像素点进行计算,这样就会出现很多很多物体但有些是背景,不是我们需要的物体,所以还需要预测一个置信度,我们需要过滤掉那些我们不需要的框,只有大于这个置信度的框才是真正预测到的物体。

通过这样的检测过程就可以算出我们需要的东西。

总结

在v1版本中,输入就是一个网格,针对网格里面每一个格子我们都会产生两个候选框,通过网络对候选框进行一个微调,因为有些只是背景,不是物体,所以我们不是对每一个候选框都进行微调,必须要有物体才行,所以每一个格子都需要预测一个置信度,置信度比较高的,大于这个阈值的,才是一个物体,只有是物体我们才对那个框进行微调,然后进行筛选,筛选IOU比较大,就是作为结果的,然后算出他们的yolov 只能使用python吗_计算机视觉_03映射到原始的图像就可以算出这个框了。

网络结构学习

在v1版本中,我们先输入一个yolov 只能使用python吗_网络_04的图像,是无法改变图像的大小的,只能是yolov 只能使用python吗_网络_04,因为卷积层对输入大小没有限制,任意大小的矩阵都可以进行卷积运算得到我们需要的特征,但全连接层是定死的,如果经过最后一层卷积层之后得到的是一个列为2048长度的一个矩阵,那么权重参数yolov 只能使用python吗_python_06的大小就是yolov 只能使用python吗_网络_07,偏置参数的大小为yolov 只能使用python吗_计算机视觉_08,这个权重参数是不能够一直在改变的(因为从最后的全连接之后得到的就是我们特征和类别),全连接层一定要固定特征图的大小

yolov 只能使用python吗_机器学习_09


上图为v1的网络结构(主要看v2和v3的)

v1的全连接当中被转换成了yolov 只能使用python吗_计算机视觉_10的向量,之后再经过全连接之后得到了一个yolov 只能使用python吗_机器学习_11的一个向量,为了能够是我们能够获取里面的信息,我们reshape成yolov 只能使用python吗_python_12的一个张量,这个就是我们的图片经过神经网络之后得到的特征,也是至关重要的,下面我们看看这个里面是什么。

最后得到的yolov 只能使用python吗_python_12的一个张量,yolov 只能使用python吗_机器学习_14代表了特征图的大小是yolov 只能使用python吗_机器学习_14的,后面的yolov 只能使用python吗_python_16表示yolov 只能使用python吗_机器学习_14中每一个格子都有30个值,每一个点都有30个值。
那么对于每一个格子,要产生两种框,也就是两个锚点。那么这30个值的前10个值表示了
yolov 只能使用python吗_机器学习_18
这10个值,不是表示方框在图像上的位置坐标,而是表示在归一化完之后在相对的一个长宽里面的值是多少。(可以理解为是一个相对坐标值)后面的yolov 只能使用python吗_机器学习_19就是一个yolov 只能使用python吗_机器学习_19分类,也就是后面剩下的值的数量就对应了你目前要检测的类别有几类(num_class)。这里的20代表了对应每一个类的一个概率,其实就是一个分类的问题。

  • 为什么计算机能这样?因为我规定了一个loss函数,希望这个损失函数到什么程度是最小的,就会逐渐去迎合你的损失函数达到最小,逐渐就会猜到每个值代表了什么,满足你需求和期望,只要提供合适的损失值就能够预测出来。
总结

每个数字的含义

  • yolov 只能使用python吗_python_21(2个框(boundingbox(yolov1)))
  • 当前数据集有yolov 只能使用python吗_yolov 只能使用python吗_22个类别
  • yolov 只能使用python吗_计算机视觉_23表示最终网格的大小
  • 预测结果:yolov 只能使用python吗_python_24

YOLOv1的目的是为了更快的检测,而不是追求精度。

什么是归一化,为什么?为什么就代表了?

loss计算

算法要看网络结构和损失函数,由网络结构确定损失函数

由于预测和真实之间存在一些差距,所以我们要计算他们的误差,而且是对5个量都需要计算损失。

yolov 只能使用python吗_机器学习_25


上图是总的损失函数计算。

位置损失

第一个框中的是位置误差:是用来计算yolov 只能使用python吗_计算机视觉_03这四个量的损失值,为了要找到他们变化率最小的地方,也就是损失最低的地方。

  • 对于yolov 只能使用python吗_网络_27做根号的运算是因为,对于大物体来说,因为物体较大,所以真实框和预测框之间的(偏移程度)误差对其结果的影响不大。(因为物体较大,就算有偏差,由于物体大,所以对于精度影响比较小,依然能够识别出来)
  • 但对于小物体来说,因为物体较小,稍微有一点偏差可能会导致很大的差距(真实框和预测框之间的误差)。所以,这就是一种对于值比较小的时候需要敏感,对于值比较大的时候可以不用很敏感的一个变化特点。,所以我们可以使用yolov 只能使用python吗_机器学习_28这个函数的特点

    对于yolov 只能使用python吗_机器学习_29值比较小的时候,yolov 只能使用python吗_网络_30的变化率比较大,对于yolov 只能使用python吗_机器学习_29比较大的时候yolov 只能使用python吗_网络_30的变化率比较小。
    所以我们要注重yolov 只能使用python吗_yolov 只能使用python吗_33比较小的时候的损失,也就是需要对小物体敏感,大物体粗糙也没关系。虽然不能控制物体的大小,但我们可以通过调整损失函数来达到相同的目的。

置信度损失

我们需要对置信度进行一个分类,因为图像中分前景和背景,但由于大部分都是背景。所以也要计算置信度损失。

第二个框中的是置信度误差(含有object的):是用来计算置信度yolov 只能使用python吗_机器学习_34的损失,也就是当前置信度和最大的IOU之间的差距,且是含有obj的。
第三个框中的是置信度误差(不含有object的):是用来计算置信度yolov 只能使用python吗_机器学习_34的损失,且是不含有obj的。计算时前面要加上一个权重系数,为了让损失函数更加注重前景,忽略背景,让背景占比较小的权重。
第四个框中的是分类误差:是计算每一个类中的误差

其中yolov 只能使用python吗_python_36表示在整个网格框中对每一个网格都要计算损失yolov 只能使用python吗_网络_37表示对于某一个格子都有两个boundingbox,也就是我们人为框定的候选框,这个损失函数就是为了对我们之前人为框定的候选框进行一个微调,但只会选其中一个进行微调(上面提到的先计算yolov 只能使用python吗_网络_38再进行对yolov 只能使用python吗_网络_38大的那个框进行微调)。在yolov1中只有两个锚点,所以也就只有yolov 只能使用python吗_yolov 只能使用python吗_40yolov 只能使用python吗_yolov 只能使用python吗_41yolov 只能使用python吗_yolov 只能使用python吗_42表示了一个权重系数,表示各部分占总部分的权重。

NMS(非极大值抑制)

我们通常在预测训练的时候会有很多个不同的概率框,如果有很多重合部分的框,那我们就挑选IOU比较大的作为极大值,我们就选择这个极大值的框。

预测流程

网络的输出是 yolov 只能使用python吗_网络_43 的数据块,首先用一个阈值选取含有目标的box,再用一个阈值筛选yolov 只能使用python吗_yolov 只能使用python吗_44,筛选后的框的yolov 只能使用python吗_机器学习_45从距离所在网格左上角的偏差解码为相对于图像左上角的距离,最后由NMS去除一些重叠的框。

NMS是大部分深度学习目标检测网络所需要的,大致算法流程为:

1.对所有预测框的置信度降序排序
2.选出置信度最高的预测框,确认其为正确预测(下次就没有他了,已经被确认了),并计算他与其他预测框的IOU
3.根据2中计算的IOU去除重叠度高的,IOU>threshold就删除
4.剩下的预测框返回第1步,直到没有剩下的为止

优缺点

优点:

  • 速度快,可以实时检测

缺点:

  • 重合的物体是很难检测的。
  • 之前的人为选的Boundingbox比较少,每一个框只能识别一个类别,如果重叠就无法解决。
  • 长款比单一,非常规的物体很难预测。