【目标检测】YOLOv1:You Only Look Once
YOLO系列目标检测算法是卷积神经网络中的一阶段检测算法,是基于深度学习的端到端的回归方法。
YOLO官网:https://github.com/pjreddie/darknet
论文名称:YOLO9000: Better, Faster, Stronger
论文地址:https://arxiv.org/abs/1612.08242
官方代码:http://pjreddie.com/darknet/yolo/
发表时间:2016年12月25日
引用格式:RedmonJ,FarhadiA.YOLO9000:better,faster,stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271.
改进点
批量归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLOv2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。
使用Batch Normalization对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖。通过对YOLOv2的每一个卷积层增加Batch Normalization,最终使得mAP提高了2%,同时还使model正则化。使用Batch Normalization可以从model中去掉Dropout,而不会产生过拟合。
对比YOLOv1,去掉了fc与Drop_out层,直接用BN+ReLU,mAP得到大约2%的提升。
在做特征提取的骨干网络部分,是通过卷积处理得到最终的输出形状,代替了原来的全连接层,降低了模型的参数量。
预训练分类输入从224调整到448
检测阶段训练输入从448调整到416
输出从7×7×(10+num_classes)调整到13×13×num_anchors×(5+num_classes)
论文中num_anchors=5。
YOLOv1包含有全连接层,从而能直接预测Bounding Boxes的坐标值。Faster R-CNN算法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值,YOLOv2作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。
借鉴Faster RCNN的做法,YOLOv2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
之前YOLOv1并没有采用先验框,并且每个grid只预测两个bounding box,也就是整个图像只有98个bounding box。YOLOv2如果每个grid采用9个先验框,总共有13×13×9=1521个先验框。所以最终YOLOv2去掉了全连接层,使用Anchor Boxes来预测 Bounding Boxes。作者去掉了网络中一个Pooling层,这让卷积层的输出能有更高的分辨率,同时对网络结构进行收缩让其运行在416×416而不是448×448。
由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLOv2的卷积层采用32这个值来下采样图片,所以通过选择416×416用作输入尺寸最终能输出一个13×13的Feature Map。使用Anchor Box会让精确度稍微下降,但用了它能让YOLOv2能预测出大于一千个框,同时recall达到88%,mAP达到69.2%。
采用新的特征提取器darknet_19,包含19个卷积层和5个maxpooling层。Darknet-19与VGG16模型设计原则是一致的,主要采用3x3卷积,采用2x2的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。与NIN(Network in Network)类似,Darknet-19最终采用global avgpooling做预测,并且在3x3卷积之间使用1x1卷积来压缩特征图channles以降低模型计算量和参数。
Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。
下图为Darknet_19的模型结构
在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。
YOLOv2对训练集中标注的边框进行K-means聚类分析,以寻找尽可能匹配样本的边框尺寸。如果我们用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高IOU分数,这依赖于Box的大小,所以距离度量的使用:
其中,centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”,IOU越大,“距离”越近。在model复杂性与high recall之间权衡之后,选择聚类分类数K=5。
将预测坐标改为偏移缩放。
第一个问题:tx和ty的量级。通过sigmoid函数,归一化tx和ty。
第二个问题:tw和th的量级。在计算损失的时候,通常大边框的损失会影响到很多的小边框。所以将tw和th作为了以e为底的指数,使本身的值不会差别很大。
将模型的最后一层和卷积第43层进行concat拼接。拼接前将第43层调整到和模型的最后一层的shape同样大小。
为了解决不同大小的目标检测问题,YOLOv2在v1的基础上加入了多尺度的训练方法,具体为:
λ b o j = 5 \lambda_{boj}=5 λboj=5和 λ n o b o j = 5 \lambda_{noboj}=5 λnoboj=5主要为了解决正负样本不均衡的问题。
YOLOv1和YOLOv2选择正负样本的区别:
相同点:二者都是把负样本的置信度往0进行优化
不同点:如何选择负样本不同。
v1 把 正样本那个cell中那个低IOU值的预测框以及所有cell中没有标注框中心的那些预测框(每个cell 两个)设为 负样本。这些预测框的置信度往0优化。
v2 先计算当前cell 中 每个 预测框与 所有 标注框 的 最大IOU,一张图像输入,那么会有 13135= 845 个最大IOU,也是一共 845个预测框,若每个最大IOU小于等于0.6,那么设置为负样本。将这些预测框的置信度往0优化。
具体实现里 t h r e s = 0.6 thres=0.6 thres=0.6
边框损失不在是开放的操作。
本文为自用总结,部分内容出自以下文章,强烈推荐阅读:
YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5
深度学习目标检测系列:一文弄懂YOLO算法|附Python源码
yolov1,yolov2,yolov3 训练,解读,复现
目标检测|YOLOv2原理与实现(附YOLOv3)
YOLO v2总结