YOLO
迄今为止已经有三个版本,YOLOv1,YOLOv2, YOLOv3
YOLOv1
CVPR2016.5。经典文章,目标识别速度贼快,但定位有一定误差。对比R-CNN系列算法,YOLO是一步到位,同时给出位置信息和类别信息。
概述
将图片resize固定大小,分成s * s 个栅格(grid cell);滑动窗口滑动每一个栅格,对每一个栅格生成2个bounding box,每个bounding box包含4个坐标信息和一个confidence(
Pr(Object)∗IOUtruthpred
),对于需要预测C个条件类别概率
Pr(Classi|Object)
,最后
Pr=Pr(Classi|Object)∗Pr(Object)∗IOUtruthpred
;总共2*5+20 = 30维向量。综上每一栅格输出30维向量信息,且一个栅格最多只能预测一个物体,然后进行非极大值抑制(NMS),最后取大于阈值的检测信息。
网络架构
损失函数
λcoord∑i=0S2∑j=01objij[(xi−x^i)2+(yi−y^i)2]
+λcoord∑i=0S2∑j=01objij[(wi−−√−w^i−−√)2+(hi−−√−h^i−−√)2]
+∑i=0S2∑j=01objij(Ci−C^i)2
+λnoobj∑i=0S2∑j=01noobjij(Ci−C^i)2
+∑i=0S21obji∑c∈classes(pi(c)−p^i(c))2
λcoord=5,λnoobj=0.5
1objij
指对应栅格中有物体中心,且负责该物体的bounding box(如何判断哪个bounding box负责该栅格:confidence大的)
C表示
confidence=Pr(Object)∗IOUtruthpred
p(c)=Pr(Classi|Object)∗Pr(Object)
训练过程
先将网络的前20层用ImageNet1000类的数据集预训练(输入分辨率为224*224)
添加4层卷积和2层全连接层用作检测网络的训练(分辨率变为为448*448)
坐标处理
x,y表示预测bounding box 的中心与栅格左上角的相对值,且归一化为0~1。
w,h表示宽长,且值相对于整个图像的宽长,归一化为0~1。
YOLOv2
YOLO9000,Better,Faster,Stronger
CVPR2016.12
基于YOLOv1做出了一些改进,
Batch Normalization
对每一层的Z进行归一化,跟对A归一化差别不是很大,但一般都是对Z。
μ=1m∑iz(i)
σ2=1m∑i(zi−μ)2
znorm(i)=z(i)−μσ2+ϵ−−−−−√
z^(i)=γ⋅z(i)norm+β
上式的
γ和β
类似于其他参数可以通过梯度下降算法学得。
MAP提高了2%
High Resolution Classifier
YOLOv2的分类网络先用448*448分辨率的ImageNet输入训练迭代十次;(据我理解微调之前仍然用了224*224的分辨类率进行预训练,不然也不叫微调了。)
然后再微调检测网络。
MAP提高了4%
Anchor boxes & Dimension Clusters
学习了Faster R-CNN的RPN网络,也采用Anchor boxes的思想。查全率上升,但也引起了查准率的略微下降。Anchor boxes的宽长比和数量很明显会影响算法最终的性能,
Faster R-RCNN中Anchor boxes的宽长比和数量是人为定义的,这意味着存在一定的优化空间。YOLOv2则采用K-means对训练集中的boxes聚类,从而选取最优的数量和宽长比,距离函数定义为:
d(box,centroid)=1−IOU(box,centroid)
Direct location prediction
对预测的偏移量归一化处理,使得栅格内的anchor box只负责附近的物体,模型更加稳定。
bx=σ(tx)+cx
by=σ(ty)+cy
bw=pwetw
bh=pheth
Pr(object)∗IOU(b,object)=σ(to)
聚类加上预测归一化处理MAP提高了5%
Fine-Grained Features(细粒度特征)
类似于残差网络,添加了一个跳跃,MAP提高了1%
Multi-scale Training
由于网络只用到了卷积层和池化层所以可以输入任意大小图片;由于降采样倍数为32;因此采用{320,352,……,608}尺寸进行训练;每训练10次就更换一个尺寸。最后鲁棒性很强。
网络架构
特征提取网络
参考 https://blog.csdn.net/jesse_mx/article/details/53925356
YOLOv3
感觉东西不是很多,就没有去专门看。。。