目标检测 | yolov1 原理和介绍

打印 上一主题 下一主题

主题 542|帖子 542|积分 1626

1. 简介

论文链接:https://arxiv.org/abs/1506.02640
时间:2015年
作者:Joseph Redmon
代码参考:https://github.com/abeardear/pytorch-YOLO-v1
 yolo属于one-stage算法,仅仅使用一个CNN网络直接预测不同目标的类别与位置,提供end-to-end的预测,该类算法是速率快,但是准确性要低(two-stage,需要先使用启发式方法(selective search)大概CNN网络(RPN)产生Region Proposal[区域方案],然后再在Region Proposal上做分类与回归。相当于粗略检测,再细致检测)
 yolo算法很好的解决了滑动窗口这个问题,它不再是窗口滑动了,而是直接将原始图片分割成互不重合的小方块,然后通过卷积末了生产这样大小的特征图,基于上面的分析,可以以为特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标,这就是Yolo算法的质朴思想。
2. 设计理念

 Yolo算法采用一个单独的CNN模子实现end-to-end的目标检测,整个系统如图所示:起首将输入图片resize到                                   448                         ×                         448                              448\times 448                  448×448,然后送入CNN网络,末了处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个同一的框架,其速率更快,而且Yolo的练习过程也是end-to-end的

 详细来说,Yolo的CNN网络将输入的图片分割成                                    S                         ×                         S                              S\times S                  S×S 网格,然后每个单位格负责去检测那些中心点落在该格子内的目标,如图所示,可以看到狗这个目标的中心落在左下角一个单位格内,那么该单位格负责预测这个狗。每个单位格会预测 B 个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包罗两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为                                   P                         r                         (                         o                         b                         j                         e                         c                         t                         )                              Pr(object)                  Pr(object),当该边界框是配景时(即不包罗目标),此时                                    P                         r                         (                         o                         b                         j                         e                         c                         t                         )                         =                         0                              Pr(object)=0                  Pr(object)=0 。而当该边界框包罗目标时,                                   P                         r                         (                         o                         b                         j                         e                         c                         t                         )                         =                         1                              Pr(object)=1                  Pr(object)=1 。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为                                   I                         O                         U                              IOU                  IOU 。因此置信度可以定义为                                    P                         r                         (                         o                         b                         j                         e                         c                         t                         )                         ∗                         I                         O                         U                              Pr(object) * IOU                  Pr(object)∗IOU 。许多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用                                   4                              4                  4个值来表征:                                   (                         x                         ,                         y                         ,                         w                         ,                         h                         )                              (x,y,w,h)                  (x,y,w,h) ,其中                                   (                         x                         ,                         y                         )                              (x,y)                  (x,y) 是边界框的中心坐标,而                                    w                              w                  w 和                                    h                              h                  h 是边界框的宽与高。另有一点要留意,中心坐标的预测值                                    (                         x                         ,                         y                         )                              (x,y)                  (x,y) 是相对于每个单位格左上角坐标点的偏移值,而且单位是相对于单位格大小的,单位格的坐标定义如图所示。而边界框的                                    w                              w                  w 和                                    h                              h                  h 预测值是相对于整个图片的宽与高的比例,这样理论上                                   4                              4                  4个元素的大小应该在                                    [                         0                         ,                         1                         ]                              [0,1]                  [0,1] 范围。这样,每个边界框的预测值实际上包罗                                   5                              5                  5个元素:                                    (                         x                         ,                         y                         ,                         w                         ,                         h                         )                              (x,y,w,h)                  (x,y,w,h) ,其中前4个表征边界框的大小与位置,而末了一个值是置信度。

 另有分类问题,对于每一个单位格其还要给出预测出                                    C                              C                  C 个类别概率值,其表征的是由该单位格负责预测的边界框其目标属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即                                    P                         r                         (                         c                         l                         a                         s                         s                         i                         ∣                         o                         b                         j                         e                         c                         t                         )                              Pr(classi|object)                  Pr(classi∣object)。值得留意的是,不管一个单位格预测多少个边界框,其只预测一组类别概率值,这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的。同时,我们可以盘算出各个边界框类别置信度(class-specific confidence scores):
                                         Pr                            ⁡                                       (                                            class                                   i                                          ∣                               o                               b                               j                               e                               c                               t                               )                                      ∗                            Pr                            ⁡                            (                             object                             )                            ∗                                                   I                                  O                                  U                                          pred                                truth                                       =                            Pr                            ⁡                                       (                                            class                                   i                                          )                                      ∗                                                   I                                  O                                  U                                          pred                                truth                                             \operatorname{Pr}\left(\text { class }_i \mid o b j e c t\right) * \operatorname{Pr}(\text { object }) * \mathrm{IOU}_{\text {pred }}^{\text {truth }}=\operatorname{Pr}\left(\text { class }_i\right) * \mathrm{IOU}_{\text {pred }}^{\text {truth }}                     Pr( class i​∣object)∗Pr( object )∗IOUpred truth ​=Pr( class i​)∗IOUpred truth ​
边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的优劣。后面会说,一般会根据类别置信度来过滤网络的预测框。
 总结一下,每个单位格需要预测                                    (                         B                         ∗                         5                         +                         C                         )                              (B*5+C)                  (B∗5+C) 个值。假如将输入图片分别为                                    S                         ∗                         S                              S*S                  S∗S网格,那么最终预测值为                                    S                         ∗                         S                         ∗                         (                         B                         ∗                         5                         +                         C                         )                              S*S*(B*5+C)                  S∗S∗(B∗5+C) 大小的张量。整个模子的预测值结构如下图所示。对于PASCAL VOC数据,其共有                                   20                              20                  20个类别,假如使用                                    S                         =                         7                         ,                         B                         =                         2                              S=7,B=2                  S=7,B=2 ,那么最终的预测结果就是                                    7                         ×                         7                         ×                         30                              7 \times 7 \times 30                  7×7×30 大小的张量。在下面的网络结构中我们会详细报告每个单位格的预测值的分布位置。
3. 网络

 Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模子,包罗                                   24                              24                  24个卷积层和                                   2                              2                  2个全连接层,如图所示。对于卷积层,主要使用                                   1                         ×                         1                              1 \times 1                  1×1卷积来做channle reduction,然后紧跟                                   3                         ×                         3                              3 \times 3                  3×3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:                                   m                         a                         x                         (                         0.1                         x                         ,                         x                         )                              max(0.1x, x)                  max(0.1x,x)。但是末了一层却采用线性激活函数。

 可以看到网络的末了输出为                                    7                         ×                         7                         ×                         30                              7 \times 7 \times 30                  7×7×30 大小的张量。这和前面的讨论是一致的。这个张量所代表的详细寄义如图所示。对于每一个单位格,前                                   20                              20                  20个元素是类别概率值,然后                                   2                              2                  2个元素是边界框置信度,两者相乘可以得到类别置信度,末了                                   8                              8                  8个元素是边界框的                                    (                         x                         ,                         y                         ,                         w                         ,                         h                         )                              (x,y,w,h)                  (x,y,w,h) 。各人可能会感到奇怪,对于边界框为什么把置信度                                    c                              c                  c 和                                    (                         x                         ,                         y                         ,                         w                         ,                         h                         )                              (x,y,w,h)                  (x,y,w,h) 都分开排列,而不是按照                                    (                         x                         ,                         y                         ,                         w                         ,                         h                         ,                         c                         )                              (x,y,w,h,c)                  (x,y,w,h,c) 这样排列,其实纯粹是为了盘算方便,由于实际上这                                   30                              30                  30个元素都是对应一个单位格,其排列是可以恣意的。但是分离排布,可以方便地提取每一个部分。这里来解释一下,起首网络的预测值是一个二维张量                                    P                              P                  P ,其shape为                                    [                         b                         a                         t                         c                         h                         ,                         7                         ∗                         7                         ∗                         30                         ]                              [batch, 7*7*30]                  [batch,7∗7∗30] 。采用切片,那么                                    P                         [                         :                         ,                         0                         :                         7                         ∗                         7                         ∗                         20                         ]                              P[:,0:7*7* 20]                  P[:,0:7∗7∗20] 就是类别概率部分,而                                    P                         [                         :                         ,                         0                         :                         7                         ∗                         7                         ∗                         20                         :                         7                         ∗                         7                         ∗                         (                         20                         +                         2                         )                         ]                              P[:,0:7 * 7 * 20:7* 7 * (20+2)]                  P[:,0:7∗7∗20:7∗7∗(20+2)] 是置信度部分,末了剩余部分                                    P                         [                         :                         ,                         0                         :                         7                         ∗                         7                         ∗                         20                         :                         ]                              P[:,0:7*7*20:]                  P[:,0:7∗7∗20:] 是边界框的预测结果。这样,提取每个部分是非常方便的,这会方面后面的练习及预测时的盘算。
4. 练习

 在练习之前,先在ImageNet上进行了预练习,其预练习的分类模子采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预练习之后,在预练习得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,以是将网络的输入从                                   224                         ×                         224                              224\times224                  224×224增加到了                                   448                         ×                         448                              448\times448                  448×448。
 下面是练习丧失函数的分析,Yolo算法将目标检测看成回归问题,以是采用的是均方差丧失函数。但是对不同的部分采用了不同的权重值。起首区分定位偏差和分类偏差。对于定位偏差,即边界框坐标预测偏差,采用较大的权重                                              λ                            coord                                   =                         5                              \lambda_{\text {coord }}=5                  λcoord ​=5 。然后其区分不包罗目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值                                              λ                            noobj                                   =                         0.5                              \lambda_{\text {noobj }}=0.5                  λnoobj ​=0.5 。其它权重值均设为                                   1                              1                  1。然后采用均方偏差,其同等对待大小不同的边界框,但是实际上较小的边界框的坐标偏差应该要比力大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为                                    (                         x                         ,                         y                         ,                                   w                                  ,                                   h                                  )                              (x, y, \sqrt{w}, \sqrt{h})                  (x,y,w            ​,h            ​) 。
 另外一点时,由于每个单位格预测多个边界框。但是其对应类别只有一个。那么在练习时,假如该单位格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框以为不存在目标。这样设置的一个结果将会使一个单位格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模子性能。各人可能会想假如一个单位格内存在多个目标怎么办,其实这时间Yolo算法就只能选择其中一个来练习,这也是Yolo算法的缺点之一。要留意的一点时,对于不存在对应目标的边界框,其偏差项就是只有置信度,坐标项偏差是没法盘算的。而只有当一个单位格内确实存在目标时,才盘算分类偏差项,否则该项也是无法盘算的。
5. 丧失函数

综上讨论,最终的丧失函数盘算如下:

 其中第一项是边界框中心坐标的偏差项,                                              1                                       i                               j                                                 o                               b                               j                                                 1_{i j}^{o b j}                  1ijobj​ 指的是第                                    i                              i                  i 个单位格存在目标,且该单位格中的第                                    j                              j                  j 个边界框负责预测该目标,假如该矩形框负责预测一个目标则其大小为1,否则等于0。第二项是边界框的高与宽的偏差项。第三项是包罗目标的边界框的置信度偏差项。第四项是不包罗目标的边界框的置信度偏差项。而末了一项是包罗目标的单位格的分类偏差项,                                              1                            i                                       o                               b                               j                                                 1_{i }^{o b j}                  1iobj​ 指的是第                                    i                              i                  i 个单位格存在目标。这里特别说一下置信度的                                   t                         a                         r                         g                         e                         t                              target                  target值                                              C                            i                                       C_i                  Ci​ ,假如是不存在目标,此时由于                                   Pr                         ⁡                         (                              \operatorname{Pr}(                  Pr( object                                    )                         =                         0                              )=0                  )=0,那么                                              C                            i                                  =                         0                              C_i=0                  Ci​=0 。假如存在目标,                                    Pr                         ⁡                         (                              \operatorname{Pr}(                  Pr( object                                    )                         =                         1                              )=1                  )=1 ,此时需要确定                                                         I                               O                               U                                      pred                             truth                                        \mathrm{IOU}_{\text {pred }}^{\text {truth }}                  IOUpred truth ​ ,固然你希望最好的话,可以将IOU取                                   1                              1                  1,这样                                              C                            i                                  =                         1                              C_i=1                  Ci​=1 ,但是在YOLO实现中,使用了一个控制参数rescore(默以为1),当其为                                   1                              1                  1时,IOU不是设置为                                   1                              1                  1,而就是盘算truth和pred之间的真实IOU。不过许多复现YOLO的项目照旧取                                              C                            i                                  =                         0                              C_i=0                  Ci​=0 ,这个差别应该不会太影响结果吧。
6. 标签分配

YOLOv1的标签分配策略是,假如一个ground truth(真实框)的中心落在某个网格中,则该网格的两个预测框中与ground truth IOU最大的预测框被选为正样本,其余为负样本。这种设计使得每个网格单位最多只能预测一个目标,这限定了YOLOv1对麋集目标的检测本领
7. 预测

 下面就来分析Yolo的预测过程,这里我们不思量batch,以为只是预测一张输入图片。根据前面的分析,最终的网络输出是                                    7                         ×                         7                         ×                         30                              7\times7\times30                  7×7×30 ,但是我们可以将其分割成三个部分:类别概率部分为                                    [                         7                         ,                         7                         ,                         20                         ]                              [7,7,20]                  [7,7,20] ,置信度部分为                                    [                         7                         ,                         7                         ,                         2                         ]                              [7,7,2]                  [7,7,2] ,而边界框部分为                                    [                         7                         ,                         7                         ,                         2                         ,                         4                         ]                              [7,7,2,4]                  [7,7,2,4] (对于这部分不要忘记根据原始图片盘算出其真实值)。然后将前两项相乘(矩阵                                    [                         7                         ,                         7                         ,                         20                         ]                              [7,7,20]                  [7,7,20] 乘以                                    [                         7                         ,                         7                         ,                         2                         ]                              [7,7,2]                  [7,7,2] 可以各补一个维度来完成                                    [                         7                         ,                         7                         ,                         1                         ,                         20                         ]                         ×                         [                         7                         ,                         7                         ,                         2                         ,                         1                         ]                              [7,7,1,20] \times [7,7,2,1]                  [7,7,1,20]×[7,7,2,1] )可以得到类别置信度值为                                    [                         7                         ,                         7                         ,                         2                         ,                         20                         ]                              [7,7,2,20]                  [7,7,2,20] ,这里总共预测了                                    7                         ×                         7                         ×                         2                         =                         98                              7\times7\times2=98                  7×7×2=98 个边界框。
 所有的准备数据已经得到了,那么我们先说第一种策略来得到检测框的结果,我以为这是最正常与自然的处理。起首,对于每个预测框根据类别置信度选取置信度最大的那个类别作为其预测标签,颠末这层处理我们得到各个预测框的预测类别及对应的置信度值,其大小都是                                    [                         7                         ,                         7                         ,                         2                         ]                              [7,7,2]                  [7,7,2] 。一般环境下,会设置置信度阈值,就是将置信度小于该阈值的box过滤掉,以是颠末这层处理,剩余的是置信度比力高的预测框。末了再对这些预测框使用NMS算法,末了留下来的就是检测结果。一个值得留意的点是NMS是对所有预测框等量齐观,照旧区分每个类别,分别使用NMS。Ng在deeplearning.ai中讲应该区分每个类别分别使用NMS,但是看了许多实现,其实照旧同等对待所有的框,我觉得可能是不同类别的目标出如今雷同位置这种概率很低吧。
 上面的预测方法应该非常简朴明白,但是对于Yolo算法,其却采用了另外一个不同的处理思绪(至少从C源码看是这样的),其区别就是先使用                                   N                         M                         S                              NMS                  NMS,然后再确定各个box的类别。其基本过程如图所示。对于                                   98                              98                  98个boxes,起首将小于置信度阈值的值归                                   0                              0                  0,然后分类别地对置信度值采用                                   N                         M                         S                              NMS                  NMS,这里NMS处理结果不是剔除,而是将其置信度值归为                                   0                              0                  0。末了才是确定各个box的类别,当其置信度值不为0时才做出检测结果输出。这个策略不是很直接,但是貌似Yolo源码就是这样做的。Yolo论文里面说                                   N                         M                         S                              NMS                  NMS算法对Yolo的性能是影响很大的,以是可能这种策略对Yolo更好。但是我测试了平常的图片检测,两种策略结果是一样的。
8. 性能分析

 这里看一下Yolo算法在PASCAL VOC 2007数据集上的性能,这里Yolo与其它检测算法做了对比,包括DPM,R-CNN,Fast R-CNN以及Faster R-CNN。其对比结果如表所示。与实时性检测方法DPM对比,可以看到Yolo算法可以在较高的mAP上达到较快的检测速率,其中Fast Yolo算法比快速DPM还快,而且mAP是远高于DPM。但是相比Faster R-CNN,Yolo的mAP稍低,但是速率更快。以是。Yolo算法算是在速率与准确度上做了折中。

为了进一步分析Yolo算法,文章还做了偏差分析,将预测结果按照分类与定位准确性分成以下5类:


  • Correct:类别正确,IOU>0.5;(准确度)
  • Localization:类别正确,0.1 < IOU<0.5(定位禁绝);
  • Similar:类别相似,IOU>0.1;
  • Other:类别错误,IOU>0.1;
  • Background:对任何目标其IOU<0.1。(误把配景当物体)
    Yolo与Fast R-CNN的偏差对比分析如下图所示:

 可以看到,Yolo的Correct的是低于Fast R-CNN。另外Yolo的Localization偏差偏高,即定位不是很准确。但是Yolo的Background偏差很低,说明其对配景的误判率较低。Yolo的那篇文章中另有更多性能对比,感兴趣可以看看。
9. 优缺点

 如今来总结一下Yolo的优缺点。起首是长处,Yolo采用一个CNN网络来实现检测,是单管道策略,其练习与预测都是end-to-end,以是Yolo算法比力简洁且速率快。第二点由于Yolo是对整张图片做卷积,以是其在检测目标有更大的视野,它不容易对配景误判。其实我觉得全连接层也是对这个有贡献的,由于全连接起到了attention的作用。另外,Yolo的泛化本领强,在做迁徙时,模子鲁棒性高。
 末了不得不谈一下Yolo的缺点,起首Yolo各个单位格仅仅预测两个边界框,而且属于一个类别。对于小物体,Yolo的表现会不如人意。这方面的改进可以看SSD,其采用多尺度单位格。也可以看Faster R-CNN,其采用了anchor boxes。Yolo对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。固然Yolo的定位禁绝确也是很大的问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表