赞
踩
这是继 RCNN,fast-RCNN 和 faster-RCNN 之后,rbg(RossGirshick)针对DL目标检测速度问题提出的另外一种框架。YOLO V1 增强版本GPU中能跑45fps,简化版本155fps。
YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了,而YOLO则采用直接回归的思路。
将一幅图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。
这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:
B b o x 置 信 度 = P ( O b j e c t ) ∗ I O U p r e d t r u t h Bbox置信度 = P(Object) \ast IOU_{pred}^{truth} Bbox置信度=P(Object)∗IOUpredtruth
其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。
每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则 S ∗ S S*S S∗S 个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是 S ∗ S ∗ ( 5 ∗ B + C ) S * S * (5*B+C) S∗S∗(5∗B+C) 的一个tensor。
注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。
举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x(2x5+20)的一个tensor。
整个网络结构如下图所示:
在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
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) \ast Pr(Object) \ast IOU_{pred}^{truth} = Pr(Class_{i}) \ast IOU_{pred}^{truth}
Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。
得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的 boxes,对保留的 boxes 进行NMS处理,就得到最终的检测结果。
注意:
简单的概括就是:
(1) 给个一个输入图像,首先将图像划分成7*7的网格
(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3) 根据上一步可以预测出772个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可
在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。 这种做法存在以下几个问题:
解决办法:
对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。(也是个近似逼近方式)
一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。
最后整个的损失函数如下所示:
损失由三部分组成,分别是:坐标预测损失、置信度预测损失、类别预测损失。
使用的是差方和误差。需要注意的是,w和h在进行误差计算的时候取的是它们的平方根,原因是对不同大小的bounding box预测中,相比于大bounding box预测偏一点,小box预测偏一点更不能忍受。而差方和误差函数中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将bounding box的w和h取平方根代替原本的w和h。
定位误差比分类误差更大,所以增加对定位误差的惩罚,使 λ c o o r d = 5 λ_{coord}=5 λcoord=5。
在每个图像中,许多网格单元不包含任何目标。训练时就会把这些网格里的框的“置信度”分数推到零,这往往超过了包含目标的框的梯度。从而可能导致模型不稳定,训练早期发散。因此要减少了不包含目标的框的置信度预测的损失,使 λ n o o b j = 0.5 λ_{noobj}=0.5 λnoobj=0.5。
1
i
o
b
j
1_{i}^{obj}
1iobj 表示网格 i 中存在对象。
1
i
j
o
b
j
1_{ij}^{obj}
1ijobj 表示 网格 i 的第 j 个 Bbox 中存在对象。
1
i
j
n
o
o
b
j
1_{ij}^{noobj}
1ijnoobj表示网格 i 的第 j 个 Bbox 中不存在对象。
这个损失函数中:
其他细节,例如使用激活函数使用leak RELU,模型用ImageNet预训练等等,在这里就不一一赘述了。
由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率
YOLO采用了多个下采样层,网络学到的物体特征并不精细,因此也会影响检测效果。
虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
YOLO方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLO的检测效果并不理想。同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。