论文:You Only Look Once:Unified,Real-Time Object Detection
https://arxiv.org/abs/1506.02640
代码:GitHub - pjreddie/darknet: Convolutional Neural Networks
作者:Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi, et al.
发布时间 :CVPR, 2016
优缺点/总结
优点
- 单阶段算法,实现端对端的目标检测
- 速度快,能够达到实时要求
- 使用全图作为信息,背景错误(把背景错认为物体)比较少。
- 泛化能力强
缺点
- 每一网格只能识别一个目标物体,7x7的网格最多能预测出49个物体,所以YOLOv1在小目标和密集目标识别性能差
- 对测试图像中,同一类物体出现的新的不常见的长宽比时泛化能力偏弱
- 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。
模型的改进
- 统一网络:YOLO没有显示求取region proposal的过程。Faster R-CNN中尽管RPN与fast rcnn共享卷积层,但是在模型训练过程中,需要反复训练RPN网络和fast rcnn网络。相对于R-CNN系列的"看两眼"(候选框提取与分类),YOLO只需要Look Once.
- YOLO统一为一个回归问题,而Faster R-CNN将检测结果分为两部分求解:物体类别(分类问题)、物体位置即bounding box(回归问题)
解决的问题
- one-stage算法,与RCNN系列two-stage算法相比,输入图像只经过一个网络,生成的结果包含位置和类别信息,提升了检测速度
模型
- 核心思想:利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别
- 大体流程:将输入图片Resize到448 x 448,然后送入CNN网络学习图像特征,最后处理网络预测结果得到检测目标
结构
1、将一幅图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object
2、每个grid cell都会生成B个 Bounding Box 去进行物体的框定和分类,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值
3、Confidence包含两方面,边界框含有目标的可能性以及边界框的准确度,计算方法如下:
含义:如果有object落在一个grid cell里,则第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值
4、利用NMS (非极大值抑制) 算法得到最后的final 的detections
5、对于每一个单元格要给出C个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率,即
6、各个边界框的类别置信度:
7、每个单元格需要预测(B*5+C)个值。输入的图片为S x S网络,因此最终的预测值为S x S x (B x 5 + C)大小的张量
网络结构
在PASCAL VOC中,图像输入为448x448像素,取S=7,B=2,一共有20个类别(C=20),则输出就是7x7x(2x5+20)的一个tensor。整个网络结构如下图所示(参考GooLeNet模型):
- 检测层包括24个卷积层和2个全连接层
- 最后输出为7 x 7 x 30,代表一共49个cell,每个cell拥有30个值,其中20个值为类别的概率值,即该cell检测出来的属于某类物体的概率,剩下的10个值分别代表cell两个Bounding Box各自的参数部分
-
- (x,y,w,h,c)其中(x,y)是边界框的中心坐标,w和h是边界框的宽与高。
- (x, y)是相对于每个单元格左上角坐标点偏移值,并且单位是相对于单元格大小的,而w和h预测值是相对于整个图片的宽和高的比例,这样理论上4个元素的大小在[0, 1]范围内
- 每个边界框的预测值实际上包含5个元素:(x, y, w, h, c)。前四个元素表征边界框的大小和位置,最后一个值是置信度
- c =
-
-
- 如果在grid cell里没有物体存在,则Pr(object)=0,存在的意思是指物体的ground truth中心点在这个cell里面。
-
-
- 一个grid cell里面虽然有两个Bounding Box, 但是它们共享同一组分类概率,因此同一个cell只能识别同一个物体
训练阶段
1、在训练集上已经标出了真实目标的检测框,而算法要使得预测框尽量去拟合真实检测框。
2、真实检测框的中心点落在哪个网格中,就需要哪个网格生成的预测框去拟合真实的检测框。每个网格生成两个预测框,那么就需要这两个预测框中的一个框去拟合真实检测框。并且这个网格输出的类别也必须是该真实检测框的类别。
3、如下图,蓝色实线框是真实检测框,中心点落在红色网格中,该网格生成了两个预测框,黄色和橘色虚线框。预测框和真实框的IOU交并比大的预测框负责拟合真实框,下图就是黄色虚线框来拟合真实框。调整预测框尽量逼近真实框的样子,让交并比小的预测框的置信度越小越好。
预测阶段
1、在模型已经训练好之后,输入[448,448,3]的图片,输出[7,7,30]的特征图,输出的 tensor 中包含了所有预测框的坐标,置信度,类别结果
2、对98(49 x 2)个预测框通过NMS进行筛选过滤,去除低置信度的预测框,重复的预测框只保留一个,获得最终的目标检测结果
- 每个网格包含2个预测框参数和20个类别的条件概率(5+5+20)
- 将每个预测框的置信度和每个网格属于20个类别的条件概率相乘,得到网格真正属于某个类别的概率
- 每个网格有2个概率向量,每个向量有20个元素,7x7个网格就有98个向量
- 以狗这个类别为例,某些预测框计算出的狗这个类别的概率很小,现在设置一个阈值如0.2,将所有检测框预测狗的概率小于0.2的概率值全部变成0,然后按照狗类别的概率值高低排序所有的预测框
- 对排序后的预测框使用非极大值抑制NMS
-
- 删除重复框
-
-
- 先把概率值最大的预测框拿出来,然后把剩下的预测框逐一和概率最大的预测框比较,如果两个框的IOU(交并比)大于某个阈值,就认为这两个检测框重复识别了同一个目标物体,把低概率的预测框过滤掉(变为0),把交并比满足要求的预测框保留下来
- 接下来再把概率值第二高的预测框拿出来,和剩下的预测框逐一计算交并比。蓝框和紫框的交并比超过阈值,表示重合,概率值小的紫框的概率值置为0。同理依次对所有预测框比较。
-
-
- 最终比较完剩下橘框和蓝框预测结果是狗被保留下来,然后分别对这20个类别使用NMS,最终的计算结果一个稀疏矩阵,有很多元素被置为0。将98个预测框中概率值不为0的框找出来,找到类别索引和概率值,就能获得最终的目标检测结果。
Tricks
1、测试阶段没有真实框计算IoU
YOLO的objectness的学习标签就是预测框和真实框之间的IoU,所以,在测试阶段,这个IOUpredtruth 其实就是指YOLO预测的objectness,它的物理意义就是:这个grid cell是否有物体。所以可以认为objectness隐含了IoU的概念,但本质就是有无物体的预测。
Prediction
- 预测阶段,通过输入图片得到识别的结果
- 图片输入神经网络会输出一个7*7*30的张量,我们需要对其进行分析得到很多个bbox包括坐标信息以及对应的物体类别信息,最终进行NMS非极大值抑制对bbox进行筛选得到最终结果
-
- 以下为NMS的步骤:
(1)对于类别1, 从概率最大的bbox F开始,分别判断A、B、C、D、E与F的IOU是否大于设定的阈值。
(2) 假设B、D与F的重叠度超过阈值,那么就扔掉B、D(将其置信度置0),然后保留F。
(3) 从剩下的矩形框A、C、E中,选择概率最大的E,然后判断A、C与E的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
(4) 重复这个过程,找到此类别所有被保留下来的矩形框。
(5) 对于类别2,类别3等等...都要重复以上4个步骤。
Objective Function/Loss Function
- 红色圈代表的是坐标误差,第一个是负责检测物体的预测框的中心点定位误差:预测框和真实框在横纵坐标上尽可能的一致。第二项是负责检测物体的预测框的宽高定位误差:预测框的宽高要和真实框的宽高尽可能一致,求根号能使小框对误差更敏感。
- 绿色圈为IoU误差,第一项负责检测物体的预测框的置信度误差:标签值是预测框和真实框的IOU交并比,预测值需要和标签值越接近越好。第二项是不负责检测物体的预测框的置信度误差:所有不用来拟合真实框的预测框的标签值IOU最好都等于0
- 蓝色圈为分类误差,负责检测物体物体的网格的分类误差:若某个网格负责预测狗,那么这个网格在20个类别中狗这个类别的概率越接近于1越好。
-
代表第 i 个网格是否包含物体,即真实框的中心点是否落在该网格中。若有则为1,否则为0 -
代表第 i 个网格的第 j 个预测框,若负责预测物体则为1,否则为0 -
代表第 i 个网格的第 j 个预测框,若不负责预测物体则为1,否则为0 -
代表给真正负责检测物体的预测框的误差给予更多的权重 -
代表给不负责检测物体的预测框的误差给予很小的权重