[TOC]
YOLO V1
网络结构
Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如图8所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数: 。最后一层采用线性激活函数。
算法流程
将一幅图像分成个网格(grid cell),如果某个物体的中心落在这个网格中,则这个网格就负责预测这个物体。每个网格要预测个bounding box,每个bounding box预测坐标区域和置信度(confidence score)共5个值,每个网格还要预测个类别categories信息。输出是的一个张量(tensor)。
这样,当,,时,输出是一个的张量。
置信度包含两个方面,一是这个边界框含有目标的可能性大小,取0或1。二是这个边界框的准确度。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union)来表征。置信度就是二者的乘积。
各个边界框类别置信度(class-specific confidence scores):
得到每个bounding box的边界框类别置信度,设置阈值滤掉得分低的,对保留的bounding boxes进行非极大值抑制NMS(non-maximum suppresssion)处理,就得到最终的检测结果。
损失函数
在实现中,最主要的就是怎么设计损失函数,坐标,confidence,classification 让这个三个方面得到很好的平衡。简单的全部采用sum-squared error loss。
缺点 | 解决方案 |
---|---|
坐标预测误差中,面积小的box对误差更敏感 | 对宽和高用了平方根让算法对小box预测的偏移更加敏感 |
8维的localization error和20维的classification error同等重要不合理的 | 更重视8维的坐标预测,赋予更大的loss weight, 在pascal VOC训练中取5 |
如果一个网格中没有目标(一幅图中这种网格很多),那么就会将这些网格中的box的confidence置0,相比于较少的有目标的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散 | 对没有object的box的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5;有object的box的confidence loss和类别的loss的loss weight正常取1 |
只有当某个网格中有目标的时候才对classification error进行惩罚;只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚。对哪个ground truth box负责根据其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。
YOLO V2
下表显示了YOLO v1到v2做的改进已经每个改进分别带来的增益。
新特性
Batch Normalization
提升模型收敛速度,起到一定正则化效果,降低过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput,mAP提升了2.4%。
High Resolution Classifier
YOLOv1在采用 分类模型预训练后,将分辨率增加至,并使用这个高分辨率在检测数据集上finetune。YOLOv2增加了在ImageNet数据集上使用输入来finetune分类网络这一中间过程(10 epochs),mAP提升了约4%。
Convolutional With Anchor Boxes
YOLOv1用全连接层来预测边框,运算量大、可选项多不易训练。Faster R-CNN用预先设定的anchor用卷积层确定边框的偏移量。根据先验的anchor box预测偏移量要比直接预测边框值容易多了。YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。为了使检测所用的特征图分辨率更高,移除其中的一个pool层。在检测模型中,不是采用,而是采用 大小。这样下采样后得到特征图。特征图维度是奇数,这样中心位置落在一个框内而不是4个相邻框。
YOLOv2中,类别预测和位置预测依然是分开的。同YOLOv1,通过IOU来判断边框内是否有物体,分类预测是一个条件概率(已知有物体则属于某类的条件概率)。
使用anchor boxes之后,mAP有稍微下降但召回率由81%升至88%。
Dimension Clusters
在Faster R-CNN和SSD中,先验框的参数(宽和高)都是手动设定的。选取的先验框参数合适,模型更容易学习。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。
Direct Location Prediction
虽然有了先验的anchor box,但实际上通过偏移量进行调整是无约束的,训练起来容易发散,影响模型稳定性。YOLOv2预测边界框中心点相对于对应cell左上角位置的相对偏移值。使用sigmoid函数这样预测的偏移值限定在(0,1)范围内(每个cell的尺度看做1),这样边界框的中心位置会约束在当前cell内部,不会偏移过多。根据边界框预测的4个偏移值 ,可以按如下公式计算出边界框实际位置和大小:
其中是先验框的宽度与长度,是相对于特征图大小的。注意的是,这里的相关运算都是在特征图上做的。再结合聚类分析得到先验框,YOLOv2的mAP值提升了约5%。
Fine-Grained Features
为了解决对面积较小的物体分辨率不够而提出的用更精细的特征图来预测小物体的一个方案。
Multi-Scale Training
由于YOLOv2模型中只有卷积层和池化层,所以输入可以不限于大小的图片。为了增强模型的鲁棒性,采用多尺度输入训练策略:训练过程中每间隔一定的迭代之后改变模型的输入图片大小。
训练
包括三个阶段。
- 先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为,共训练160个epochs。
- 将网络的输入调整为,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。
- 第三个阶段就是修改Darknet-19分类模型为检测模型,并在检测数据集上继续finetune网络。网络修改包括(网路结构可视化):移除最后一个卷积层、global average pooling层以及softmax层,并且新增了三个卷积层,同时增加了一个passthrough层,最后使用卷积层输出预测结果,输出的channels数为。
Loss Function
YOLO在TensorFlow上的实现(darkflow)和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的5个先验框所对应的边界框中那个与ground truth的IOU最大的边界框预测它,而剩余的4个边界框不与该ground truth匹配。YOLOv2同样需要假定每个cell至多含有一个grounth truth,而在实际上基本不会出现多于1个的情况。与ground truth匹配的先验框计算坐标误差、置信度误差(此时target为1)以及分类误差,而其它的边界框只计算置信度误差(此时target为0)。YOLOv2和YOLOv1的损失函数一样,为均方差函数。源码中复杂一些( YOLO v2 损失函数源码分析)。
YOLO9000
YOLO9000是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。在YOLO中,边界框的预测其实并不依赖于物体的标签,所以YOLO可以实现在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。
YOLOv3
最大的变化包括两点:使用残差模型和采用FPN架构。YOLOv3的特征提取器是一个残差模型,因为包含53个卷积层,所以称为Darknet-53,从网络结构上看,相比Darknet-19网络使用了残差单元,所以可以构建得更深。另外一个点是采用FPN架构(Feature Pyramid Networks for Object Detection)来实现多尺度检测。
Reference
https://www.jianshu.com/p/d147b94df939
https://zhuanlan.zhihu.com/p/32525231
https://zhuanlan.zhihu.com/p/38125721
https://zhuanlan.zhihu.com/p/25045711
https://www.cnblogs.com/zyly/p/9274472.html