版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hongbin_xu/article/details/83247461
原文:You Only Look Once: Unified, Real-Time Object Detection
YOLO
1、四个问题
-
要解决什么问题?
- 对于目标检测任务来说,速度较快的算法性能较弱,然而性能较强的算法(如:R-CNN系列)耗时则更多,很难达到实时性的要求。
- 大多数像RCNN这类的算法流程是,第一步先获取候选区域(region proposal),接着进行后处理(消除重复框,对候选框进行分类等等)。这样的操作往往很慢也很难优化,因为每个独立的模块都要单独训练,实时性要求也达不到。
-
用了什么方法解决?
- 将目标检测直接转换为一个回归问题,直接使用一个神经网络来预测候选框和物体类别。
-
效果如何?
-
YOLO网络的速度有很大提高。
-
基本的YOLO网络可以做到45FPS。
-
对于较小的Fast YOLO模型,帧数可以达到155FPS,且相比于其他实时检测模型效果更好。
-
对背景的分类错误少了很多。
-
-
还存在什么问题?
- YOLO在准确率上还比不过state-of-the-art的模型。
- 与R-CNN系列相比,候选框的预测有较大误差,且对新数据的泛化能力较弱。
- 对于数量较多的小物体,如一群小鸟,识别效果不好。
2、论文概述
2.1、总体框架
- 将输入缩放为 的图像。
- 把图像送入CNN,跑一次前向,计算得到(边界框和物体类别的预测)。
- 通过每个边界框的configdence筛选边界框,使用NMS去除重复的框。
2.2、统一检测(Unified Detection)
- 将输入图像划分为 个单元格(grid cell)。如果某个物体的中心在某个单元格内,那么那个单元格就负责检测那个物体。
- 每个单元格(grid cell)要预测
个bounding box,每个bounding box除了要预测框的位置外,还要预测一个置信率(confidence)。具体来说,每个bounding box包含5个预测值:
、
、
、
和置信率(confidence)。
- 表示的是预测的bounding box的中心点坐标。
- 、 表示的是bounding box的宽和高。
- confidence包含了两重信息:
- 有多确信这个单元格(grid cell)内有物体?
- 预测的bounding box有多精确?
- 计算公式:
。
- 如果这个单元格内有物体,则 取1,否则取0。
- 表示的是预测的bounding box与ground truth之间的重叠比例,它这里用的是intersection over union (IOU) 这个指标。
- 每个grid cell还需要预测 个类的输出,即预测为哪个类的输出,使用one-hot编码。
- 整体来看,总共 个grid cell,每个grid要预测 个bounding box和 个类的输出。网络的输出定义为一个长度为 的张量。
2.3、网络结构
- 网络结构如下:
2.4、训练
- 先在ImageNet上对前20个卷积层接上一个平均池化层和全连接层进行预训练。
- 随后保留那20个卷积层,再加上4个新的卷积层和2个全连接层,新加的层使用随机权重初始化。
- 由于还需要对细粒度视觉信息进行分类,故将输入图片的分辨率调整为 (原始分辨率为 )。
- bounding box预测的中心点坐标 和 用对应网格的偏移归一化到0-1之间;bounding box预测的宽高w和h用整幅图像的宽高归一化到0-1之间。
- 网络中使用leaky ReLU替代ReLU。
- 在计算loss时,作者最初全部采用了平方和误差 (sum-squared loss)。
- 采用平方和误差的原因是,它很容易优化。
- 然而,也存在几个问题:
- 将分类误差和定位误差看做同等重要显然是不靠谱的。
- 另外在一幅图像中,大多数网格不含有任何对象。这会将这些单元格的置信率(confidence)推为0,由于数量众多,很可能会掩盖掉含有目标的单元格反向传播回来的梯度。结果就是导致模型不稳定,甚至发散。
- 为了解决前面提到的问题,作者提出了以下方法:
- 更加重视定位的预测结果,给localization的loss部分赋予了更大的权重, 。
- 没有对象的单元格得到的confidence的loss,没有那么重要,就赋予较小的权重, 。
- 对于不同大小的box,如果是较大的box,预测得稍微偏了一点,影响不是很大,也基本看不出来;但如果是较小的box,预测得稍微偏一点,影响就比较大了,误差也很明显。为此,作者采用了一个比较投机取巧的办法,那就是对width和height取平方根。
- 如下图所示,可以看出,在 上取两个邻近的点做差值。如果值比较小, 在较小的地方变化率相对更大,那么这个差值也会更大一些。这样子反应到loss上,就是在较小的box上小偏差会造成更大的loss,而较大的box上小偏差得到的loss则没那么大。
- YOLO每个网格单元预测多个边界框。在训练时,每个目标我们只需要一个边界框预测器来负责。我们指定一个预测器“负责”根据哪个预测与真实值之间具有当前最高的IOU来预测目标。这导致边界框预测器之间的专业化。每个预测器可以更好地预测特定大小,方向角,或目标的类别,从而改善整体召回率。
- loss函数完整形式:
- 表示目标是否出现在网格单元 中 , 表示网格单元 中的第 个边界框预测器“负责”该预测。
- 这个loss中,只有当某个单元格中有对象的时候才会计入分类错误,即对分类错误进行惩罚。
- 只有当某个 box predictor 对某个 ground truth box 负责的时候,才会对 box 的 coordinate error 进行惩罚,而对哪个 ground truth box 负责就看其预测值和 ground truth box 的 IoU 是不是在那个 cell 的所有 box 中最大的。
2.5、推断(测试)
- 对于每张图片,使用如下评分公式获取每个bounding box对应不同类的confidence结果,即class-specific confidence scores :
- 就是每个bounding box的confidence。
- 为分类结果。
- 基于class-specific confidence scores设置阈值筛选bounding box,最后再使用非极大抑制(NMS)去除重叠的框。