1. 概述
YOLOV2 论文下载:YOLO9000: Better, Faster, Stronger
Better: 提升性能、速度
Faster: 修改骨干网,检测速度更快
Stronger: 检测目标达 9000 多种
YOLOV1 的不足之处:
(1)准确度(mAP)比较低;
(2)定位性能比较差;
(3)把目标全部检出的能力比较差;
(4)检测小目标,密集目标的检测效果不好。
YOLOV2 即针对这些不足进行了改进。
2. YOLOV2
2.1 Better
2.1.1 Batch Normalization
具体操作:神经元的输出减去均值再除以标准差,变为以 0 为中心,均值为 0,标准差为 1 的分布(如上图)。
目的:因为 sigmoid,tanh 等激活函数在 0 附近是非饱和区,远离 0 的区域是饱和区,当输出举例中心 0 较远的时候,容易发生梯度消失,难以训练,因此,将数据通过 BN 层操作,聚集到中心 0 的附近,梯度较大,方便训练,加快收敛。
经过 BN 操作,可以看到神经元的输出值聚集到了 0 附近。
更直观的一个例子(图源:莫烦Python)
BN 层位置:全连接层之后,激活函数之前。
2.1.2 High Resolution Classifier
训练时,在小分辨率的图像数据中插入大分辨率的图像 ,从而网络在面对高分辨率的图像时也适应的很好。
2.1.3 Anchor
相比于 YOLOV1 是自动生成检测框,YOLOV2 在训练之前就对不同形态的物体添加了先验框。比如:高瘦的目标使用高瘦的框,矮胖的物体使用矮胖的框,也即这些框有了针对性,不再是随机生成,使得模型的训练更加稳定,这样最终预测框只需要针对先验框做微调,最后找出 IOU 较大的那一个为目标框。
YOLOV2 将一张图片划分为 13 X 13 个 grid cell,每个 grid cell 预测 5 个 Anchor,训练之前针对一个 grid cell 得到了 5 个不同大小的先验框,每个 Anchor 对应一个预测框,预测框只需输出它对于 Anchor 的偏移量即可。
CNN 输出的 feature map 结构:
5 个 Anchor 通过聚类方法得到,而不是人工手动标出。
使用聚类方法选择 Anchor 是比较有效的(K-MEANS)。
2.1.4 Direct location prediction
YOLOV1 的目标预测框是可以在整个图像各个位置移动的,这样容易模型在训练初期极不稳定。V2 对此做了改进,将预测框相对 Anchor 的偏移量做了限制,把预测框的中心坐标限制在了其所在的 grid cell 里面,避免预测框四处乱窜。
x,y 坐标的偏移量用 sigmoid 函数进行约束, h,w 没有限制。
预测框参数:
上图中,b 即是预测框的参数,宽高通过 sigmoid 函数来约束,提高模型在训练过程中的稳定性。
损失函数:
2.1.5 Fine-Grained Features
整合不同尺度的特征。将浅层网络得到的 feature map 进行拆分,一路继续卷积,下采样,一路分为 4 份,尺寸大小减半,通道数目乘 4,然后再进行融合,这样就得到了底层的细粒度信息和卷积之后高层的信息,从而整合了不同尺度的特征,有利于小目标的目标检测。
具体实现:
代码实现:
2.1.6 Muti-Scale Training
输入不同尺度的图像,从而达到模型预测中速度与精度的权衡。
多尺度图像输入:
2.2 Faster
更换了主干网络。
分类、预测网络结构:
网络中数据传递:
2.3 Stronger
UOLO V2 理论上可以检测 9000 多个类别的物体。
对于那些并非真正互斥的数据(such as 阿拉斯加,拉布拉多),先对数据进行处理,按照不同的属性分门别类,最终在互斥的分类下进行 softmax,这样,通过每一个层级之间的预测结果来达到最终的结果。
注:本篇博文插图多来源于参考链接,感谢。