目标检测算法最难理解的,设计最复杂的就是正负样本分配和损失函数这块了,这两者将很大程度决定网络的训练效果,因此开帖对yolo系列做一总结,重点也在这两者,吸收他人优秀博客内容,进行整理。

2016 CVPR有两个明星,一个是resnet,另一个就是YOLO。

上图是网络输出,注意里面每个格子预测两个Box,即论文中的B设置为2,但只有一组class probabilities,即每个格子只能预测一个物体,两个Box是为了让每个Box。
论文中损失:

同济子豪兄的注释:

相比v1,在backbone上有更新,加入了BN层,且检测头多了一个passthrough layer的短接,但最后的检测头还是只有一个,并且使用了anchor box机制,因为预测偏移量比直接预测更好学习,锚框的shape和大小是根据k-means聚类得到了5种锚框。论文标题的9000意思是可以使用文中的方法使yolov2实现9000种目标的检测。
BN层:

每个grid cell(网格)可以最多预测5个物体,5代表五种不同的anchor:

预测时的计算方式:
其中的sigmoid函数使得每个cell的预测结果的中心位置都是落在该cell中。
损失函数:

上图是网友根据yolov2的代码整理的损失函数,式子中
b
i
j
k
o
b_{ijk}^{o}
bijko是obj置信度,
b
i
j
k
r
b_{ijk}^{r}
bijkr是预测的BBox位置信息,其中
r
∈
(
x
,
y
,
w
,
h
)
,
b
i
j
k
c
r\in (x,y,w,h),b_{ijk}^{c}
r∈(x,y,w,h),bijkc是预测的框所属类别。
p
r
i
o
r
k
r
prior_{k}^{r}
priorkr是anchor的位置,因为每个cell中的五个anchor都是一样的,所以下角标只需要知道anchor属于这五个anchor的哪一个信息。
t
r
u
t
h
r
truth^{r}
truthr是标注框的位置信息。
t
r
u
t
h
c
truth^{c}
truthc是标注框的类别信息。
I
O
U
t
r
u
t
h
k
IOU_{truth}^{k}
IOUtruthk是anchor与标注框的IOU。
loss由三部分组成,其中标黄的部分非0即1。
第一部分标黄部分,为负样本惩罚,表示预测框与标注框的IOU如果小于阈值0.6,那视作这个预测框是与负样本匹配了,取值1,反之为0,后面的部分表示标签0与置信度 b i j k o b_{ijk}^{o} bijko的L2损失。这个IoU的计算是只根据大小和形状来计算的,与位置无关,即先将某个grid cell所属的anchor和gt(ground truth)中心位置重合,再计算IoU。
第二部分标黄部分,表示是在12800次迭代前,将anchor与预测框位置误差加入损失,可以使模型能够在前期学会预测anchor位置,使得输出的 t x , t y , t w , t h t^{x},t^{y},t^{w},t^{h} tx,ty,tw,th更稳定;(这一项自己的理解不是很清晰)
第三部分标黄部分,表示预测框是否负责预测物体,该anchor与标注框的IoU最大对应的预测框负责预测物体(IOU>0.6但非最大的预测框忽略不计),其中第一项表示预测框与标注框的定位误差,第二项表示预测框的置信度与标注框和anchor的IoU的误差,表示预测框的所属分类结果与标注框的类别信息的误差,这个预测类别结果我看到的代码都是做了softmax的。
图中还有五个 λ \lambda λ, 表示每一个损失的平衡系数。