YOLO v1论文细节解读

其实我还是习惯于将论文的解读写在笔记本上(纸质),一直以来我都是忠爱于这种传统的学习方式,但是最近发现笔记本不够用了,想想确实还是写成博客的好。不过这个系列的解读旨在于把论文或者模型中的关键细节理解清楚,大概率不会完全从宏观角度去看模型,所以内容上肯定不会有其它博客全面,大家可以合在一起看。

YOLO v1

1. 一小段话总结YOLOv1

参照GoolgeNet与InceptionV1网络结构构建特征提取网络,通过该网络得到7*7*1024大小的特征图后,紧接一个4096神经元的全连接层(FC)以及另一个全连接层后得到7*7*30的网络输出,输出包含了预测出的20个物体类别的分类概率、2个bounding box的置信度以及坐标。

2. 网络输出7*7*30的由来

1)7*7

因为特征提取网络得到的特征图是7*7大小的,我们记每一个小个子为grid cell(网格),每一个grid cell对应预测两个bounding box,所以那输出的结果自然就会有7*7这个部分。

2)20个对象的分类概率

YOLO v1支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该grid cell位置上存在任一种对象的概率。写成条件概率的意思是,在grid cell存在对象的前提下,它是第i类的概率 

3) 2个bounding box的位置

位置有中心点坐标x,y以及box宽高h,w构成,记作(x,y,h,w)。

这里的坐标在论文和实际应用中,是针对

4)2个bounding box的置信度
置信度 = 当前bounding box存在object的概率 * 当前bounding box与真实box的IOU(交并比)

可以很仔细的看到,这个值只有在训练的时候才能够求得,bounding box存在object的概率在训练中由网络预测,但是只有在训练的时候才有Ground truth,才能求得IOU,因此发现训练样本的置信度这一个部分是经过上述乘法计算后得到的。

5)总结 20类+2*4(2个box的坐标)+2(2个box的置信度)= 30

3. 训练样本以及标签的制作

一个grid cell对应两个bounding box,首先我们要确定grid cell或者说是box对应的object具体类别。

如上图所示:自行车为例,黄色点是自行车这个object的中心点,那么这个黄色点对应的grid cell中20维分类向量中自行车类别部分=1,其他部分为0。

grid cell的类别向量已经说完了,现在进入grid cell对应的box中

先说label:首先模型为每个grid cell预测了两个box,标签制作的第一个问题就是如何判断哪个box负责这个grid cell里面的object,答案很简单,就是计算两个box和真实box的IOU,谁大,那么对应的置信度就等于1,另一个就等于0;坐标怎么办?直接把真实box的坐标放入即可;object的具体类别同理。

再说训练样本(这里主要是我自己的理解,不保证完全正确):主要的问题就在于置信度这个部分。

   这个是置信度的计算公式,IOU在训练过程中可以直接计算,那么按照论文的说法,其实网络在训练过程中预测出来的是公式的前半部分即box包含object的概率,然后乘上对应的IOU,这个结果放入训练标签中的置信度部分,因此出现了图中的0.7部分。

那这么做的目的是啥?我的理解是这样的,置信度公式代表了 box有目标而且位置准确的得分,在训练中可以计算出IOU和预测的值相乘作为置信度,但是预测的时候是没有ground truth的,也就是无法计算IOU,是直接将网络预测出来的结果作为box的置信度。如果这个时候,模型告诉我们,其实在训练的时候置信度是包含了box含有目标的概率以及位置是否准确的IOU得分并且模型是基于这个置信度得分与真实标签求损失求梯度,那么我们有理由相信,模型训练完,预测出来的置信度其实可以隐含的看作是有两个部分构成的,虽然它体现出来的仅仅是一个值。(有点绕。。能够懂我的意思,看缘分吧。。)

4. 细节讨论

1)YOLO有一个responsible的说法,意思就是一个grid cell负责一个object,那么一张图像的特征图7*7大小,就是49个grid cell最多能够表示49个对象。具体点就是object的中心点在哪个cell,哪个cell的具体类别部分就是1。具体看上3.。

2)一个grid cell 模型会预测两个bounding box,但是只有一个box是负责这个grid cell里面的对象的,具体可以看上3,生成样本标签的时候很明显标签中一个box的置信度是1,另一个就是0。

3)YOLO的bounding box 不是 Faster RCNN的Anchor

这是很重要的一个点,Faster RCNN等一些算法采用每个grid中手工设置n个Anchor(先验框,预先设置好位置的bounding box)的设计,每个Anchor有不同的大小和宽高比。YOLO的bounding box看起来很像一个grid中2个Anchor,但它们不是。YOLO并没有预先设置2个bounding box的大小和形状,也没有对每个bounding box分别输出一个对象的预测。它的意思仅仅是对一个对象预测出2个bounding box,选择预测得相对比较准的那个。

4)关于box的坐标问题

直接预测box的中心店和宽高是非常难计算的,但是box属于哪个grid cell 是已知的,因此YOLO采取预测相对于当前grid cell左上角坐标的offset,宽和高也是相对于特征图大小的值,因此x,y,w,h都是[0,1]之间的值。

5)损失函数

表示第i个grid cell有对象

表示第i个grid cell的第j个box有对象

表示第i个grid cell的第j个box无对象,看到这里还记得我在3中训练样本制作的那个部分的猜测吗,不负责object的box真实标签置信度为0,那么既然要求损失,训练样本中的没有object的box的置信度部分必然有值(至少不全为0),因此我猜测无object的box的置信度 = 网络预测有无object的概率 * IOU。这部分的目的在于使得不存在对象的bounding box应该老老实实的说"我这里没有对象",也就是输出尽量低的置信度。

5. 预测部分

在预测/推理部分是没有ground truth的,因此无法计算置信度中的IOU,所以这部分所有预测出来的bounding box都得到了保留,但是确实存在一些冗余或者错误的部分,YOLO V1使用NMS(Non-maximal suppression,非极大值抑制)算法进行筛选。

在NMS中,每个bounding box先计算一个score。

   

该公式表示  位于第j个bounding box的概率,因为IOU无法计算,因此这里的置信度直接取的网络预测值。

7*7=49个grid cell,每个grid cell包含2个bounding box,每个box对应20个类别概率就是20个得分,因此一共有49*2*20=1960个得分。

有了这个得分之后,针对每个类分别进行NMS筛选操作,对于每个类就有1960/20=98个得分。

NMS步骤如下:
1)设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)
2)遍历每一个对象类别
 2.1)遍历该对象的98个得分
  2.1.1)找到Score最大的那个对象及其bounding box,添加到输出列表
  2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU
  2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)
  2.1.4)如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象
3)输出列表即为预测的对象

参考

https://www.jianshu.com/p/cad68ca85e27

其余细节可以看看大佬们的其他博客。。这里就不复述了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值