目录
前言
关于YOLO
系列的初始作者–Joseph Redmon
,说实话真的是个典型的米国白左,辣眼睛的CV,不知道的还以为是那个少女心泛滥的中二,祭出来镇楼:
想立就立、想当就当,想退圈就退圈,反正自己公司已经被大厂收购,早就实现了财富*,唉,真的是。。。。anyway, 有一说一,这也不影响其在学术、在目标检测上的积极贡献。所以还是要细细读一下。
1.简介
1.1 YOLO由来
YOLO == you only look once
: 就是看一眼,就可以做到目标检测了,可见足够快吧!
PS:
这些作者排序就比较有意思了:
第一作者是joe; Joseph Redmon
第二个作者是joe的大师兄、(看通讯地址也知道现在已经在 Allen Institute for Artificial Intelligence干活了);Santosh Divvala
第三个是Ross大神;这个可能都认识就不放了吧
最后一个是joe的指导老师老Ali 、同时也是Allen Institute for Artificial Intelligence一个项目的主要负责人。。。【 info | others 】
这个显然是业界和学界的合作催生的产物, joe的导师Ali功不可没,paper的具体功能我感觉其实没有太多划时代的创新点(是不是一篇文章,分多次发、发不同阶段的产物还真的不好说,毕竟YOLO_V1 、V2其实赶脚也没有离多久),但是paper让人赶脚着这个虽然不怎么样但是总是能突出速度快、忽略精度低或者说使用其他的方式让你觉得其实没有那么差并且给出一定方法去弥补的赶脚。写的还是不错的、况且还有大神挂名,感觉学术论文的技巧比较高!感觉像我们这样的小白,应该好好学习一下~~
1.2 摘要
论文也说的清楚,不再像R-CNN系列那样费心提出Proposals
了,直接使用一个网络、把找目标看做一个回归问题end-to-end一次训练完!这个绝对会非常快!(paper肯定不会明说,但是这个精度自然就会比较差了,相比于Two-stage
的一些代表,例如Faster R-CNN
)
1.3 代码
[YOLO v1] You Only Look Once: Unified, Real-Time Object Detection | [CVPR’ 16] |[pdf]
[official code - c]
(官方的v1版本已经不再维护了,都没官方代码了;最早的也只剩下v2版本了)
2.YOLO网络结构详解
2.1 整体介绍
这个整体过程也非常清楚:
(1)resize图片到固定尺寸(448x448,显然图片尺寸越大准确度越高,速度也会降低;R-CNN系列都是224x224,因为确实也慢,如果也用448x448的话mAP也许还会上升不过就慢的太过了)
(2)使用一个conv net + fc layer ----> 直接得到分类scores、bbox坐标 (这个过程真的有点像Faster R-CNN里面的RPN环节,不过YOLO就像是只有一个RPN、判断bbox就完了;而Faster R-CNN里面后续还有fc layer+ sibling layer继续再次进行校正bbox)
(3)得到分类score / bbox,通过阈值筛选判断、保留和筛除
2.2 主干网络分类
论文中以YOLO为主,同时也为了和其他detector比较精读和速度,提出了YOLO-Fast、YOLO-VGG16的版本,这个总是拿着不同版本的长处和别人比较的做法确实厉害。
-
YOLO(主要版本)
这是paper作者自己改进的卷积神经网络:
input : 448x448
net: 24个conv layer + 2 fc layer
output: class scores/ bbox, 注意是 7x7x30(请自行对照下方核心思想理解)
Tips:
1.作者paper里面说backbone的原型来源于GoogLeNet系列 - - Inception Net, 但是inception models肯定长着这样:
而且肯定检测的速度的话也会比较慢,毕竟大型的网络结构。作者的网络显然没有这个结构,最大的替换就是把inception module变成 3x3 +1x1 conv,类似于Network In Network.
2. 而且也说了一下训练过程:在imgnet上按照224x224先进行pretrain,之后采用这些模型fine-turning 448x448
3. 注意网络中使用的激活函数是leaky rectified linear activation
:
- YOLO-Fast (追求速度的版本)
input : 448x448
net: 9个conv layer + 2 fc layer
output: class scores/ bbox
tips:
只是从YOLO版本中,缩减主干网络的卷积层数(24 个 conv -> 9 个 conv layer),这样检测速度肯定会有较大提升,但是相关的feature map就没有那么高的维度和空间聚合性了,所以检测效果可能会下降非常多。
- YOLO-VGG16 (追求精读版本)
作者paper中可能也是因为自知精读太差,所以还是也像 R-CNN系列一样使用了其他人常用的VGG16网络,这个也是提升了一些精读 (大约3%左右)、但是检测速度确实下降了非常多。
2.3 核心思想详述
(1)输入图像被划分为了S*S
个grid
,如果一个物体的中心落在了某个grid cell中,则该grid cell就负责检测该物体。(在训练中可以通过ground truth计算出物体中心在哪个grid cell中,所以训练后,算法也自然拥有了这种能力。)
(2)每个grid cell 都会预测出B
个bounding boxes
及其置信度(confidence scores)
,这些置信度反应了该Box包含一个物体的确信程度以及bounding box的准确程度。训练过程,目标的置信度表示为 Pr(Object)∗IoU(pred,truth),
tips:
Pr(Object)-> 表示在此cell种是否存在obj, 存在 则=1;否则=0;
IoU(pred,truth) -> 表示预测的bbox与ground truth的 IOU
即如果grid cell中没有目标物体,则置信度为0;
如果有目标,置信度设为IoU(pred,truth),预测的bounding boxes每次都是前向计算出来的,与ground truth计算出目标IoU。
(3)每个bounding box
包含5个预测x,y,w,h
,以及置信度
;(x,y)
代表bounding box中心相对于对应cell边界的位置;w和h
是相对于整个输入图像的宽和高的比例。置信度
即bounding box与ground true的IoU(之后在做检测计算的时候会被乘上分类的概率输出)。
注意的是,bounding box
的位置是不需要初始化的,区别于Faster R-CNN
的anchor
方法,bounding box位置是模型计算输出的结果,而不是模型参数或者超参数(除了bounding box个数及数据组织方式)。模型权重有了初始值,有图像输入,则bounding box的位置是模型计算确定的。训练阶段将结合ground truth进行bounding box预测位置的调整(网络权重的更新)。
(4)每个grid cell也会输出C
类目标对象的类别概率, 即Pr(Classi|Object)。
在实际计算过程,我们计算每一个类别的概率,使用如下公式:
Pr(Classi|Object) ∗ Pr(Object) ∗ IoU(pred,truth) = Pr(Classi) ∗ IoU(pred,truth)
因为使用的是VOC数据集,有20个分类,所以以上的参数变为:S=7, B=2, C=20,
最终的输出是 7x7x(2x5+20) = 7x7x30
的tensor,具体含义如下所示:
2.4 loss计算
整体说明图:
说明:主要是包括 bbox误差、置信度误差、分类概率误差
- Xi, Yi, Wi,Hi -> 预测bbox框的中心坐标(距离bbox边界的比例;跟img长、宽的比值)/ X_hat, Yi_hat W_hat,H_hat -> 真实目标的bbox框的中心坐标(距离bbox边界的比例;跟img长、宽的比值);
- Ci -> 是否包含obj的置信度; C_hat -> 真实否是包含obj;
- Pi -> 预测是某个类别的概率;P_hat -> 真实是是某个类别的概率;
- λcoord :目标obj存在该cell中的权重系数、 λnoobj:obj不存在在该cell中情况下的权重系数 ; λcoord = 5 and λnoobj = .5.
PS: 为何要对w,h开根号?
举例来说:
3. 优缺点 and 与其他detection比较
3.1 YOLO自述优点
- 1 非常快
- 2 考虑图片全局性比较多、所以在预测的时候错误率较低(每个图片最多只能检测98个obj,这个自然错误率低了,哈哈)
- 3 yolo相比其他,通用泛化能力略好。(他用预测艺术品中图片的检测精读较高来佐证,毕竟这方面的对比其他论文也没去做,哈哈)
3.2 YOLO 自述缺点
3.3 和其他detector对比(从而作者可以信誓旦旦地说明客观上都没有YOLO好)
主要是对比了DPM、 R-CNN、Fast R-CNN、 Deep MultiBox、 OverFeat、MultiGrasp、Other Fast Detectors
。
简单来说,就是精度高的paper里面说没有YOLO速度快、速度能称得上real-time的说用的还是sift等老的提取特征方法、使用CNN提取RPN的就强调他们训练是multi-stages、速度很快的就说并不能用于检测复杂情况。
当然其实论SOTA的话,Fast R-CNN(2015年)还是比较有优势的,YOLO其实当时(2016)并没有硬刚,直接忽略不细谈。哈哈,建议去看原文。
4.实验和评估
4.1 和其他detector的比较
-
部分速度和准确度的比较(VOC2007)
速度快的没有YOLO准确度高(那些论文可是N年前的了,这个有点鞭尸的感觉。。。);精度高的还特别标注一下,“看!没有real-time(就是速度慢)、这可是less than real-time的哈”。另外,为了挽回一下YOLO系列的精度,并且还特意写上了YOLO-VGG16
-
VOC 2007 Error Analysis
主要是围绕着Fast R-CNN
(注意:而不是改进版的、更好一点的Faster R-CNN)展开。
使用Hoiem等人的方法和工具。对于测试时的每个类别,我们看这个类别的top N
。每个预测或者是正确的,或者根据错误类型进行分类:Correct
:正确的类别且IOU>0.5。Localization
:正确的类别,0.1<IOU<0.5。Similar
:类别相似,IOU >0.1。Other
:类别错误,IOU >0.1。Background
:任何IOU <0.1的目标
YOLO的诡辩艺术:
“ 看,Fast R-CNN里面因为是RPN有2k个,所以正确率高的同时,分错的占比也高(background)。而我们这边(YOLO)类别都对了,只是对于location这方便略微偏了一点而已(肯定还会提高的)”
- VOC 2012的精度结果比较
当然,这个表的结果并不是用来说YOLO只有50%的这么差的精读的实话的,主要是用来鼓吹他自己提出的结构FAST R-CNN + YOLO的精读也是SOTA的!
4.2 YOLO自己精度差?他给出了现在的解决办法
那就是selective search method
不是检测都需要1.5s么,反正是用来提出RPN的、直接用YOLO代替呗~~YOLO反正也才1/45 =0.02 s
(噗,当然要比Faster R-CNN的RPN时间长!!)
于是作者提出了一个方案: Combining Fast R-CNN and YOLO
并且是只看精读、不看速度的!!!
4.3 YOLO的强势鼓吹佐证
- 佐证1:在艺术品中人物检测的效果~看,更好泛化能力
反正就是找冷门的数据集,来刷一下优越感。。。貌似能说明泛化能力超强还是啥问题? 噗~~
- 佐证2:在户外实时检测方面 ~ 看,除了real-time,还有更符合人眼的bbox和分类哦(噗~~)
这让我想起了一个梗:
A某鼓吹自己心算能力特别快,
一个主持人问他,那我考考你吧? 123457 x 999.663等于多少?
A某答曰:100万。
主持人:这个貌似不对吧?
A某:你就说快不快吧。。。。
5.Reference
-
[YOLO v1] You Only Look Once: Unified, Real-Time Object Detection | [CVPR’ 16] |
[pdf]
[official code - c]
- YOLO相关博客 参考1 | 参考2 | 参考3