zoukankan      html  css  js  c++  java
  • AI大视觉(二) | Yolo v1 为何只要看一眼就够了?

     本文来自公众号“AI大道理”

    RCNN系列属于候选区域/窗 + 深度学习分类的两步走方法。

    即使是该系列最好的模型还是无法达到实时检测目标的效果,获取region proposal, 再对每个proposal分类计算量还是较大。

    灵魂的拷问:两步走无法再进一步了,那能否一步到位?

    YOLO,you only look once,就是一步到位的算法。

    它去掉了获得候选区域的这一步。

    那它是怎么去掉的呢?去掉后性能又会有怎么样的影响呢?

    ​YOLO v1的思想

    YOLO创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。

    只需一眼就能知道每张图像中有哪些物体以及物体的位置。

    (AI大视觉:RCNN是撒小渔网,YOLO V1是撒大渔网,一个和鱼塘一样大的渔网撒下去,看每个区域里有没有鱼)

    YOLO 把一张图片划分成了 SxS 个格子。

    S 取值为 7,所以整张图片被分割成 7*7=49 个格子(Cell)。

    这些 Cell 每个 Cell 都会预测 B 个 bbox。

    若 B 取值为 2则一张图片经 YOLO 跑一遍,就会产生 98 个 bbox。

    图片中有狗、自行车、汽车 3 个目标,但是预测到的 bbox 有 98 个之多,最终肯定只能从 98 个 bbox 中选择 3 个。

    在上面的图片中,1,2,3等这些 cell 不包含任何的目标,所以它们的 P r ( O b j ) Pr(Obj)Pr(Obj) 为0,所以 Confidence 也为 0。

    8 和 23 两个 cell 因为包含了自行车和狗的一部分,所以它们的 P r ( O b j ) Pr(Obj)Pr(Obj) 为 1,它们的 Confidence 实质上就是 bbox 和 groundtruth 的 IOU。

    另外怎么判断某个 cell 中有没有包含 Object 呢?

    这其实是通过 label 中的 groundtruth 在线算出来的。

    因此,一张图片经过 YOLO 跑一遍后,除了预测出 98 个 bbox,还会给出 49 个 cell 的 confidence。

    一个 Object 可能覆盖很多个 Cell,还需要从中选择一个 Cell,作为代表,这个 Cell 就负责(responsible)此 Object 的预测。

    Object 的中心落在哪个 cell,就决定了那个 cell 的核心地位。

    灵魂的拷问:YOLO V1真的去掉候选区域了吗?

    YOLO并没有真正去掉候选区,而是采用了预定义候选区的方法,也就是将图片划分为7*7个网格,每个网格允许预测出2个边框,总共49*2个bounding box,可以理解为98个候选区域,它们很粗略地覆盖了图片的整个区域。

    但这样所谓的候选区域是简单明了的给出来的,不是靠选择性搜索或者神经网络学习到的,所以不算单独的一步。

    可以说去掉了获得候选区域的算法和步骤,而没有去掉候选区域的思想。

    候选区域从2000个降低到98个,精度肯定会有所下降。

    ​YOLO  v1的网络结构

    YOLO v1 的模型结构受 GoogLeNet 启发。

    YOLO 采用了 1x1 和 3x3 的序列组合替代 Inception 模块。

    总共 24 个卷积层加上 2 个全连接层。

    输出层正是前面提到过的 7x7x30 的 tensor,用来预测最终的结果。

    7x7 对应图像分割成 49 个 cell。

    30 包含了 2 个 bbox 的数据,及 20 个 class 的概率。

    ​yolo v1 的损失函数

    (1)预训练。采用前20个卷积层、平均池化层、全连接层进行了大约一周的预训练;

    (2)输入。输入数据448*448大小的图像;

    (3)采用相对坐标。通过图像宽度和高度来规范边界框的宽度和高度,使它们落在0和1之间;边界框x和y坐标参数化为特定网格单元位置的偏移量,边界也在0和1之间;

    (4)损失函数

    训练中损失函数的分析,YOLO算法将目标检测看成回归问题,所以采用的是均方差损失函数,包括区分定位误差和分类误差。

     Loss 要计算:

    • 中心点的 Loss

    • 宽高的 Loss

    • 置信度的 Loss

    • 目标类别的 Loss

    其中:

    边界框的大小和位置用4个数值来表示,(x, y, w, h),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高。

    中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的。

    边界框的w和h预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在[0,1]范围。

    对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。

    而sum-square error loss中对同样的偏移loss是一样。

    为了缓和这个问题,将box的width和height取平方根代替原本的height和width。

    每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是置信度。

    如果有object的中心落在一个网格里面,*的前第一项取1,否则取0。第二项是预测的边界框和ground-truth之间的IoU值。

    IOU(交并比):

    IoU是两个区域重叠的部分除以两个区域的集合部分得出的结果,通过设定的阈值,与这个IoU计算结果比较。

    ​yolo v1 的训练

    YOLOv1在预训练时采用的是224*224的输入(在ImageNet数据集上进行),然后在检测的时候采用448*448的输入。

    在训练之前,先在ImageNet(用于图像分类的数据集合)上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。

    预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。

    由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。

    ​yolo v1 的预测

    训练好的YOLO网络,输入一张图片,将输出一个 7*7*30 的张量(tensor)来表示图片中所有网格包含的对象(概率)以及该对象可能的2个位置(bounding box)和可信程度(置信度)。

    对于每个预测框选取置信度最大的那个类别作为其预测标签,得到各个预测框的预测类别及对应的置信度值,其大小都是[7,7,2]。

    一般情况下,会设置信度阈值,就是将置信度小于该阈值的box过滤掉,剩余的是置信度比较高的预测框,对预测框使用NMS算法,最后留下来的就是检测结果。

    NMS是区分每个类别分别使用NMS。

    NMS方法并不复杂,其核心思想是:

    选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。

    NMS步骤如下:

    • 设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)

    • 遍历每一个对象类别

    • 遍历该对象的98个得分

    • 找到Score最大的那个对象及其bounding box,添加到输出列表

    • 对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU

    • 根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)

    • 如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象

    • 输出列表即为预测的对象



    ​总结

    YOLO V1检测物体速度非常快,其增强版GPU中能跑45fps(frame per second),简化版155fps。

    YOLO V1精度低于其它state-of-the-art的物体检测系统,容易产生定位错误。

    对小物体检测效果不好,尤其是密集的小物体,因为一个栅格只能检测一个物体。

    由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体处理上还有待加强。

    一个grid cell只能预测一个class,当一个grid cell中同时出现多个类时,就无法检测出所有类。

    基于这些问题,如何进行改进呢?

    YOLO V2给出了答案。

     

       

     ——————

    浅谈则止,细致入微AI大道理

    扫描下方“AI大道理”,选择“关注”公众号

    —————————————————————

    ​     

    —————————————————————

    投稿吧   | 留言吧

    萍水相逢逢萍水,浮萍之水水浮萍!
  • 相关阅读:
    expect
    grep
    Python函数
    Python的set
    Python字典
    Python循环
    Python条件判断
    Python列表
    Python字符串
    Python组织代码块的形式
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/14689142.html
Copyright © 2011-2022 走看看