参考

YOLO(You Only Look Once)算法详解

YOLO算法的原理与实现

一、介绍

YOLO算法把物体检测问题处理成回归问题,用一个卷积神经网络结构就可以从输入图像直接预测bounding box和类别概率。YOLO具有如下优点:(1)YOLO的运行速度非常快;(2)YOLO是基于图像的全局信息预测的,因此在误检测的错误率下降挺多;(3)泛化能力强,准确率高。

二、YOLO算法过程示意图

三、损失函数分析

Yolo算法采用的是均方差损失函数,但是对不同的部分采用了不同的权重值。因为很多grid cell是不包含物体的 (对应的confidence score为0),如果定位误差和分类误差的权重值一样,则不包含物体的单元格将会盖过包含物体的单元格对损失函数的影响,容易导致模型不稳定,训练发散。对于定位误差,即边界框坐标预测误差,采用较大的权重\(λ_coord=5\)(误差越大,则促使边界框的定位更精确)。然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值\(λ_noobj=0.5\)(不包含目标时,对应的box bounding对结果的影响较小,因此给与小的权重),其它权重值均设为1。

均方误差同等对待大小不同的边界框,但是实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感。因此将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为(x,y,w−−√,h−−√)(x,y,w,h)。

另外由于每个单元格预测多个边界框。但是其对应类别只有一个。那么在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模型性能。如果一个单元格内存在多个目标怎么办,其实这时候Yolo算法就只能选择其中一个来训练,这也是Yolo算法的缺点之一。

其中第一项是边界框中心坐标的误差项,1objij1ijobj指的是第ii个单元格存在目标,且该单元格中的第jj个边界框负责预测该目标。第二项是边界框的高与宽的误差项。第三项是包含目标的边界框的置信度误差项。第四项是不包含目标的边界框的置信度误差项。而最后一项是包含目标的单元格的分类误差项,1obji1iobj指的是第ii个单元格存在目标。

四、相关知识点

1、intersection-over-union ( IOU )

在目标检测的评价体系中,有一个参数叫做 IoU ,简单来讲就是模型产生的目标窗口和原来标记窗口的交叠率。具体我们可以简单的理解为: 即检测结果(DetectionResult)与 Ground Truth 的交集比上它们的并集,即为检测的准确率 IoU :
\[
IOU = \frac{DetectionResult\cap GroundTruth}{DetectionResult\cup GroundTruth}
\]

2、极大值抑制算法(non maximum suppression, NMS)

NMS算法主要解决的是一个目标被多次检测的问题,如下图中人脸检测,可以看到人脸被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框,比如对于美女,只想要红色那个检测结果。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该剩余框剔除;然后对剩余的未处理检测框重复上述过程,直到处理完所有的检测框。

2、均值平均精度(mAP)

参考

什么是MAP? 理解目标检测模型中的性能评估

步骤1

在模型对图像进行检测之后,我们可以得到一堆检测框,并利用IoU值是否大于0.5来区分正确或错误的检测。

公式为:给定一张图像,类别C的Precision = 图像的正确预测(True Positives)的数量 / 在图像上这一类的总的目标数量。

步骤2

对于给定的类C,我们能够为验证集中的每张图像计算此值。 假设我们在验证集中有100个图像,并且我们知道每个图像都有其中的所有类,则可以得到100个该类C的的精度值,取平均值后,即为该类的平均精度。

公式为:类C的平均精度= 在验证集上所有图像对于类C的精度值的和 / 有类C这个目标的所有图像的数量。

步骤3

假设整个集合拥有20各个类,分别计算这20个类平均精度,最后再对这20个平均精度取平均之后,即得到均值平均精度(mAP)。

要点

  • MAP总是在固定数据集上计算。
  • 它不作为量化模型输出的绝对度量,但它是一个相当好的相对度量。当我们在流行的公共数据集上计算这个度量时,这个度量可以很容易地用来比较不同目标检测方法。
  • 根据训练数据中类的分布情况,平均精确度值可能会因某些类别(具有良好的训练数据)而非常高(对于具有较少/较差数据的类别)而言非常低。所以你的MAP可能是适中的,但是你的模型可能对某些类非常好,对某些类非常不好。因此,建议在分析模型结果的同时查看各个类的平均精度。这些值也可以作为我们是不是需要添加更多训练样本的一个依据。

五、疑问

  1. Yolo算法将目标检测看成回归问题 ?(待理解)

    YOLO之前的物体检测系统使用分类器来完成物体检测任务。为了检测一个物体,这些物体检测系统要在一张测试图的不同位置和不同尺寸的bounding box上使用该物体的分类器去评估是否有该物体。如DPM系统,要使用一个滑窗(sliding window)在整张图像上均匀滑动,用分类器评估是否有物体。

    在DPM之后提出的其他方法,如R-CNN方法使用region proposal来生成整张图像中可能包含待检测物体的potential bounding boxes,然后用分类器来评估这些boxes,接着通过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢,而且因为这些环节都是分开训练的,检测性能很难进行优化。

    作者设计了YOLO(you only look once),将物体检测任务当做回归问题(regression problem)来处理,直接通过整张图片的所有像素得到bounding box的坐标、box中包含物体的置信度和class probabilities。通过YOLO,每张图像只需要看一眼就能得出图像中都有哪些物体和这些物体的位置。

  2. Anchor box的形状是固定的吗?还是从训练中学习到的?box的边界可以超过cell的边界吗?可以的话,在训练中是如何实现的?(可能有误)

    形状不是固定的。在训练数据中,包含了每一个物体所对应的边框信息和类别,训练时模型可以学习到这些边框信息,从而在预测的时候,自动某一物体进行标注。

    box的边界可以超过cell的边界。当某一物体的中心点落在某一个cell中时,该cell就专门负责该物体的检测,即使该物体仍有其他部分位于其他cell中,其他cell也不能负责该物体的检测。

    【个人理解】cell的边界以及数量与box的边界无关,当cell的粒度变小时,YOLO模型能够更好得对小目标进行检测,但同时也会造成更大的耗时和计算量;反之亦然。

  3. 在YOLO中,Anchor box的信息是事先设定的吗?还有是每个位置都拥有系列相同尺度和大小的anchor box?

    主要的疑问是,如果YOLO没有实现设定Anchor box信息,那么在训练初始时,网络的输出中,box的4个值会变成奇形怪状的,基本上构不成一个矩形。(这种情况下,训练的收敛程度和快慢是否会受到影响?)

    另外,如果YOLO的每个cell有用到事先设定好的Anchor box信息,那么不就和YOLO9000的方法一样吗?那么YOLO9000在这个方面相比于YOLO不就没有了什么改进?

  4. 为什么YOLO的localization error和recall变现比较差?

    因为YOLO将图像分为k * k的格子,而格子的划分较为粗糙(以及bounding boxes的scale和aspect ratio),导致出现了较多的定位误差。
    另外,由于每个cell只负责一个目标的预测,当同一个cell里出现多个物体(小目标)时,这些物体就不能够被检测到。这也就造成了recall率(查全率)的低下。

YOLO(You Only Look Once)的更多相关文章

  1. 论文 | YOLO(You Only Look Once)目标检测

    论文:You Only Look Once: Unified, Real-Time Object Detection 原文链接:https://arxiv.org/abs/1506.02640 背景介 ...

  2. 非极大值抑制(Non-Maximum Suppression,NMS)

    概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...

  3. SSD(single shot multibox detector)

    SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速 ...

  4. 项目总结三:目标检测项目(Car detection with YOLOv2)

    1. the YOLO model (YOLO ,you only look once) (1)We will use 5 anchor boxes. So you can think of the ...

  5. SSD(single shot multibox detector)算法及Caffe代码详解[转]

    转自:AI之路 这篇博客主要介绍SSD算法,该算法是最近一年比较优秀的object detection算法,主要特点在于采用了特征融合. 论文:SSD single shot multibox det ...

  6. 四、YOLO-V1原理与实现(you only look once)

    可以看成图像分类与定位的结合,给定一张图片,目标检测系统要能够识别出图片的目标并给出其位置,由于图片中目标数是不定的,且要给出目标的精确位置,目标检测相比分类任务更复杂.目标检测的一个实际应用场景就是 ...

  7. 五、SSD原理(Single Shot MultiBox Detector)

    主流的算法主要分为两个类型: (1)tow-stage R-CNN系列算法,其主要思路是先通过启发式方法(selective search)或者CNN网络(RPN)产生一些列稀疏的候选框,然后对这些候 ...

  8. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  9. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

随机推荐

  1. CentOS7.5搭建Flask环境python3.6+mysql+redis+virtualenv

    wget安装环境装备 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncur ...

  2. Vue入门2

    欢迎转载,转载请注明出处. 前言 学习本系列Vue知识,需要结合本系列的一些demo.你可以查看我的 Github 或者直接下载 ZIP包 . 建议学习本系列之前已经会一个其他的前端框架,了解计算属性 ...

  3. easyui combotree combobox 使用例子

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  4. iOS VideoToolBox decoder解码失败(-12909和-12911)问题解决

    对于任何H.264解码器而言,都要将SPS和PPS信息传递给解码器.FFmpeg内部做了设置,所以没有显示设置.但是对于硬件解码器来讲,开发者必须手动设置.另外,使用FFmpeg解码出来的视频帧是以Y ...

  5. MVC 拦截指定的action

    有时,我们需要在特定的一些aciton中做校验.比如:验证是否登录.实现方式有两种: 一.编写一个公共的方法专门用于实现是否登录的验证,然后在每个需要进行验证的aciton的头部去调用该方法,根据方法 ...

  6. OutputFormat输出过程的学习

    花了大约1周的时间,最终把MapReduce的5大阶段的源代码学习结束掉了.收获不少.就算本人对Hadoop学习的一个里程碑式的纪念吧.今天花了一点点的时间,把MapReduce的最后一个阶段.输出O ...

  7. 大数据入门第十六天——流式计算之storm详解(三)集群相关进阶

    一.集群提交任务流程分析 1.集群提交操作 参考:https://www.jianshu.com/p/6783f1ec2da0 2.任务分配与启动流程 参考:https://www.cnblogs.c ...

  8. linux下通过软连接实现访问项目路径外面的资源

            在javaweb项目开发中,图片上传是个比较常见的场景.一般都是在项目路径下建个文件夹,然后上传到该文件夹下:这样这个图片就可以和静态资源一样被直接访问.这样的好处就是访问这图片特别方 ...

  9. uboot启动过程理解

    对于2440而言,启动的方式不多.一般就是外界一个NAND FLASH ,2440内部有个NAND FLASH Controller,会自动把NAND FLASH的前4K拷贝到2440的片内SRAM. ...

  10. Ubuntu16.04LTS +Qt+boost1.66编译错误:consuming_buffers.hpp: parse error in template argument list

    升级gcc版本至 6 以上.. 安装gcc-6系列与安装boost (Ubuntu16.04LTS)