赞
踩
本文主要参考: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就是利用整张图作为输入,然后直接输出回归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左右。网页上也提供了训练的步骤,需要下载制作好的数据集;若需要解决个人问题,则需要自己标定图片,制作数据集。
接下来本人会自己制作数据来试验一下,并简单阅读一下源码。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。