YOLO v1算法详解

YOLO是一个EndToEnd目标检测的算法,相比于基于候选区域的目标检测算法(eg:RCNN,Fast RCNN等)速度更快,并且结构简单。

原论文地址:You only look once unified real-time object detection


简介

与先找到候选区域,然后对候选区域进行分类的多阶段目标检测算法不同,YOLO将目标识别看成一个回归问题,单个神经网络完成对整个图像目标边界框和类别概率的预测;

YOLO V1模型

该模型的核心理念如图1所示,将图像划分成S*S个单元格,每个单元格都要预测B个边界框(Bounding Box),每个边界框需要包含x,y,w,h,confidence五个预测值,其中(x,y)是边界框的中心点坐标,(w,h)是边界框的长和宽,codifdence是该边界框的置信度;
其中,(x,y)代表当前边界框的中心点相对于该中心点所在单元框的偏移,范围在(0,1);(w,h)代表边界框的长和宽除以图片的长和宽大小,范围也在(0,1);每个边界框的置信度代表边界框中含有目标可能性的大小以及边界框的准确度,训练过程中的表现形式是: P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU_ {pred} ^{truth} Pr(Object)IOUpredtruth;当单元框中不包含目标时, P r ( O b j e c t ) = 0 Pr(Object)=0 Pr(Object)=0,所以置信度为0;当单元框中包含目标时, P r ( O b j e c t ) = 1 Pr(Object)=1 Pr(Object)=1 I O U p r e d t r u t h IOU_ {pred} ^{truth} IOUpredtruth代表预测框与实际框之间的交并比;
如何判断单元框中是否包含目标?
如果一个物体真实框的中心点坐标在一个单元格内,那么该单元格就包含此目标。
除此之外,每个单元格还会预测C个条件类别概率 P r ( c l a s s ∣ O b j e c t ) Pr(class|Object) Pr(classObject),以单元格含有目标为条件;
在测试过程中,置信度使用边界框类别置信度表示:
Pr ⁡ ( Class i ∣ Object ) ∗ Pr ⁡ ( Object ) ∗ IOU pred truth = Pr ⁡ ( Class i ) ∗ IOU pred truth \Pr(\textrm{Class}_i | \textrm{Object}) * \Pr(\textrm{Object}) * \textrm{IOU}_{\textrm{pred}}^{\textrm{truth}} = \Pr(\textrm{Class}_i)*\textrm{IOU}_{\textrm{pred}}^{\textrm{truth}} Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth
表示该边界框中目标属于各个类别的可能性大小和边界框预测的准确性;

YOLO v1算法详解_第1张图片
总结来说,如果一个图像划分成SS个单元格,每个单元格预测B个边界框,需要预测的目标类别为C个,则最后预测值的规模为SS*(B*5+C)。

YOLOV1借鉴的是GoogleLeNet模型,包含24个卷积层,后面是两个全连接层。卷积层主要是用来提取特征,全连接层用来预测类别和坐标。模型输出的大小是7730,其中前20个是每个类别的概率,后两个元素是对应边界框的置信度,最后8个元素代表每个边界框的(x,y,w,h)数值。
这里写图片描述
YoLo将目标检测转化成一个回归问题,损失函数包含分类损失和定位损失两个部分,但是对于每个部分采用不同的权值大小,原论文中说是权重一致时容易导致发散。由于大部分单元框中不包含目标,很多单元框的置信度为0,所以会影响到包含目标的单元格梯度,对于置信度损失,单元框包含目标与不包含目标也需要采用不同的权值。
在这里插入图片描述

前两行是定位误差,对于定位误差,采用较大的权值 λ c o o r d = 5 \lambda _{coord}=5 λcoord=5,而且相同的长和宽误差小的的边界框往往比大的边界框更加敏感,所以使用长和宽的平方根进行预测。
第三行和第四行是边界框的置信度误差。对于不包含目标的边界框采用较小的权值 λ n o o b j = 0.5 \lambda _{noobj}=0.5 λnoobj=0.5
最后两行是预测类别的误差。
1 i j o b j 1^{obj}_{ij} 1ijobj:第i个单元格存在目标,且该单元格中的第j个边界框负责预测目标
1 i o b j 1^{obj}_{i} 1iobj:第i个单元格存在目标
由于每个单元框预测多个边界框,但是每个单元框只对应一个类别,所以在单元格含有目标的前提下,选择边界框与真实框IOU最大的边界框进行类别预测,其他的边界框认为不存在目标。

训练过程

  1. 先使用ImageNet数据集对网络进行预训练,预训练的分类模型是前20层,然后添加一个average-pool层和全连接层。
  2. 取预训练前20层的权重值,然后在随机初始化4个卷积层和2个全连接层作为训练模型。预训练时输入大小是224224,但是在YOLO中采用更高的分辨率:448448;同时,将Relu层改为PReLu,即x<0时,激活值是0.1*x,而不是传统的0;最后一层使用线性激活函数。
  3. 输入N个图像,每个图像包含M个类别,每个类别包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7730大小的三维矩阵。前20个元素是单元格每个类别的概率,后两个是对应边界框的置信度,最后8个元素是每个边界框的(x,y,w,h)
  4. 计算损失函数

测试过程

  1. 输入一张预测图片,得到7730大小的向量;其中边界框坐标部分778,边界框的置信度为772,类别概率为7720;边界框类别置信度可以通过置信度772和类别概率相乘得到,但是需要各扩充一个维度,即[7721][77120],类别置信度为[77220]。
  2. 然后将小于阈值的类别置信度置为0,并按照从大到小进行排序。
  3. 使用NMS处理所有的边界框,将重叠度较大的边界框置信度设为0;
  4. 从剩下的边界框中选择最大概率值的索引作为该边界框的类别

##优点

  1. 训练和预测速度快;每秒可以处理45帧图像
  2. 泛化能力比较强,模型鲁棒性较高
  3. YOLO在进行训练和预测时,使用整张图片进行推理,有更大的检测视野,不容易对背景进行误判

##缺点

  1. 每个单元格仅仅预测两个边界框,并且属于同一类别,当两个不同类别物体的中心坐标在同一个单元框中只能识别一种类别。
  2. 在定位方面还存在较大的误差,对于小目标的检测不尽如意。因为大边界框的小误差通常是良性的,但小边界框的小误差对IOU的影响要大得多

##参考

  1. YOLO算法的原理与实现
  2. YOLO(You Only Look Once)算法详解

你可能感兴趣的:(深度学习)