简述
yolov1算法特点就是快,在TitanX显卡上可以做到45FPS的检测速度,小网络版本可以做到155FPS,非常适合用于实时检测。快的原因如下:
- rcnn等二阶段算法主要思想是分类,将各种问题通过分类解决,而yolo提出了新的解决方式就是回归。
- 将候选区和检测两个阶段进行合并,其实并没有放弃候选区,而是将其简化,直接暴力将图像进行划分s * s的格子(论文说的是7 * 7),所以一张图片会编程7 * 7=49个格子,每个格子会生成两个边界框也就是一张图片现在有49个格子和98个边界框覆盖整个图片。
工作流程
- 首先将图像分成S * S的格子(论文中是7 * 7)
- 如果需要识别的物体中心落在了某个格子中,那么这个格子中的标注框IOU最大的边界负责预测该物体,并且每个格子生成B个预测框(这里是2个)
- 每个边界框会有5个预测值分别是:x, y, w, h, c(x,y是中心点,w,h是相对于原图像宽高比,c是类别的概率并不包含背景)
- 此时图像中会出现大量的可能的预测bbox框如下,使用非极大值抑制(NMS)算法来筛选
非极大值抑制M(NMS)算法如下:
- 设置一个置信度的阈值,一个IOU的阈值
- 对于每类对象,遍历属于该类的所有候选框
- 去掉置信度低于阈值的框
- 将剩下的候选框根据置信度进行排序(降序),找出置信度最大的框
- 将剩下的候选框分别和4中跳出来的最大置信度框进行对比,计算两个框的IOU,若大于IOU阈值就会被舍去(认为两个识别的是一样的,保留最大置信度bbox),如果不是则保留
- 重复进行5直到全部保留
- 筛选后结果应该如下
公式分析
loss
loss主要分成三部分:坐标预测、分类预测、置信度预测
- 坐标预测
其中s代表划分的格子,B代表每个格子生成的框数量,代表第i个网格中第j个bbox是否有obj这个类。剩下的就是平方差公式了,这里w和h采用平方根原因如下:
- 缩放不变性:
使用平方根可以减少大尺寸边界框和小尺寸边界框之间的预测误差差异。如果直接使用,那么对于较大的边界框来说,即使是微小的预测误差也可能导致较大的损失贡献,而对于小的边界框而言,即使预测误差相同,其损失也会相对较小。使用平方根可以使得不同尺寸的边界框在损失函数中的权重更加均衡。
- 平衡损失:
直接使用可能会导致宽高较大的边界框在损失函数中的贡献过大,从而影响模型的整体优化。通过取平方根,可以在一定程度上减小这种影响,使得模型在训练过程中更加关注边界框的相对位置而不是绝对大小。
- 避免梯度爆炸:
在训练过程中,较大的边界框尺寸可能导致较大的梯度更新,从而增加训练的不稳定性。使用平方根可以帮助减缓这种效应,使得训练过程更加稳定。
-
分类预测
-
置信度预测(包含两个:含有物体边界框,不含有物体边界框)
其中系数一幅图片大部分都是背景,导致这些背景网格对于梯度更新贡献更大,导致不稳定,为了平衡数据将背景loss的系数降低,提高有目标的系数(文中noobj=0.5,obj=1)
优缺点
优点
- 快就完了嗷嗷快
- 对比二阶段方法,yolo把背景中不存在物体,但是识别成物体,这种错误会率会比较低,因为划分的格子较大,对于小物体不友好。
- 能够学到更加抽象的物体特征,适合迁移到其他领域(艺术)
缺点
- yolo网格设置比较稀疏,每个网格只有两个bbox,精度不够高
- 对于密集或者小物体不好,因为每个格子只能划分一类(例如一个格子有多个物体,但是结果只能是一类)如下每个颜色代表一类: