YOLOv1 论文笔记

论文地址:You Only Look Once: Unified, Real-Time Object Detection
前记: 在YOLO之前,绝大部分目标检测算法都是采用分类的思想进行的,比较具有代表性的如DPM算法,通常都是在图像上采用滑窗的方法,然后对每一个小窗口进行分类,最后就完成整张图像的目标检测,将检测问题转化为分类问题是这一类方法的主要思想,但是这一类方法存在一个巨大的弊端,由于你无法确定目标的大小,因此,在做使用滑窗算法的时候必须选用不同大小比例的窗口进行滑动,以确保不会存在漏检,这就导致会有很多并不包含目标的子区域,这些大量子区域通过分类器进行预测无疑需要很大的计算量,R-CNN为了避免这一问题采用了selective search的方法来尽可能找到包含目标的子区域,尽管效率有所提升,但是整个过程还是非常耗时的。
YOLO则转变思想,将检测问题当作一个回归问题来解决,只需要单一的一个网络便能预测出目标的类别以及位置,属于one-stage类算法,前面文章SSD也属于这一类算法,正因为如此,YOLO可以实现end-to-end的预测,达到实时的检测目标, 一个简单的检测流程如下图:
在这里插入图片描述
YOLO的优势:

  1. YOLO检测速度非常快,在TITAN X GPU上能达到45帧每秒,实现了实时的检测,fast yolo能达到150帧每秒,相对于其它实时检测算法而言,yolo的精度是其它算法平均水平的两倍
  2. YOLO在预测的时候看到的是图像的全局信息,不同于sliding window 和region proposal方法只能看到局部信息,相对于Fast R-CNN Yolo 有着更低的背景误检率(将背景检测为目标)
  3. YOLO学习了目标的generalizable representations, 即泛化能力更强

统一检测:

  1. YOLO将输入图像分为S X S个单元网格, 如果目标的中心落入到某一个单元网格中,那么该网格就负责预测该目标
  2. 每一个单元网格预测B个bounding box(注意:yolov1是没有先验框的), 每一个bounding box 预测一个置信度和四个坐标值(x, y, w, h),置信度表明该box 包含目标的可能性,置信度的计算 方法定义为: P r ( o b j e c t ) ∗ I O U p r e d t r u t h Pr(object) * IOU^{truth}_{pred} Pr(object)IOUpredtruth如果该box不包含目标时 P r ( o b j e c t ) Pr(object) Pr(object)为0, 则confidence为0, 如果包含目标 P r ( o b j e c t ) Pr(object) Pr(object)为1, 则confidence为该box与ground truth的IOU值(注意置信度不能简单理解为该box是否包含目标的概率,而是该box与grounding truth的位置准确度), (x,y)坐标表示bounding box相对于单元网格的中心值, 即相对于单元网格的偏移量, 取值范围在(0, 1)。宽度和高度是相对于整张图像预测的, 即bounding box 的宽度和高度除以图像的宽度和高度
  3. 每一个单元网格预测C个条件类别概率, 当然,前提时该网格包含目标, 注意YOLOV1不是以bounding box为单位预测类别概率, 最终bounding box 预测类别概率等于网格类别概率乘以该网格中bouding box的confidence
    在这里插入图片描述
  4. 文章中S=7, B=2, VOC类别C=20, 所以最终输出为 7 ∗ 7 ∗ ( 2 ∗ 5 + 20 ) 7*7*(2*5+20) 77(25+20)的矩阵
    在这里插入图片描述
    网络设计:
    Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如下图所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数: max(x, 0.1x) ,最后一层采用线性激活函数。
    在这里插入图片描述
    对于最后输出全连接层的理解:
    可以看到网络的最后输出为 $7x 7x 30 $大小的张量。这个张量所代表的具体含义为:7 x 7为单元格 的数量, 对于每一个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的 (x, y,w,h) ,之所以把置信度 c 和 (x, y,w,h) 都分开排列,而不是按照 (x, y,w,h,c) 这样排列,其实纯粹是为了计算方便,因为实际上这30个元素都是对应一个单元格,其排列是可以任意的。

训练:
网络结构
先是使用前20个卷积层加上一个平均池化层和一个全连接层在Image Net1000上进行预训练,然后这20个卷积层加上随机初始化的4个卷积层和两个全连接层进行目标检测训练, 并且将输入图像的分辨率从224 x 224提高到448 x 448
损失函数
在这里插入图片描述
以上 λ c o o r d \lambda _{coord} λcoord = 5, λ n o o b j \lambda _{noobj} λnoobj = 0.5, 是为了增加包含目标的bounding box 产生的坐标预测误差, 减少不包含目标的bounding box 产生的置信度误差,因为大不部分box是不包含目标的。 1 i o b j 1^{obj}_i 1iobj表示目标是否出现在网格单元 i i i中, 1 i j o b j 1^{obj}_{ij} 1ijobj表示网格单元 i i i中的第 j j j个bounding box负责预测该目标。
损失函数采用平方和误差的形式,主要分为两块儿:一是定位误差,前四行,第一二行为坐标误差,第二行之所以对w, h取根号,是因为大box产生的小偏差与小box产生的小偏差影响是不相同的,因此,就取根号加以权衡, 第三四行为bounding box 的置信度误差。这里特别说一下置信度的target值 C i C_i Ci, 如果是不存在目标,此时由于 P r ( o b j e c t ) = 0 Pr(object)=0 Pr(object)=0,那么 C i = 0 C_i=0 Ci=0 。如果存在目标, P r ( o b j e c t ) = 1 Pr(object)=1 Pr(object)=1 ,此时需要确定 IOU p r e d t r u t h \text{IOU}^{truth}_{pred} IOUpredtruth ,当然你希望最好的话,可以将IOU取1,这样 C i = 1 C_i=1 Ci=1 ,但是在YOLO实现中,使用了一个控制参数rescore(默认为1),当其为1时,IOU不是设置为1,而就是计算truth和pred之间的真实IOU。不过很多复现YOLO的项目还是取 C i = 1 C_i=1 Ci=1 ,这个差异应该不会太影响结果吧。二是分类误差,第五行为每一个包含目标单元产生的分类误差

测试:
输入一张图像,跑到网络的末端得到 7 ∗ 7 ∗ 30 7*7*30 7730的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。注意在预测的过程中要使用到NMS算法进行最终预测结果的筛选

算法性能对比:
在这里插入图片描述
可以看到YOLO在准确率不错的情况下达到了实时检测的效果

缺点:

  1. YOLO每个grid cell只负责预测一类目标,而且只能是两个bounding box中与ground truth 的IOU值最大的那个负责预测它,因此对于小物体以及密集的物体检测效果不好
  2. YOLO 有较大的定位误差

相关问题:

  1. 训练过程中的回归是如何进行的呢?
    基本的逻辑就是对坐标+iou误差、分类误差进行修正。
    在训练的时候,每个样本的ground truth的box是知道的,对应于相当于下采样后的的feature map,也能找到在feature map中对应的格子的位置。如果一个grid cell是该物体的中心位置,则这个grid cell负责预测这个物体;每个grid cell都预测了若干个box,其中会有一个box具有与ground truth的某个box有最大的iou,则由这个box负责调整box的位置(另外的预测的box就忽略了)。
    可以想象,一开始的时候,权重是随机的,面对抽象出来的图像的feature信息,其预测的box的信息、confidence的信息、物体类别的条件概率都是随机的,经过了loss函数进行惩罚与优化,使得预测行为越来越好。取极端情况为例子加深理解:总是用同一张图片做训练,每次得到的图像的feature map都是一样的。一开始的时候,权重随机,权重与某个grid cell的运算的结果是随机,即每个grid cell对应的5*b+C的数据是随机的。网络对此情况进行优化,指导权重向某个方向优化。第二次看到还是一样的feature map,新的权重与某个grid cell对应的数据进行计算,就会得到更好的box位置和confidence,物体类别的信息。如此反复进行,直到权重参数调整到这样的情况,面对同样的grid cell,其计算出来的box的信息完全与ground box的位置符合,confidence=1,正确类别的条件概率为1。

  2. 可以看到修正box的时候,是针对训练的时候,权重与训练图片中的feature map的相应部分进行运算来进行调整的,即:如果在实际应用中,有一个物体,其与训练的图片中的物体很像,那么可以进行好的预测,如果是以一个没有见过的角度去看,那么由于训练时没有对这个角度的feature进行计算与优化,就不会预测好,跟遇到一个类别之外的物体没差别。所以,增加训练的样本的多角度很有必要。
    同时一个grid cell虽然预测若干个box,但只会由那个与ground truth的任何box有最大交集的预测box来负责预测这个grid cell的情况,那么对于比较密集挨在一起物体的情况就会不能预测的现象出现:两只鸟靠的很近,它们的两个ground truth的box,都与某个grid cell有最大的iou,与其他的grid cell都没有相交,但因为这里有两只鸟,所以,这个gridcell预测的若干个box中,总会与两只鸟分别对应的两个ground truth的box的其中一个有更大的iou值,就会选到这个预测box,负责预测其中的一只鸟,对于另一只鸟,就会忽略。而由于鸟比较小,与其他的grid cell也没有相交,所以这另外的鸟就给忽略掉了,检测就会检测不出来。

参考:
https://zhuanlan.zhihu.com/p/32525231
https://blog.csdn.net/u014380165/article/details/72616238

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值