zoukankan      html  css  js  c++  java
  • YOLOv1算法理解

    1,YOLOv1算法的简介

    YOLO算法使用深度神经网络进行对象的位置检测以及分类,主要的特点是速度够快,而且准确率也很高,采用直接预测目标对象的边界框的方法,将候选区和对象识别这两个阶段合二为一,

    与faster rcnn区分开来,是一刀流的检测方法。

    Yolo算法不再是窗口滑动了,而是直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图,基于上面的分析,可以认为特征图的每个元素也是对应原始图片的一个小

    方块,然后用每个元素来可以预测那些中心点在该小方格内的目标,这就是Yolo算法的朴素思想,

    最新的YOLOv3算法再以往的结构上做出了改进,增加了多尺度检测,以及更深的网络结构darknet53,这是比较主要的改进,还有某些细节上的变动。

    2,YOLOv1算法的原理

    实际操作如图所示,分为7*7个小格子,每个格子预测两个bounding box。

    如果一个目标的中心落入一个网格单元中,该网格单元负责检测 该目标。

    对每一个切割的小单元格预测(置信度,边界框的位置),每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y坐标,bounding box的宽度,高度)

    置信度定义为该区域内是否包含物体的概率,打标签的时候,正样本(与真实物体有最大IOU的边框设为正样本)置信度真值为1,负样本为0.

    还要得到分类的概率结果;20个分类每个类别的概率。

    7*7*30中的30=(20类概率+2*5(置信度,边框位置))

     2.1    YOLOv1的网络结构

    YOLO采用单个的卷积神经网络进行预测,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量 。   步骤如下:

    (1)将输入图像调整为448×448,(2)在图像 上运行单个卷积网络,以及(3)由模型的置信度对所得到的检测进行阈值处理

    首先,YOLO速度非常快。由于我们将检测视为回归问题,所以不需要复杂的流程。测试时在一张新图像 上简单的运行我们的神经网络来预测检测

    其次,YOLO在进行预测时,会对图像进行全面地推理。与基于滑动窗口和区域提出的技术不同,YOLO在训练期间和测试时会看到整个图像,所以它隐式地编码了

    关于类的上下文信息以及它们的外观。快速R-CNN是一种顶级的检测方法,但是它看不到更大的上下文信息,所以在图像中会将背景块误检为目标。与快速R-CNN相比,YOLO的背景误检数量少了一半

    然后,由于YOLO具有高度泛化能力,因此在应用于新领域或碰到意外的输入时不太可能出故障。

    所使用的卷积结构如图所示:受到GoogLeNet图像分类模型的启发。网络有24个卷积层,后面是2个全连接层,最后输出层用线性函数做激活函数,其它层激活函数都是Leaky ReLU。

    我们 只使用1*1降维层,后面是3*3卷积层,

    3, YOLOv1的损失函数和训练过程

    YOLO的损失函数定义如下:

    YOLO在ImageNet分类任务上以一半的分辨率(224*224的输入图像)预训练卷积层,然后将分辨 率加倍来进行检测。

    训练中采用了drop out和数据增强(data augmentation)来防止过拟合.

    4.    预测过程以及结果的处理

    直接把训练好的YOLO网络模型输入一张图片,得到一个7*7*30的结果向量,通过NMS(非极大值抑制)来选择最终的结果;

    NMS就是通过打分来选出最好的结果,与这个结果重叠的对象去掉,是一个不断迭代的过程。

                                                              score = 某个对象的概率 * 置信度

    所以对于每个网格有20*2个得分,每个对象有49*2个得分;这里的2是bounding box的个数;

    具体的过程是:

    1,设置一个分数阈值,低于的直接置为0;

    2,遍历对于每个对象:

             选出分数最高的那个及其bounding box放到输出列表中;

             将其他的与上面选出的分数最高的那个计算IOU,设置一个阈值,大于阈值的表示重叠度较高,把分数置为0;

             如果所有的bounding box都在输出列表中或者分数为0,那么这个对象的NMS就结束

         对接下来的对象执行此过程

    3.得出输出结果;

     4. YOLOv1的特点总结

    YOLO的一个贡献是将检测问题转化为了回归问题,相信这句话很多人见过很多次了。那到底是什么意思呢?指的就是之前faster RCNN是先分两步

    先提取region proposal,也就是判断是前景还是背景的问题,之后再分类,具体看前景是什么东西。而YOLO直接通过regression一次既产生坐标,又产生每种类别的概率。

    YOLO的特点在于快,其中一方面来源于regression机制,还有一个原因就在于region proposal的提取过程了。再YOLO中很少提region proposal的概念,

    但是为了类比faster RCNN我们可以这样理解,YOLO中粗暴地分成了7X7的网格,每个位置默认可能属于2个object,那么事实上就是提取了98个region proposal,

    而faster RCNN是一种滑动窗口机制,每个feature map上都回归出9个anchor,大约一共20k个anchor,在通过非极大值抑制等方法最终会得到300个region proposal。

    两者之间候选框差别巨大,因此,faster RCNN会准一点也是情理之中,而既然每个位置都要精修,当然效率就会低很多,也就不能满足实时性要求了。另外,YOLO

    精简了网络,比VGG要稍微计算量小一些,可能也会加快一些速度,但这些计算量比起前面提到的两点已经不足为道。

    YOLO对边界框预测强加空间约束,因为每个网格单元只预测两个盒子,只能有一个类别。这个空间约束限制了我 们的模型可以预测的邻近目标的数量。我们的模型与群组中出现的小物体(比如鸟群)进行斗争。

  • 相关阅读:
    Java创建多线程的方法
    Spring Cloud 学习笔记 来自csdn
    Java线程退出
    Java线程的中断与插入
    Java守护线程
    Linux安装jdk
    内部类
    枚举,包类型
    jenkins
    设计模式之装饰者模式
  • 原文地址:https://www.cnblogs.com/ywheunji/p/10808989.html
Copyright © 2011-2022 走看看