#You Only Look Once#
一.前言
这一篇我们将进入YOLOV1的学习。
传统的一些目标检测系统大多采用重用分类器来执行检测,计算量大,检测时间长。
- DPM(Deformable Parts Model)采用传统的SVM分类器,通过人工制造模板,使用滑动窗口方法暴力搜索整个待识别框
- R-CNN通过region proposal(待选区域)产生大量的可能包含待检测物体的bounding box(边界框),再使用分类器去判断这些bounding box中是否存在物体以及物体的所属类别probability和confidence,最后再回归预测
本篇介绍的YOLOV1是目前比较流行的目标检测算法,速度快、结构简单
二.YOLOV1的特点
与传统的目标检测算法不同:
1. YOLO将目标检测看作是一个单一的回归问题,使用单个神经网络,直接从图像像素得到边界框、类别概率、置信度,是一个端到端的目标检测模型,它可以分别出哪些对象是存在的,它们在哪里。
2. YOLO在整个图像上训练,并能直接优化检测性能。
问题:什么是端到端?
端到端:指的是输入的是原始数据,输出的是最后的结果。
这样做缩减了人工预处理和后续处理,增加模型整体的契合度
优点:
1. YOLO的速度非常快
2. YOLO在整个图像上进行推断,背景误检测率低YOLO在训练和测试的时候都会顾及整个图像,隐式地包含了类的上下文信息,与Fast R-CNN相比,YOLO将背景误检测的数量少了一半
3.YOLO具有泛化表征的能力
缺点:
1. YOLO无法很好地检测小物体
原因:
①YOLO对其边界框施加了很强的空间约束
的每个网格单元只能预测两个框,且只能包含一个类,限制了我们预测邻近的小目标的数量。
②YOLO很难泛化新的不常见的长宽比的目标
论文中这样说:
1)YOLOV1将图片分成S×S的网格(论文中是7×7的网格),网络到后面的感受野较大,小目标的特这边给无法在后面的7×7grid中体现
2)网格只有7×7,当两个物体靠的很近(它们的中心点都落入同一个cell中),YOLO只能预测出其中的一个,因此丢失了很多目标
3)每个网格只有两个bounding box,当待识别的物体长宽比不常见时效果就很差
不过,YOLOV2会在这个基础上加入anchor,提高了对于小目标检测的鲁棒性。
三.YOLOV1的检测方法
3.1 图像特征的组成
YOLO将输入的图像划分成S×S的网格,当物体的中心点落入其中的一个网格中,这个网格就负责预测该物体,一个网格只能预测一个物体且只能预测一个类别(缺点),会生成两个预测框。
S×S个网格,每个网格需要预测B个bounding box和C个类
对于每个网格:
1)预测B个预测框(生成框的中心点必须在网格中)
2)每个预测框包含5个元素(x,y,w,h,c)
x、y:bounding box预测框的中心坐标相对于该box归属的网格左上角的偏移量(0-1之间)
在上图中,绿色虚线框代表grid cell,绿点表示该grid cell的左上角坐标,为(0,0);红色和蓝色框代表该grid cell包含的两个bounding box,红点和蓝点表示这两个bounding box的中心坐标。有一点很重要,bounding box的中心坐标一定在该grid cell内部,因此,红点和蓝点的坐标可以归一化在0-1之间。在上图中,红点的坐标为(0.5,0.5),即x=y=0.5,蓝点的坐标为(0.9,0.9),即x=y=0.9。
w、h:是指该bounding box的宽和高,但也归一化到了0-1之间,表示相较于原始图像的宽和高(即448个像素)。比如该bounding box预测的框宽是44.8个像素,高也是44.8个像素,则w=0.1,h=0.1。
红框的x=0.8,y=0.5,w=0.1,h=0.2。
3.2 网络设计
YOLO的网络结构参考GoogleNet(如何参考?待写)
输入图像尺寸为448×448,共经过24个卷积层,2个全连接层,最后reshape输出图像大小为7×7×30(30 = B * 5 + C) ,此时B = 2,C = 10
- CNN网络预测生成7×7×1024的张量
- 两个全连接层执行全连接回归,进行7×7×2边界框预测
- 各层使用Leaky ReLU,最后一层使用线性激活函数
- 训练时采用Dropout和数据增强避免过拟合
- 定义置信度(预测框与真实标签框之间的联合部分的交集IOU)
confidence = Pr(Object) * IOU_pred truth
若单元网格中存在目标则Pr(Object) = 1,反之为0--->confidencr = 0 - 预测C类的条件概率
Pr(Classi | Object) (前提:网格单元包含目标) - 每个框的特定类别的置信度分数
Pr(Classi | Object) * Pr(Object) * IOU_pred truth = Pr(Classi) * IOU_pred truth
注意:这些分数既是对该类出现在框里的概率的编码,也是对预测的框与目标匹配程度的编码
3.3 损失函数
共分为3类损失:坐标损失(localization)、置信度损失(confidence)、分类损失(classification)
1)置信度和分类预测损失不多说:
置信度损失 = 对于obj负责的box(1)来预测损失(第一行)+ 不对obj负责的box(1)预测损失(第二行)
简而言之:
- 第一行: 负责检测物体的那个框的置信度误差。
- 第二行: 不负责检测物体的那个框的置信度误差。
分类损失 = 对obj负责的框预测损失
2)这里最需要注意的就是坐标损失
正常情况下:我们总秉持着一视同仁的原则,但这会给YOLO的坐标损失带来很大的误差
可现实情况不允许,存在着大小框。
如果大框的损失大一点,不会带来什么问题,bounding box肯定也还会在物体周围,
但是如果小框的损失一大,那么bounding box会带来巨大的偏差
采用了开根号处理,让小框损失权重更大,惩罚机制就会对小框损失的惩罚加重。
参考文章:https://blog.youkuaiyun.com/weixin_43334693/article/details/129011644