论文名称:You Only Look Once:Unified,Real-Time Object Detection
作者:Joseph Redmon ∗ , Santosh Divvala ∗† , Ross Girshick ¶ , Ali Farhadi
论文地址:http://openaccess.thecvf.com/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdf
发表年份:CVPR 2016
yolo是截至目前又快又好检测中的佼佼者,本文是yolo系列的第一个版本。虽然mAP上可能不尽如人意,但是它引入了yolo的思想,值得从头学习。
1 动机
截至到2016年本文写作时,仍然是R-CNN系列在统治目标检测领域,首先预测出可能存在目标的候选区域,然后在候选区域上使用分类器和边界回归器预测目标的类别和更精准的目标边界框,这种two-stage的检测流程虽然检测效果很好,但是有个致命弱点-计算量大,很难达到实时检测。one-stage的DPM虽然检测速度快,但是效果差到不忍直视。
但是,人拿到一张图片,简单看一次就可以知道图中有目标的类别、大小、位置,根本不用先找候选区域再用分类器那么麻烦。
基于此,作者提出,You Only Look Once,把整幅图片输入模型,然后一次性的预测出目标类别、位置。
2 贡献
- 把目标检测的目标类别识别和目标边界框确定都看做是回归问题,You Only Look Once,然后得到类别和位置信息。
- 提出轻量级骨干网络,加速检测
- 使得One-Stage检测模型终于能崭露头角,使得大家开始重新审视one-stage检测器
- 个人觉得,yolov1的最大亮点就是结合 回归思想 的 Loss函数 的设计。
3 方法
3.1 Unified Detection
YOLO把目标类别识别和目标位置确定这两个任务都看做是回归问题,把整张图片输入网络,直接输出目标类别和位置,训练时也是直接按照回归的方式:真-端到端训练。
直接从整张图片中预测出某个目标似乎不太容易,YOLO把图片分成
S
∗
S
S*S
S∗S个网格单元(gc,grid cell),从每个网格单元中预测出某个目标,然后再把预测的结果汇总,这似乎可以看做是一种类似map-reduce的思想。
对于每个网格单元
C
C
C,预测
B
B
B个边界框(bounding box,下文中记做bbox)和C个类别的条件概率。每个bbox包括5部分,
(
x
,
y
,
w
,
h
,
c
o
n
f
i
)
(x,y,w,h,confi)
(x,y,w,h,confi),其中的
c
o
n
f
i
confi
confi指这个bbox中包含目标的可能性和这个bbox的准确性,
c
o
n
f
i
=
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
confi=Pr(Object)*IOU_{pred}^{truth}
confi=Pr(Object)∗IOUpredtruth
(
x
,
y
)
(x,y)
(x,y)指这个bbox相对于
C
C
C的中心点坐标,
(
w
,
h
)
(w,h)
(w,h)指这个bbox相对于整张图片
(
W
,
H
)
(W,H)
(W,H)的宽高,此时
w
,
h
都
是
在
[
0
,
1
]
w,h都是在[0,1]
w,h都是在[0,1],可以使模型更准确。C个条件概率是
P
r
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
Pr(Class_i|Object)
Pr(Classi∣Object)。在测试时,只要把条件概率和
c
o
n
f
i
confi
confi相乘就得到每个类别的分类概率:
P
r
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
∗
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
=
P
r
(
C
l
a
s
s
i
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
Pr(Class_i|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_i)*IOU_{pred}^{truth}
Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
3.2 网络结构
yolov1的网络结构启发自GoogLeNet和Network in Network,使用
c
o
n
v
(
1
,
1
)
−
c
o
n
v
(
3
,
3
)
conv(1,1)-conv(3,3)
conv(1,1)−conv(3,3)的结构,
c
o
n
v
(
1
,
1
)
conv(1,1)
conv(1,1)主要用于降维和融合特征,
c
o
n
v
(
3
,
3
)
conv(3,3)
conv(3,3)用于提取特征。网络的输入是(N,3,448,448),输出是(N,SS(B*5+C)),最后一层使用线性激活函数,其他层使用Leaky ReLU(
α
=
0.1
\alpha=0.1
α=0.1)。
3.3 损失函数
yolov1的损失函数使用优化后的平方差函数(SSE,sum-squared error)。
- 使用SSE因为它容易求导
- 朴素的SSE有两个问题
- 对bbox和cls平等加权,应该对两者有不同加权;
- 每张图片中的大部分网格单元的预测器是不包含正样本的,这时 I O U p r e d t r u t h = 0 IOU_{pred}^{truth}=0 IOUpredtruth=0,那么 c o n f i = 0 confi=0 confi=0,这种情况下,回归器只要简单的预测 c o n f i = 0 confi=0 confi=0就可以了,是focal loss中的easy example,并且这些easy example的数量占较大比重,所以应该对包含正/负样本的预测器的loss有不同加权。
针对这两个问题,使用 λ c o o r d , λ n o o b j \lambda_{coord},\lambda_{noobj} λcoord,λnoobj加权bbox/cls,包含正/负样本。
- 大的box应该比小的box的梯度更小(想让小的box调整地更细),但是朴素的SSE是让大的box有更大的梯度。
本文通过直接预测 w , h \sqrt{w},\sqrt{h} w,h来勉强达到这种要求。
其中的指第
i
i
i个网格单元中出现目标,一部分出现也算;指第
i
i
i个网格单元的第
j
j
j个检测器(bbox predictor)负责检测该网格中的目标。
3.4 实现细节
- S = 7 , B = 2 , λ c o o r d = 5 , λ n o o b j = 0.5 S=7,B=2,\lambda_{coord}=5,\lambda_{noobj}=0.5 S=7,B=2,λcoord=5,λnoobj=0.5
- 网络结构
- 前20层卷积层首先在ImageNet上做预训练,然后整个网络一起做微调(fine tune),不冻结
- 训练参数
- lr:1e-3 ->1e-2 ->1e-3 -> 1e-4
- epoch:(75+30+30)
- batch size 64
- momentum 0.9
- weight decay 5e-4
- 数据增强
- 随机裁剪 随机变换
- HSV空间上曝光和饱和度调整到原图的1.5倍
- 没有batch normalization,使用Dropout,rate=0.5
- 测试时,对检测到的很多bbox做NMS,阈值未提。
4 实验
4.1 Pascal VOC
4.2 Picasso
4.3 错误分析
类型 | 指标 |
---|---|
Correct | correct class , IOU>0.5 |
Localization | correct class , <0.1IOU<0.5 |
Similar | class is similar ,IOU>0.1 |
Other | classs is wrong,IOU>0.1 |
Background | IOU<0.1 for any object |
测试时,对每个类别,取样对该类别的TopN个结果(按类别得分排序),按照上表中的标准分类检测结果。
5 思考
- yolov1中一个网格单元只检测一个物体,邻近物体的检测效果不好
- 虽然loss中使用 w , h \sqrt{w},\sqrt{h} w,h缓解了大小边框了的梯度相差甚远的问题,但大框大梯度小框小梯度的问题并未解决
- 小物体的检测效果不好
- 直接凭空预测bbox,对于训练集中未出现过的ratio的物体检测效果不好
- yolov1的检测速度极快,但是mAP与two-stage的R-CNN系列还差较多