YOLO系列算法论文解读
手撕YOLOv3代码部分:https://github.com/lzneu/handwriten_net/tree/master/yolov3
目录
2.2 High Resolution Classifier
2.3 Convolutional With Anchor Boxes
2.5 Direct location prediction
3.2 Training for classification
YOLOv1
1、直接看网络的输出如何表示目标
如Fig2
- 最终的输出层特征尺寸为S*S大小的grid,每个grid单元代表一个输出预测;
- 每个输出预测包括B个bbox以及C个类别的置信度
- bbox表示为[x,y,w,h, 置信度],其中,xy 为相对于gridcell边界的中心;w,h 为相对于整个图片的距离;置信度预测为预测框和真实框的IOU值,当grid cell中不存在目标时,其值为0
- C个类别置信度为Pr(Classi| Object),其中P(Object)为bbox中的置信度
- 注意,无论B为多少,都只预测一组C值
- 因此最终的输出特征的维度为:S*S*(B*5+C)
其中,在PASCAL VOC数据集上,设置S=7,B=2,C=20
因此,输出层最终的特征尺寸为:7*7*30
2、网络架构
整体的思路是:卷积网络提取特征+全连接层编码输出
网络架构图如fig3
- 使用24个卷积层+2个全连接层
- 使用224尺寸的图片,ImageNet数据集训练前20个卷积层
- 使用1*1卷积进行通道变换
- 增加4个卷积层和2个全连接层使用随机初始化参数
- 最后放大输入图片尺寸到448作为检测的卷积网络的输入
- 最后一层使用线性激活函数;其余层均使用leaky 线性激活函数,如公式(2)所示
3、损失函数
全部使用平方和误差,但是有3个明显问题:
1)位置损失和类别损失不能具有相同的权重
2)大部分的grid cell不具有object,导致训练初期都为0,训练不稳定
3)平方和误差对于大box和小box的惩罚程度不同,导致小目标惩罚过轻
作者对此采取了一些措施:
1)使用两个参数λcoord=5和λnoobj=0.5来控制bbox损失和无目标预测的损失
2)使用宽高的平方根来计算位置损失,减少大小目标惩罚程度不同的问题
整体损失函数如公式(3)
其中:
代表在gridcell i出现
代表在gridcell i 和bbox j 出现目标
YOLOv2
1、背景
- 2017CVPR
- 相比较YOLOv1mAP提升10+%,并且检测速度更快
- 使用目标检测数据及学习定位,使用分类数据及学习类别判断,因此可以检测超过9000个类别,又称YOLO9000
2、相比较YOLOv1的改进
2.1 Batch Normalization
- 提升mAP约2%
- 帮助正则化模型,移除了所有的dropout
- 注意:卷积之后加入BN,卷积层的bias可以去掉了,因为其值可由bn层的平移因子代替
2.2 High Resolution Classifier
- 先使用448*448的输入尺寸的ImageNet训练分类网络10个epoch(YOLOv1中是使用224的输入尺寸训练,然后直接应用到448输入的检测中)
- 提升4%的mAP
2.3 Convolutional With Anchor Boxes
- 移除fc层,使用anchor boxes来预测bbox,模型预测偏移量而不是绝对坐标使得网络更易于学习
- 去掉pooling层,让输出有更高的分辨率
- 输入图片从448调整为416,使得特征图有一个绝对的中心位置,便于预测超大目标
- 下采样倍数为32,从416到13
- mAP降低0.3%,recall提升7%,意味着模型有更大的提升空间
2.4 Dimension Clusters
- 使用k-means方法做anchor设置
- 聚类的距离公式如下,这使得priors带来一个优质的IOU score
2.5 Direct location prediction
在使用anchor boxes时,遇到的一个问题是,模型不稳定。特别是在模型训练的早期,这是由于box中心位置(x, y)的预测导致的。坐标转化的公式如下:
注意,这里有人认为原文的公式错误,应该是x=(tx *wa) + xa, y=(ty*ha)+ya,但我觉得这里的转换可以通过参数学习来决定,xa or -xa是可以学习到的,因此正号还是负号对模型来说没有影响
而tx, ty没有限制,则任何一个anchor转化后的x, y可以漂移到图像的任何一个位置
因此模型在学习的初始阶段需要很长时间才能预测初合理的偏移量
因此,YOLOv2遵循v1的思路,预测gridcell的相对便宜量
具体的做法是,每个bbox预测的5个值为:
其中:
- tx ty, tw, th为预测的位置,to为有目标的置信度,cx, cy为anchor中心相对于13*13gridcell中的某个cell相对于图片左上角的偏移量分数
- σ为sigmoid函数,将相对gridcell的位置映射为0-1之间
- pw,ph是bbox 的prior的宽和高
- 可视化的转化如Fig3所示
- 使用anchor聚类+相对预测的方法,提升5%mAP
2.6 Fine-Grained Features
- 修改后的YOLO预测输出的特征图尺寸为13*13,这对大目标很友好,但是小目标检测效果不好,因此作者增加了以下改进
- 添加一个passthroungh层来使用前面的26*26的卷积输出,concate到输出层,将26*26*1024转化为13*13*2048
- 提升约1%
2.7 Multi-Scale Training
- 每10个batch,随机选择一次图片尺寸,以32为一个尺度:{320, 352, 608},共10个尺度
3、网络架构
3.1 backbone
- 相比较YOLOv1使用Googleenet,v2使用DarkNet-19,类似vgg使用了大多数的3*3卷积核,在pooling之后翻倍通道数
- 具有19个卷积层和5个maxpooling层,91.2%top-5 accuracy高于VGG16(90%)
- 网络层架构图
3.2 Training for classification
3.3 Training for detection
- 移除最后一个卷积层
- 增加一个1*1卷积层,对于VOC 预测5个boxeshe 5个坐标+20个类别,总共125个通道;5个boxes的原因是之前聚类的anchor的k=5
- 增加一个passthrough层来利用低级别特征,修改后的网络如下图
- 一个小细节,论文给出的passthrough layer为26*26*1024-> 13*13*2048,而源码中的实现为经过了一个1*1的conv进行通道缩减,然后输出为13*13*256
- 每个卷积块如上图右上所示:convolutional包括一个不含bias的conv2d、一个bn层和一个Leaky Relu构成
- PassThrough 层的操作如下
3.4 联合训练策略
- 混合了分类数据及和目标检测数据及,当网络推理的是分类图片,仅回传分类损失;当推理的是检测图片,回传整个损失
3.5 训练细节
- 论文没有对正负样本、损失函数进行介绍,具体细节见源码
YOLOv3
1、背景
- 2018CVPR
- 整体感觉:无较大创新点,整合了当时网络的一些优点和tricks
- 在工业界应用非常广泛
2、结构介绍
2.1 backbone
- 直接看图,Darknet-53,具有53个卷积层,其top5 acc与resnet152持平,速度为其2倍
几个细节:
1)使用卷积块堆叠+残差的结构,利用了VGG与ResNet的优点
2)与resnet不同的是,使用convolutional代替maxpooling进行下采样
3)convolutional由3个部分构成,Conv2d(No bias)->BN层->LeakyReLU
残差和Convolutional的结构如下图所示:
2.2 Bounding box设置
- 使用与YOLO9000相同的策略,聚类确定anchor种类
- 网络预测4个坐标, tx, ty, tw, th
- anchor的中心距离图片左上角的偏移为cx, cy;pw, ph为anchor的宽高,则转化目标边界框的坐标为
- 使用逻辑回归预测其中的objectness score。其中,若某个anchor的预测与obj的交叠比在该图片中最大,则其值为1;若不是最大,但大于阈值0.5,则忽略该预测,即计算loss时忽略该部分loss
- 每个gt object只匹配一个anchor预测
- 没有匹配到gt object的anchor预测,只计算objectness loss,不计算coor和class loss
- 这个部分仍然使用平方和损失
2.3 Class Prediction
- 使用独立的逻辑回归预测类别
- 使用二值交叉熵损失函数
- 目的是方便预测多标签,适应重叠目标等问题,softmax只能输出单一类别
2.4 跨尺度预测
- 在3个不同的尺度特征下进行boxes预测
- 在COCO数据集下,每个尺度预测3个boxes,每种尺度的输出形状为:N*N*(3*(4+1+80)),其中N是特征尺寸,3代表3个box,4代表tx,ty,tw,th,1代表objectness score,80是COCO的类别数
- 然后将两个卷积层以前的特征 upsampling * 2,并与网络前一尺度的特征concate,然后使用几个卷积层输出同样的预测结果,N变为原来的2倍
- 重复该操作至最后一个尺度
- 使用k-means聚出9个类,然后在3个尺度上均匀划分成3*3,在COCO上的设置为:(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)。(注意:小尺寸的anchor添加到大特征图中,大尺寸的anchor添加到小特征图中)
2.5 整体架构
这里直接使用csdn博主@太阳花的小绿豆 画出的一幅图来说明
2.6 训练
- No HNM
- 使用了多尺度训练
- 使用了很多数据增强
- 添加BN层
4、其他论文中没有的点:
1、特征提取网络
1)全卷积网络,无pooling层,对输入尺寸不固定
2)网络下采样的stride参数,用来表示被下采样的倍数,例如stride=32,输入尺寸/输出特征尺寸==32
2、Output
1)使用1*1卷积来生成输出
2)输出的feature map中的一个单元的长度是(B x (5 + C)) ,B代表每个cell预定义个anchor,5代表YOLO经典的坐标+目标分数,C代表类别数
一个感性的理解:
若原始图片中的目标的中心位置,存在于某个输出特征的cell的感受野中,这个目标就应该是该cell预测出来的
因此,首先要做的是:将输入图片划分为等于输出特征数量的grid
假设输入图片是416*416,网络的stride是32,那么输出特征尺寸是416/32=13
因此将输入图片划分为13*13的grid,如下图
其中,红色的就是目标的中心位置,处于grid的第7行,第7列
那在Feature Map中的位置也是第7行第7列,包含3个box,每个box展开都是(B x (5 + C))个元素
2.1 Anchor Boxes
1)YOLOv3的每个预测单元有3个anchor,对应着3个bbox
2)确定哪一个bbox是以及其anchor对应正样本的规则是:取所有的bbox中,与gtIOU最大的那个
2.2 Making Predictions
bx, by, bw, bh就是最终的预测的坐标值
tx, ty, tw, th是网络的输出
cx, cy是anchor的中心/也是该gridcell的左上角距离图片左上角的距离
pw, ph是anchor的宽高
其中的一些细节:
1)使用sigmoid函数sigmoid(tx)、sigmoid(ty)的原因:使用基于gridcell尺寸的归一化,对训练相对更稳定
例如:在13*13的输出特征中,假设sigmoid(tx)、sigmoid(ty) = (0.4, 0.7)、在第6个cell中,那么该box的中心坐标为:
- bx = 6.4
- by = 6.7
2) tw、th应用了log函数,然后乘以anchor的宽高pw, ph(归一化后),因此假设:bw, bh = (0.3, 0.8),则
- 实际w = 0.3*13
- 实际h = 0.8*13
3) Objectness Score:原文中作者说该值为0/1的离散值,但是具体caffe实现中,把其计算方式改为sigmoid的离散值
4) Class Confidences:
- YOLOv3之前,作者使用的softmax做类别预测
- v3作者改为sigmoid代替,原因是方便支持多类以及重叠目标
5)多尺度预测
- 使用了3种尺度预测,stride分别为: 32, 16, 8,也就是说当输入尺寸为416时,输出的多尺度 特征尺寸分别为: 13*13 26*26 52*52
- 每种尺度的特征使用upsampling 操作,并与前一尺寸的特征进行concate操作,生成下一尺度的预测特征
6)Output Processing 对于每个416*416的图片,网络预测的bbox数量为:((52×52)+(26×26)+(13×13))×3=10647个,然而实际图片中的目标数量很少,接下来就是如何减少冗余预测的方法
- Objectness score: 首先,使用过滤objectness score < 阈值的bbox
- NMS过滤同一对象的预测
参考文献
【1】Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[C]// Computer Vision & Pattern Recognition. IEEE, 2016.
【2】Redmon J , Farhadi A . YOLO9000: Better, Faster, Stronger[C]// IEEE Conference on Computer Vision & Pattern Recognition. IEEE, 2017:6517-6525.
【3】YOLOv3: An Incremental Improvement
【4】https://blog.csdn.net/qq_37541097/article/details/81214953
【5】https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/