YOLOv2
- 论文介绍
- 论文改进
- 1. Batch Normalization
- 2. High Resolution Classifier
- 3. Convolutional With Anchor Boxes
- 4. vgg16换成darknet-19
- 5. Dimension Clusters(w h的聚类)
- 6 预测坐标
- 7. passthrough
- 8. 多尺度输入训练
- 损失函数
论文介绍
论文名字:《YOLO9000:Better, Faster, Stronger》
论文下载地址:https://arxiv.org/abs/1612.08242(右边Access Paper: View PDF)
论文作者:Joseph Redmon, Ali Farhadi
YOLO9000的意思就是除了对v1改进外,还提出一种新的算法可以在9000中类别上进行检测。
通常改进通过堆积更深的层数或者堆积更大的网络,但是作者为了让这个模型有精度以及速度,设计了下边这些技巧,同时设计一个新的darknet19
论文改进
下边这个表就概述了从YOLOv1到YOLOv2的变化。
1. Batch Normalization
第一个是把YOLOv1骨架网络的层换成BN层,在所有的卷积层后边
v1最后几层是全连接-dropout-全连接-sigmoid归一化-reshape7x7x30
v2最后几层是把darknet的输出和第43层输出做一个合并,在直接做一个卷积,直接预测输出的大小。到v5也是这样的。
去掉全连接和dropout是因为全连接参数量太多了,卷积是一个不错的代替方案,去掉dropout是因为dropout和bn通常是二选一,因为全有的话,会有方差偏移, dropout一般用的话就是用在全连接的旁边,现在一般都不用了
2. High Resolution Classifier
第二是提高输入数据的分辨率
预训练分类阶段输入数据从224改为448,10个epoch作为预训练
检测阶段输入数据从448改为416
为了保证最后输出是奇数,所以是416(作者解释)
最终输出阶段从7x7x30改为13x13x25
(30=10+分类种类数,25=5+分类种类数。在voc数据集里,分类种类数是20类。5代表的是xywhc,10就是两倍的xywhc)(这也是引入anchor的效果)
3. Convolutional With Anchor Boxes
第三是引入anchor机制,v1是没有的,v2v3都加入了,能提高模型的召回率以及预测的边框值
anchor的介绍:
在模型计算前有一个预生成的阶段,通过其他程序生成anchor,到了YOLOv5就把这个生成anchor的阶段放到模型训练代码里,自适应根据数据大小调整anchor大小
这些anchor就是目标检测宽跟高
4. vgg16换成darknet-19
第四是修改了骨架网络 从vgg16换成darknet-19
前边的横杠之前的都是普通的卷积加池化,在训练分类和训练检测阶段都是一样的
横杠下边的卷积加平均池化是做预训练分类的,检测训练采用passthrough结构
5. Dimension Clusters(w h的聚类)
第五是采用kmeans聚类得到先验框,在基于这几个先验框在用的时候用起来
YOLOv2的anchor对应边框的wh,其xy是最后预测的13x13上边每个grid cell坐标,所以YOLOv2的anchor实际不多
faster r-cnn的anchor是根据骨干网络输出的特征MxM大小在每个点上生成N个边框,总共生成MxMxN个边框,每个边框坐标是x1,y1,x2,y2
YOLOv2的anchor大小是通过聚类生成的,faster r-cnn是硬编码固定大小生成的
v2-v5都涉及聚类算法。
采用k-means聚类得到先验框,就是在所有val数据集上计算所有边框的wh,聚成几类之后就能得到不同的先验框。
6 预测坐标
第六是预测方式改为基于anchor的偏移缩放(改进关键)
这种改进方式把wh的大小放大,在预测的时候能减小误差。预测出的tx ty归一化后加上左上角的坐标,得到蓝色框的中心点,pw ph就是anchor的宽和高
7. passthrough
第七是高低维度特征融合(passthrough),类似残差结构
拿到darknet-body输出的最后一层,与 中间的43层合并
conv20:[batch, 13, 13, 1024] conv 13: [batch, 26, 26, 512]
这两层先reshape成一样的,在concat合并(space_to_depth)
output:[batch, 13, 13, 1280]
再就用卷积预测最终的结果
8. 多尺度输入训练
第八是多尺度输入训练策略,这个是为了改进v1大小目标小目标检测较差的情况,加入一个多尺度训练,每迭代几个epoch,就修改输入的一个大小,让模型能够适应不同尺度的输入,以提高对小目标大目标的检测效果。
保持主干网络不变,调整输入图片的大小为[320, 352, 384, 416, 448, 480, 512, 544, 576, 608],每十个epoch改变一次大小
损失函数
第一行是 没有包含目标情况下的损失,兰姆达=1是平衡正负样本不平衡的问题,只计算背景概率损失
第二行是计算包含目标情况下的损失
第三行是类别损失,是差平方和
第四行使边框损失,主要差别是,wh不再需要开方操作