zoukankan      html  css  js  c++  java
  • YOLOV1原理、优点及不足

    物体检测的两个步骤可以概括为:

    (1)检测目标位置(生成矩形框)

    (2)对目标物体进行分类

    物体检测的主流算法框架大致分为one-stage与two-stage。two-stage算法代表的有R-CNN系列,one-stage算法代表的有YOLO系列。按笔者理解,two-stage算法将步骤一与步骤二分开执行,输入图像先经过候选框生成网络(例如faster rcnn中的RPN网络),再经过分类网络; one-stage算法将步骤一与步骤二同时执行,输入图像只经过一个网络,生成的结果中同时包含位置与类别信息。two-stage与one-stage相比,精度高,但是计算量更大,所以运算较慢。

    YOLO特点

    (1)YOLO很快,因为用回归的方法,并且不用复杂的框架。

    (2)YOLO会基于整张图片信息进行预测,而其他滑窗式的检测框架,只能基于局部图片信息进行推理。

    (3)YOLO学到的图片特征更为通用。

    YOLOV1算法原理

    网络结构:输入图像大小为448×448,经过若干个卷积层与池化层,变为7×7×1024张量,最后经过两层全连接层,输出张量维度为7×7×30,这就是YOLOV1的整个神经网络结构,和一般的卷积物体分类网络没有太多的区别,最大的不同就是:分类网络最后的全连接层,一般连接一个一维向量,向量的不同位代表不同的类别。YOLO的backbone网络结构,受启发于googleNet,也是V2、V3中darknet的先锋。本质上没有什么特别,没有使用BN层,用了一层Dropout。除了最后一层的输出使用了线性激活函数,其他层全部使用Leaky ReLU激活函数。

    网络输出张量维度

    (1)7×7的含义:7×7是指图片被分成7×7个格子,在YOLO中,如果一个物体的中心点落在了某个格子中,那么这个格子将负责预测这个物体。这个设定就好比该网络在一开始就将整个图片上的预测任务进行了分工,一共设定7×7个按照方阵列队的检测人员,每个人员负责检测一个物体,大家的分工界限就是看被检测物体的中心落在谁的格子里。当然,是7×7还是9×9,可以自己修改,精度和性能会随之有些变化。

    (2)30的含义

    在YOLOV1论文中,30是由(4+1)×2+20得到的。其中(4+1)是矩形框的中心点坐标x,y,长宽w,h以及是否属于备件测物体的置信度c; 2是一个格子共回归两个矩形框,每个矩形框分别产生5个预测值(x,y,w,h,c);20代表预测20个类别。

    这里有几点需要注意:(1)每个方格(grid)产生2个预测框,2也是参数,可以调,但是一旦设定为2以后,那么每个方格只产生两个矩形框,最后选定置信度更大的矩形框作为输出,也就是最终每个方格只输出一个预测矩形框。(2)每个方格只能预测一个物体。虽然可以通过调整参数,产生不同的矩形框,但这只能提高矩形框的精度。所以当有很多物体的中心点落在了同一个格子里,该格子只能预测一个物体。也就是格子数为7×7时,该网络最多预测49个物体。

    如上所述,在强行施加了格点限制以后,每个格点只能输出一个预测结果,所以该算法最大的不足,就是对一些临近的小物体的识别效果不是太好,例如成群结队的小鸟。

    LOSS函数

    看到这里读者或许会有疑问,YOLO里的每个格点,是怎么知道该预测哪个物体的?这就是神经网络算法的能力。首先拿到一批标注好的图片数据集,按照规则打好标签,之后让神经网络去拟合训练数据集。训练数据集中的标签是通过人工标注获得,当神经网络对数据集拟合的足够好时,那么就相当于神经网络具备了一定的和人一样的识别能力。

    神经网络结构确定之后,训练效果好坏,由Loss函数和优化器约定。YOLOV1使用普通的梯度下降法作为优化器。

    注意点:预测框的宽高(w,h),这里对(w, h)在损失函数中的处理分别取根号,原因在于如果不取根号,损失函数往往更倾向于调整尺寸比较大的预测框。

    一些技巧:

    (1)回归offset代替直接回归坐标

    (x,y)不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的位移值。

    bounding box的预测包括xywh四个值。xy表示bounding box的中心相对于cell左上角坐标偏移,宽高则是相对于整张图片的宽高进行归一化的。

    xywh为什么要这么表示呢?实际上经过这么表示之后,xywh都归一化了,它们的值都是在0-1之间。我们通常做回归问题的时候都会将输出进行归一化,否则可能导致各个输出维度的取值范围差别很大,进而导致训练的时候,网络更关注数值大的维度。因为数值大的维度,算loss相应会比较大,为了让这个loss减小,那么网络就会尽量学习让这个维度loss变小,最终导致区别对待。

    (2)同一个点的不同预测框有不同作用

    在损失函数的计算中,只对和真实物体最接近的框计算损失,其余框不进行修正。这样操作之后,作者发现,一个格点的两个框在尺寸、长宽比、或者某些类别上逐渐有所分工,总体的召回率有所提升。

    (3)使用非极大值抑制生成预测框

    通常来说,在预测的时候,格点与格点并不会冲突,但是在预测一些大物体或者邻近物体时,会有多个格点预测同一个物体。此时采用非极大值抑制技巧,过滤掉一些重叠的矩形框。但是mAP并没有显著提升。

    (4)推理时将p*c作为输出置信度

    在推理时,使用物体的类别预测最大值p乘以预测框的最大值C,作为输出预测物体的置信度。这样可以过滤掉一些大部分重叠的矩形框。输出检测物体的置信度,同时考虑了矩形框与类别,满足阈值的输出更加可信。

    YOLOV1同其他算法比较

    backbone同为VGG-16,YOLO比Faster R-CNN少了将近7个点mAP,但是速度变为三倍,Fast Yolo和Yolo相比,少11点mAP,但是速度可以达到155张图片每秒。后续的yolov3中,准确率和速度综合再一次提升,所以V1的性能不能再过多分析。

  • 相关阅读:
    正则表达式
    网络编程
    多线程
    IO—Data
    IO-对象流
    IO-转换流
    异常
    常用类——File——Random——Math——枚举
    每月博客-20180310
    每月博客-20180204
  • 原文地址:https://www.cnblogs.com/zhibei/p/12368996.html
Copyright © 2011-2022 走看看