YOLO V1论文解读

一、背景

    两阶段目标检测流程繁琐,不易掌控,且速度慢,无法满足需要高度实时性的检测任务,如车道线检测,视频监控等。

 

二、特点

  1.  非常快。基础版本每秒处理45帧,快速版本可处理150帧。
  2.  基于全局上下文编码图像。给模型提供了更大的上下文信息,视野更开阔了,减少了对背景的误判数量。
  3.  泛化性更强。这使得yolo在不同领域、不同输入下能保持较高的精确度。

 

三、大一统的检测框架

    YOLO将目标检测过程进行了极大的简化,训练过程不再需要候选区域,仅通过训练一个卷积网络便完成模型的构建,测试时输入图片,直接输出图片中含有对象的目标框以及所属类别,实现了端到端的快速检测。

    在YOLO中,图片被分成  S\times S 个格子,原文是 7\times 7,如下图所示。

图 1、YOLO图片划分

 

    如图,狗、自行车、轿车的标注框已给出,每个物体的中心点必然落在某个格子内部,由物体中心点所在的格子负责检测该物体,也就是一个格子负责检测一个物体。如图,红格子负责检测狗,蓝格子和黄格子分别负责检测自行车和轿车。另外,格子包含物体与否,要看物体的中心点是否落在格子内,如果落在格子内,则表示格子包含物体,否则格子不包含物体。

    每个格子负责预测输出 B 个边界框,每个边界框的构成是  \left ( x,y,w,h,confidence \right ),分别表示边界框的中心点坐标、宽度、高度以及置信度, (x,y)  是相对于格子左上角坐标的偏移,并且单位是相对于格子的大小,而 (w,h) 是相对于整个图片的宽与高的比例,这样4个元素的大小都在[0,1]范围内。

    重点说下置信度。如果格子不包含物体,期望模型输出的边界框置信度是0,如果格子包含物体,期望模型输出的边界框置信度等于边界框实际的置信度 IOU^{truth}_{pred} (格子包含的物体的真实标注框与格子预测输出的边界框的交并比),说白了,模型给出的分数要和实际计算的分数一致才行。

    每个格子还负责预测输出 C 个类条件概率 \textup{Pr}\left ( \textup{Class}_i|\textup{Object} \right ),表示如果格子包含物体且包含的物体属于 \textup{Class}_i 的概率,总共有 C 个类别。注意:无论每个格子预测输出多少个边界框,每个格子仅预测输出 C 个类条件概率值。

在测试阶段,每个边界框会根据其对应格子输出的  C 个概率计算属于每个类的得分,即 \textup{Pr}(Class_i)\ast confidence\textup{Pr}(Class_i) 是 C 个概率之一,这样每个边界框都会得到一个 1\times C 的得分向量,图2给出了得分向量的计算过程。

图 2、边界框得分计算过程

 

    整个图输出98个1\times C的得分向量(论文是 1\times 20),如下图所示。

图 3、图片的所有边界框得分向量

 

    模型最终的输出维度是 : 7\times 7\times (B\times 5+C)

 

四、NMS过程

    引用自:YOLO系列算法详解

    在测试阶段,每副图片输出98个边界框的得分向量,为了得到最可靠的边界框,YOLO使用了NMS,图4-6给出了详细流程。

图 4、根据边界框得分对边界框进行类别标注

 

    NMS的第一步是对每个边界框进行标注,因为每个边界框的得分向量中必定存在一个最大值,对应了其内部最有可能的物体类别,标注完成后,进入NMS过程。 

 

图 5、特定类别的NMS过程

 

图 6、特定类别的NMS过程

 

     如图5-6,对于图4中标注为狗的边界框集合中,将得分小于0.2的置0,再按照得分从高到低排序,然后使用NMS。NMS: 针对某个类别,例如狗这个类别,选择得分最高的边界框,然后计算它与其他边界框的IOU,如果IOU大于0.5,则说明重复率较大,将对应的边界框得分设置为0,否则不做处理,重复完之后,然后从未处理的边界框中选取一个得分最高的,重复上述步骤,直到没有边界框可以处理为止,这样便把所有可能包含狗并且得分较高的边界框过滤了出来。标注为其它类别的边界框的处理过程同上。

 

五、损失函数

    YOLO的损失函数定义比较繁琐,其大致形式采用了均方误差,这比较容易优化。损失由定位损失、置信度损失、分类损失构成。

定位损失:   

 L_{coord}=\lambda _{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}\left [ \left ( x_i-\hat{x_i} \right )^2+ \left ( y_i-\hat{y_i} \right )^2\right ]\ \ +\ \ \lambda _{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}\left [ \left ( \sqrt{w_i}-\sqrt{\hat{w_i}} \right )^2+ \left ( \sqrt{h_i}-\sqrt{\hat{h_i}} \right )^2\right ]

其中,开根号目的是均衡不同大小的预测边界框对坐标误差的敏感度,\lambda _{coord}=5 是权重,目的是增加坐标损失的权重,定位不准确要比分类不准确糟糕的多,连位置都把握不准,何谈分类准确性\mathbb{I}^{obj}_{ij} 表示第 i 个格子的第 j 个边界框负责检测中心点落在第  i 个格子的目标, 标准是第 i 个格子的第 j 个预测边界框与落在第 i 个格子的物体的真实标注框有最大的IOU值。前提是格子包含物体,对于图1,仅有三个格子包含物体的中心点,否则 \mathbb{I}^{obj}_{ij}=0

图 7、格子的预测边界框

如图7,红色框是狗的标注框,中心点所在的格子输出了两个边界框,很明显,左侧的边界框与标注框的IOU大于右侧边界框与标注框的IOU,因此,左侧的边界框负责检测狗。 

置信度(边界框得分)的损失:

 L_{IOU}=\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}\left( C_i-\hat{C_i} \right )^2\ +\ \lambda _{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{noobj}_{ij}\left( C_i-\hat{C_i} \right )^2

分为包含物体的格子对应的损失项(左侧)和不包含物体的格子对应的损失项(右侧),对右侧损失项施加了权重0.5,因为不包含物体的格子远多于包含对象的格子,如果同等对待,右侧的损失项会主导BP过程,造成学习不稳定。对于包含物体的格子,期望预测输出的置信度 \hat{C}_i 与实际的置信度 C_i=IOU^{truth}_{pred} 越接近越好,对于不包含物体的格子,期望预测输出的置信度 \hat{C}_i 等于0。

分类损失:

\sum_{i=0}^{S^2}\mathbb{I}^{obj}_{i}\sum_{c\in\textup{Classes}}^{}\left ( p_i(c)-\hat{p}_i(c) \right )^2

其中,\mathbb{I}^{obj}_i 表示第 i 个格子是否包含物体,包含物体为1,反之为0。如果包含物体,且格子的标注one-hot向量和预测得分向量距离很接近,则损失较小,反之损失较大。

 

六、优缺点

    引用自:yolo算法详解

优点:YOlO采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以YOLO算法比较简洁且速度快。第二点由于是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。另外,YOLO的泛化能力强,在做迁移时,模型鲁棒性高。

缺点:YOLO各个单元格仅仅预测两个边界框,而且属于一个类别。对于小物体,YOLO的表现会不如人意。这方面的改进可以看SSD,其采用多尺度单元格。也可以看Faster R-CNN,其采用了anchor boxes。YOLO对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。当然YOLO的定位不准确也是很大的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值