论文:https://arxiv.org/abs/1506.02640
GitHub源码地址:https://github.com/pjreddie/darknet
理解参考:
https://zhuanlan.zhihu.com/p/25236464
核心技术:
YOLO将输入的图像分割为SxS个格子,如果一个检测目标的中心落入一个单元格中,则该网格负责检测该目标.
例如下图中的狗就由第五行,第二格的格子负责预测狗的boundingbox.
每个网格单元预测这些盒子的B个边界框和置信度分数。这些置信度分数反映了该模型对盒子是否包含目标的信心,以及它预测盒子的准确程度。在形式上,我们将置信度定义为
Pr(Object)∗IOUtruthpred
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
.如果该单元格中不存在目标,则置信度分数应为零。否则,我们希望置信度分数等于预测框与真实值之间联合部分的交集(IOU).
每个边界框包含五个预测: x,y,w,h x , y , w , h 和置信度, (x,y) ( x , y ) 坐标表示边界框相对于网格单元边界框的中心坐标,宽度和高度是相对于整个图片进行预测的.最后置信度预测表示预测框和实际边界框之间的IOU.
每个网格单元还预测 C C 个条件类别概率.这些概率以包含目标的网格单元为条件,每个网格单元我们只预测一组类别概率,不管边界框的数量B是多少(每个网格单元只对一个目标负责).
例如在Pascal VOC上进行训练测试的时候,使用 S=7 S = 7 , B=2, B = 2 , .Pascal VOC有20个标注类,所以 C=20 C = 20 ,最终得到的就是一个 7x7x30 7 x 7 x 30 的张量.
网络结构如下:
Loss Function定义:
YOLO使用均方和误差作为loss函数来优化模型参数,即网络输出的S*S*(B*5+C)维向量与真实图像的对应S*S*(B*5+C)维向量的均方和误差.其中
coordError,iouError,classRrror
c
o
o
r
d
E
r
r
o
r
,
i
o
u
E
r
r
o
r
,
c
l
a
s
s
R
r
r
o
r
分别代表预测数据与标定数据之间的坐标误差,IOU误差和分类误差.
YOLO对上面这个loss function进行了一些修正.
1)位置相关误差(坐标,IOU)与分类误差对网络loss的共享值是不同的,因此YOLO在计算loss时,使用 λcoord=5 λ c o o r d = 5 修正 coordError c o o r d E r r o r
2)在计算IOU的时候,包含物体的格子与不包含物体的格子,二者的IOU误差对loss的共享是不同的,若采用相同权重,那么不包含物体的格子的confidence值近似为0,变相放大了包含物体的格子的confidence误差在计算网络参数梯度时的影响。为解决这个问题,YOLO 使用 λnoobj=0.5 λ n o o b j = 0.5 修正 iouError i o u E r r o r (注此处的‘包含’是指存在一个物体,它的中心坐标落入到格子内).
3)对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题。( 注:这个方法并不能完全解决这个问题)
(注:此部分转载自知乎用户”赵丽丽”的专栏文章)
下面是YOLO中优化的多部分损失函数.
其中 1obji 1 i o b j 表示目标是否出现在网格单元 i i 中,表示网格单元 i i 中的第个边界框预测器负责该预测.
注意,如果目标存在于该网格单元中(前面讨论的条件类别概率),则损失函数仅惩罚分类错误。如果预测器“负责”实际边界框(即该网格单元中具有最高IOU的预测器),则它也仅惩罚边界框坐标错误。
突出贡献:
YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出
.同时达到速度快效果好的目标.
缺陷:
虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
1)对小物体的检测效果不够好.
2)对boundingBox的预测不够精确.