YOLO!!!


Faster RCNN的精度是state-of-the-art级别的,Yolo虽然没有超越Faster RCNN,但是却是在速度与精度之间进行权衡。尤其是Yolo v3在改进多次后,既有精度又有了较高的运行速度。在很多边缘计算和信息处理的实时性比较高的任务中,Yolo v3还是备受青睐。
Yolo v3在论文中提到有三个优点:

  • 1.快,因为使用了回归的方法,并且没有使用复杂的框架。
  • 2.Yolo它是基于整张图片信息进行的预测,而不是滑窗式。
  • 3.Yolo学到的特征更为通用,只要是同一种东西,即便可能画面的风格不同,依然有较好的检测效果。

本篇博客重点讲解Yolo算法细节。(后续也会更新v1~v5)×(不更了)√

1.YOLO V1

1.1 网络结构图

在这里插入图片描述
输入是448×448的图像,经过多层卷积和最大池化后,最后变成了7×7×1024的张量,在经过两个全连接层最终变成7×7×30。
原本的目标识别和分类网络,最后一般都是压平张量变成一个和所分种类相同长度的一维张量,一般还要做softmax激活,每个分量的值代表每个种类的概率值。
网络的backbone受启发于GoogLeNet,也是v2、v3中DarkNet的先锋。本质上没有什么特别,没有使用BN层,只用了一层Dropout。除了最后一层是Relu外,其它层都是LeakyRelu。

1.2 网络输出的张量维度

7×7×30

1.2.1 7×7

  • 7×7是指每张图片本质上被分成了7×7的网格,每个网格大小64×64pix。
    在这里插入图片描述
    在YOLO中,如果一个物体的中心点落到了某个格子中,那么将由这个格子负责预测这个物体。如图中所示,包围着小狗的蓝色框中心点在(2,3)。那么在这49个格子中,(2,3)就负责检测出小狗。没有物体中心点落进来的就不负责预测任何物体。
    这个设定就好比该网络在一开始,就将整个图片上的预测任务进行了分工,一共设定7×7个按照方阵列队的检测人员,每个人员负责检测一个物体,大家的分工界线,就是看被检测物体的中心点落在谁的格子里。当然,是7×7还是9×9,是上图中的参数S,可以自己修改,精度和性能会随之有些变化。

1.2.2 30

(cx,cy,w,h,confidence,cx,cy,w,h,confidence,cls1,cls2,…,cls20)
刚才的49个检测员所检测的内容就是这里的30,Yolo V1中30=(4+1)×2+20.其中(4+1)是指矩形框的中心点坐标、检测框长宽以及其置信度[x, y, w, h ,confidence];
置信度:在训练中我们挑选哪个bounding box的准则是:选择预测的box与ground truth box的IOU最大的bounding box做为最优的box,但是在预测中并没有ground truth box,怎么才能挑选最优bounding box呢?

2

  • 指一个格子共回归两个矩形框,每个框生成5个预测值[x, y, w, h ,pro]

20

  • 代表的预测20个类别

需要注意的是:

  • 1.每个格子grid产生2个预测框,2也是参数可以修改,算法会在这几个矩形框中选择置信度最高的框作为输出。
  • 2.每个中心方格只能对应预测出一个物品,也就是说虽然可以通过调参数产生不同的矩形框,但是只能提高矩形框和单个对象的预测精度,但如果是很多个物品的中心同时落在了一个矩形框中,虽然能够产生多个预测框,框选住了待预测的多个对象,但是由1我们可以知道,它只会选择置信度最大的那个框作为此中心点的输出。换句话说:7×7的图像网格最多预测49个物品。(由于存在这个限制,所以Yolo V1对一些临近的小物体识别效果不是太好,比如远处成群的小鸟挤到了一个格子里。)

所以具体实现的时候是什么样的过程呢?

  • 训练的时候:输入N个图像,每个图像包含M个grid,每个grid包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7730大小的三维矩阵。每个1*30的向量前5个元素表示第一个bounding box的4个坐标[x, y, w, h]和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。注意这30个都是预测的结果。然后就可以计算损失函数的第一、二、五行。至于第二三行,confidence可以根据ground truth和预测的bounding box计算出的IOU和是否有object的0,1值相乘得到。真实的confidence是0或1值,即有object则为1,没有object则为0。这样就能计算出loss function的值了。
  • 测试的时候:输入一张图像,跑到网络的末端得到7730的三维矩阵,这里虽然没有切实的办法计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。

1.2.3 Loss函数

神经网络结构确定之后,训练效果好坏,由Loss函数和优化器决定。Yolo v1使用普通的梯度下降法作为优化器。这里重点解读一下Yolo v1使用的Loss函数:
在这里插入图片描述
1.第一个蓝色框中第一行

  • 这一行表示的是预测框中心点坐标(x,y)的偏差所造成的的loss,其中1objij为控制函数,如果当前的bbox格子中包含标签中的物体,该值为1,否则为零。也就是只对那些有真实物体所属的格点进行损失计算,若该格点不包含物体,那么预测数值不对损失函数造成影响。(x,y)的数值与标签所标定的坐标用简单的平方和误差。

2.第一个蓝色框中第二行

  • 这一行表示的是预测框的宽高(w,h)的偏差所造成的的loss,其中1objij表示的含义相同。这里也是使用的平方和误差,不过对(w,h)在损失函数中进行了根号处理。原因在于,如果不取根号,损失函数往往更倾向于调整尺寸比较大的预测框。例如,20个像素点的偏差,对于800×600的预测框几乎没有影响,此时的IOU数值还是很大,但是对于30×40的预测框影响就很大,取根号是为了尽可能的消除大尺寸框与小尺寸框之间的差异。

3.第二个蓝色框

  • 预测框的置信度C_hat与真实C之间的偏差所造成的loss,当该格点不含有物体时,该置信度的标签为0,控制函数1objij取值为0。该置信度的标签为预测框与真实物体框的IOU数值(IOU计算公式为:两个框交集的面积除以并集的面积)。

4.第三个蓝色框

  • 当前中心点的预测框不对预测负责的置信度C_hat与其真实C之间的偏差所造成的loss当该格点不含有物体时,该置信度的标签为0,控制函数1noobjij取值为1。该置信度的标签为预测框与真实物体框的IOU数值(IOU计算公式为:两个框交集的面积除以并集的面积)。

5.第四个蓝色框

  • 目标类别预测损失正确的类别位置,该标签数值为1,其余位置为0,与分类网络相同。

6.最后来看λcoordλnoobj

  • Yolo面临的物体检测问题,是一个典型的类别数目不均衡的问题。每张图的49个格点,含有物体的格点往往只有3、4个,其余全部是无用的格点。此时如果不采取措施,那么物体检测的mAP(Mean
    Average Precise)不会太高,因为在模型的Loss函数中占大比重的为无用格点,所以模型会偏向于增高检测无用格点的精度,以减少Loss函数的大小。而λcoordλ noobj就是为了平衡两者的差异,让含有物体的格点,在Loss函数中的权重更大,让模型重视含有物体的格点所造成的的损失。在论文中两者的取值分别为5和0.5。

1.2.4 技巧

1.使用offset取代直接回归坐标

  • 我们在预测中心点的时候不去预测基于全局的坐标位置,而是预测相对于每个格点左上角坐标的位移值。在Yolo V1中并没有做sigmoid归一化,V2中做了。(第一个格点中物体坐标为(2.3,3.6),另一个格点中的物体坐标为(5.4,6.3),这四个数值让神经网络暴力回归,有一定难度。所以这里的offset是指,既然格点已知,那么物体中心点的坐标一定在格点正方形里,相对于格点左上角的位移值一定在区间[0, 1)中。让神经网络去预测(0.3,0.6)与(0.4,0.3)会更加容易,在使用时,加上对应的格点左上角坐标(2,3)、(5,6)即可。)
    但是对于预测框大小的预测却还是相对于整张图片,这样做的话范围较大,不利于模型训练和收敛。不过在V2中引入了Anchors box,改进了这一点。

2.同一个格点的不同大小的预测框有不同作用

  • 前文中提到,每个格点预测两个或多个矩形框。此时假设每个格点预测两个矩形框。那么在训练时,见到一个真实物体,我们是希望两个框都去逼近这个物体的真实矩形框,还是只用一个去逼近?或许通常来想,让两个人一起去做同一件事,比一个人做一件事成功率要高,所以可能会让两个框都去逼近这个真实物体。但是作者没有这样做,在损失函数计算中,只对和真实物体最接近的框计算损失,其余框不进行修正。这样操作之后作者发现,一个格点的两个框在尺寸、长宽比、或者某些类别上逐渐有所分工,总体的召回率有所提升。

3.使用非极大抑制生成预测框

  • 通常来说,在预测的时候,格点与格点并不会冲突,但是在预测一些大物体或者邻近物体时,会有多个格点预测了同一个物体。此时采用非极大抑制技巧,过滤掉一些重叠的矩形框。但是mAP提升并没有显著提升。(非极大抑制,非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
    在这里插入图片描述

4.推理时将P×C作为输出置信度
在这里插入图片描述

  • 在推理时,使用这个预测框存在目标的概率P(根据训练数据的GT实际标注获得这个格子存在中心点就是1,不存在就是0)乘以这个预测框与GT框的IOU值C,作为输出预测物体的真实置信度。
  • 同时模型在推理时也会在out_put中直接输出一个预测置信度,用模型直接输出的预测置信度P×C得到的真实置信度来求置信度loss
  • 不过在代码中P×C这一步,代码中直接使用的P=1
    5.最后对每个预测框的结果打分作为NMS的选择标准
    在这里插入图片描述

1.2.5 疑问与解答

Yolo v1将输入图像划分成7x7的grid cells,每个cell预测2个bouding box(BBox),那如何挑选出预测每个类的BBox?

  • 答:YOLOv1 预测输出为 SxSx(Bx5+C),其中, S为7个grid cell,B为2个BBox,C为20个类,5为坐标值4个(xywh)和1个confidence. 在目标检测后处理阶段,对于每个grid cell,会预测2个bbox及其confidence,用每一个confidence乘以20个类的概率,获得一个confidence score矩阵,其维度为7x7x2x20。然后对20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2) 的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bounding box。
  • 我个人感觉还有个更合理的方法:当获得了7x7x2x20的confidence score矩阵后,每个BBox根据20类的confidence score的排序,将自己标记为排名最靠前的类标签。这样一类,就可以获得一个7x7x2的confidence score的矩阵以及7x7x2预测类别的矩阵,然后将同类的所有BBox及其confidence score提取出来,再进行NMS,可能更准确。前提是,每个BBox只能预测一个object。

在论文中,作者提到了BBox预测的置信度confidence可以通过预测obj的概率和IOU的乘积所得,那网络模型输出的confidence有何用?在推测阶段时,没有正值,如何计算IOU呢?

  • 答:这个问题需要分训练和推测两个阶段来讨论。在训练时,网络输出的confidence,实际上是为了计算confidence损失,它减去训练时预测出来的bbox与gt_bbox的IOU,作为置信度误差。
  • 在预测时,不需要通过计算得到confidence,直接把网路预测的confidence拿来用即可。

1.3 结果

对比:
在这里插入图片描述
发生错误的情况:
在这里插入图片描述

2.YOLO V2

1.改变了backbone
2.引入了Anchors锚点框这样一个技巧。在V1中对于预测框参数的预测范围比较大,不利于网络的收敛和训练,我们一开始给你几个待选的预测框,作为某种程度的标准,来辅助模型进行收敛。
在这里插入图片描述
引入了多个Anchors boxes,每个abox都带有自己的classes概率,也就使得每个abox都能对自己框内的物品进行分类。即使这几个abox的中心点都是同一个格子(位置)。
3.预测框的位置和大小输出采用bias和倍率的形式输出,而不是直接对预测框的实际位置数值进行预测。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值