Yolo基础上的延续,
新的基础网络,多尺度训练,全卷积网络,Faster-RCNN的anchor机制,更多的训练技巧等等改进使得yolov2速度与精度都大幅提升
网络结构
分类网络(先在Imagenet1000 上训练160epoch)
包含 19 conv + 5 maxpooling.
检测网络
改动分类网络:
- 在分类网络中移除最后一个1x1的层,在最后添加3个3x3x1024的卷积层,再接上输出是类别个数的1x1卷积.
对于输入图像尺寸为Si x Si,最终3x3卷积层输出的feature map是Oi x Oi(Oi=Si/(2^5)),对应输入图像的Oi x Oi个栅格,每个栅格预测#anchors种boxes大小,每个box包含4个坐标值,1个置信度和classes个条件类别概率,所以输出维度是Oi x Oi x anchors x (5 + classes)。 - 添加跨层跳跃连接(借鉴ResNet等思想)
- 融合粗细粒度的特征:将前面最后一个3x3x512卷积的特征图,对于416x416的输入,该层输出26x26x512,直接连接到最后新加的三个3x3卷积层的最后一个的前边.将26x26x512变形为13x13x1024与后边的13x13x1024特征按channel堆起来得到13x13x3072.从yolo-voc.cfg文件可以看到,第25层为route层,逆向9层拿到第16层26 * 26 * 512的输出,并由第26层的reorg层把26 * 26 * 512 变形为13 * 13 * 2048,再有第27层的route层连接24层和26层的输出,堆叠为13 * 13 * 3072,由最后一个卷积核为3 * 3的卷积层进行跨通道的信息融合并把通道降维为1024。
mAP提高1%。
训练:
1.使用Darknet框架在ImageNet 1000类上训练160 epochs,学习率初始为0.1,以4级多项式衰减.weight decay=0.0005 , momentum=0.9.使用标准的数据增广方法:random crops, rotations, (hue, saturation), exposure shifts.
2.之后将输入从224放大至448,学习率调整为0.001,迭代10 epochs.结果达到top-1 accuracy 76.5% , top-5 accuracy 93.3%.作者训练检测网络时以0.001的初始学习率训练了160个迭代,在60次和90次迭代的时候,学习率减为原来的十分之一。weight decay为0.0005,momentum为0.9,使用了类似于Faster-RCNN和SSD的数据扩充(data augmentation)方法。
- 多尺度训练。原始的YOLO使用448×448的输入分辨率。添加anchor box后,我们将分辨率更改为416×416。然而,由于我们的模型只使用卷积层和池化层,它可以在运行中调整大小。我们希望YOLOv2能够在不同大小的图像上运行,因此我们将其训练到模型中。
YOLOv2(在cfg文件中random=1时)训练时每迭代10次,就会随机微调选择新的输入图像尺寸。使用32的倍数调整输入图像尺寸{320,352,…,608}。训练使用的最小的图像尺寸为320 * 320,最大的图像尺寸为608 * 608。 共十种
改进策略
- 使用3x3卷积并在pooling之后channel数加倍(VGG);
- global average pooling替代全连接做预测分类,
- 在3x3卷积之间使用1x1卷积压缩特征表示(Network in Network);
- 使用 batch normalization 来提高稳定性,加速收敛,对模型正则化.提高2%mAP
- 高分辨率分类网络 448*448对Imagenet fine tune 提高mAP4%
使用anchor box 预测bbox:
IOU(GT和proposed box) 和P(class|object)(同yolo)
注:YOLO 预测98个bbox,而anchor box 多余1000.
使用anchor boxes预测坐标的同时,YOLOv2还对对conditional class probability的预测机制和空间位置(栅格)做了解耦。
YOLOv2不再由栅格去预测条件类别概率,而由Bounding boxes去预测。在YOLOv1中每个栅格只有1组条件类别概率,而在YOLOv2中,因为每个栅格有B个bounding boxes,所以有B组条件类别概率。
在YOLOv1中输出的维度为S * S * (B * 5 + C ),
而YOLOv2为S * S * (B * (5 + C))。
比如都有2个bbox/anchor box
效果:mAP下降0.3,而recall上升7%,说明模型有更大的改进空间。在每个网格设置k个参考anchor,训练以GT anchor作为基准计算分类与回归损失。测试时直接在每个格子上预测k个anchor box,每个anchor box为相对于参考anchor的offset与w,h的refine。这样把原来每个格子中边界框位置的全图回归(yolov1)转换为对参考anchor位置的精修(yolov2)。
- 维度聚类
每个格子中设置多少个anchor(即k等于几),作者使用了k-means算法离线对voc及coco数据集中目标的形状及尺度进行了计算。发现当k = 5时并且选取固定5比例值的时,anchors形状及尺度最接近voc与coco中目标的形状,是模型复杂度和recall(avg IOU)权衡。
d(box,centroid)=1-IOU(box,centriod) - 直接位置预测
利用anchorbox偏移预测时,存在偏移量没有约束,导致模型的不稳定,所以仍然选择直接预测相对于栅格的相对位置,使用逻辑激活函数(sigmod func)限制在【0,1】之间
栅格左上角的坐标为(cx,xy)
预测五个:
bounding box的中心点坐标(bx,by)
宽高bw,bh
置信值P(object)*IOU(b|object)
ref
https://blog.csdn.net/u011974639/article/details/78208896