当前位置:   article > 正文

YOLO(You Only Look Once)--只需瞄一眼_yolo(you only look once)是端到端的,作为单阶段的目标检测算法,因 其精度高,

yolo(you only look once)是端到端的,作为单阶段的目标检测算法,因 其精度高,速度

本文主要参考:http://blog.csdn.net/u011534057/article/details/51244354
https://zhuanlan.zhihu.com/p/25045711?refer=shanren7
https://pjreddie.com/darknet/yolo/

实习期间,想实现行人检测任务,要求速度上比较快,因为要放在android端跑,因此选择了YOLO。YOLO是一种基于端到端的检测算法,其特点就是快同时准确率还差强人意。
传统的目标检测方法基本都是基于滑窗的方式,RCNN系列也可以归为滑窗的一种。而YOLO是一种采用全图信息来进行检测的算法,相比于Fast RCNN,YOLO的背景预测错误率低一半,但YOLO对小像素的目标不敏感。
总结一下:

  1. 非常快。YOLO预测流程简单,速度很快。基础版在Titan X上可以达到45帧/s,快速版可以达到145帧/s,在无GPU的虚拟机中检测一张图需要1.5s左右,需要速度快,但是对无GPU的Android端还是不够。
  2. YOLO无需滑窗,无需候选窗,YOLO在训练和预测过程中可以利用全图信息。Fast RCNN因检测中无法看到全局信息,会出现错误的将背景中的斑块检测为目标的情况。
  3. YOLO可以学习到目标的概括信息,具有一定普适性。采用自然图片训练YOLO,然后选择艺术图片来预测,YOLO的比DPM(Deformable Parts Models)和RCNN的准确率高得多。
  4. YOLO对相互靠近的物体,还有很小群体的检测效果不好。这是因为一个格子中只能预测两个框,并且属于一类。而且,在预测时,同一类物体以不同长宽比出现时,YOLO的效果不好。在大小物体定位的处理上效果也不好。

1、大体流程
YOLO就是利用整张图作为输入,然后直接输出回归bounding box的位置和类别。
这里写图片描述
YOLO先将图片分为个这里写图片描述格子,如果一个目标的中心落在某个格子中,这个格子就负责检测该目标。每个格子中要预测B个Bounding Box,且每个Bounding Box出了要回归自身的位置(这里写图片描述)之外,还要附带预测一个condfidence值(置信值)。这个置信值代表了所预测的Bounding Box中包含目标的置信度和位置(这里写图片描述)的准确度两重信息。其值的计算如下式:
这里写图片描述
如果这个格子中有Object落在其中,则这里写图片描述取1,否则取0。这里写图片描述表示预测的Bounding Box和真实的Bounding Box之间的IOU值。

每个Bounding Box包含位置信息(这里写图片描述)和置信值(condfidence)5个值,同时每个格子还要预测出一个概率值C(如数据集为20类,则C的个数为20),代表这个格子包含某一个目标的概率,每一个格子只预测一类概率。在测试时,每个Bounding Box通过类别概率和Bounding Box的置信值相乘来得到特定类别的置信分数,如下式。
这里写图片描述
则输入一张图,一共的这里写图片描述格子,每个格子要预测B个Bounding Box,每个Bounding Box包含5个值,同时每个格子还要预测C个类别概率,因此输出就是这里写图片描述个tensor。(注:C是针对每个格子的,而condfidence是针对每个Bounding Box)。
举例:在PASCAL VOC中,图像输入为这里写图片描述,取这里写图片描述。则输出的就是这里写图片描述的tensor。

这里写图片描述
2、具体细节
上述例子中,网络输出为这里写图片描述,即每个格子输出30个tensor(2个Bounding Box一共8个位置值,2个置信值,还有20维的类别)。其中位置值(这里写图片描述)中,这里写图片描述代表与格子相关的Bounding Box的中心,在训练时归一化到0-1;这里写图片描述表示Bounding Box的宽和高,在训练时用图像的宽和高归一化到0-1。
在实现时最重要的是怎样设计损失函数,让这个三方面得到很好的平衡。作者简单粗暴的全部采用sum-squared error loss来做这件事。但是这种做法存在几个问题:
一、8维的位置误差和20维的分类误差同等重要显然不合理。
二、如果某个网格中没有object,那个这个网格的置信值就为0,相对于较少有object的网格,这种做法太过暴力,这会导致网络不稳定甚至发散。
解决方法:
一、更重视8维的位置坐标,在位置坐标损失前面赋予更大的loss wights,记为这里写图片描述。在PASCAL VOC训练中取5.
二、对不包含object的Bounding Box的置信值的误差,赋予小的loss wights,记为这里写图片描述。在PASCAL VOC训练中取0.5。
三、包含object的Bounding Box的置信值的误差和类别的误差,其loss wights正常取1。

对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。
这里写图片描述

一个格子要预测多个Bounding Box,希望的是每个Bounding Box专门负责预测某个object。具体就是当前预测的Bounding Box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。

整个loss如下:
这里写图片描述

1、损失函数中,只有当Bounding Box中有object时才会对分类误差进行惩罚。
2、只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。

3、实现
实现的code主要是基于https://pjreddie.com/darknet/yolo/
A、首先下载code编译
这里写图片描述
B、下载网站提供训练好的模型weights
这里写图片描述
C、运行预测
这里写图片描述
D、得到结果
这里写图片描述

预测很简单,本人也做了预测,在cpu上单张图需要1.5s左右。网页上也提供了训练的步骤,需要下载制作好的数据集;若需要解决个人问题,则需要自己标定图片,制作数据集。
接下来本人会自己制作数据来试验一下,并简单阅读一下源码。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/113883
推荐阅读
相关标签
  

闽ICP备14008679号