赞
踩
对应论文:《You Only Look Once: Unified, Real-Time Object Detection》
[unofficial code - tensorflow]: https://github.com/hizhangp/yolo_tensorflow
YOLO(You Only Look Once),由 R.Joseph 等人在 2015 提出,是 YOLO 系列的开山之作,也是 深度学习领域第一个 one-stage detector。它速度极快,在VOC上保证 mAP=52.7% 时能跑到 155fps。
作为一个 one-stage 检测器,YOLO 没有生成建议框这一步骤,它 直接将图片划分为 S×S 个网格 (grid cell),每个网格对 中心点落入其中的目标 进行检测【如果目标的中心点落入某个格子中,我们就说这个格子 “包含” 了这个目标,就由这个格子负责对这个目标的检测】。
YOLO 进行目标检测是 端到端 (end-to-end) 的,直接从输入到输出,一步到位,没有中间步骤。而且,YOLO 的训练也是端到端的。
通常对于一个目标,它落在哪个网格里是很清楚的,网络只需要对它做出一个 bounding box 预测即可,但有时有一些 大的目标 或者 处在在多个网格边界处的目标 可能会被多个网络同时检测,这个我们则可以通过非极大值抑制算法(NMS)对重叠框进行剔除。
YOLO v1 的网络结构如图所示:
借鉴了 GoogLeNet
,网络包含 24个卷积层(用来提取特征)和 2个全连接层(用来预测)。
除了上面这个网络结构,文章还提出了一个 轻量级版本 Fast Yolo,仅使用9个卷积层,并且卷积层中使用更少的卷积核。
YOLO v1 使用7×7个网格,每个网格给出两个 bounding box 的预测 (x, y, w, h, confidence score 五个参数),以及该网格属于20个类别的条件类别概率 (conditional class probabilities)。
每个 bounding box 的位置由 (x, y, w, h) 四个变量唯一确定,其中:
每个 bounding box 有一个置信度得分。置信度得分是 bounding box 包含目标的可能性 以及 bounding box 定位的准确程度 的 综合反映。
定义为: 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 ) Pr(object) Pr(object) 表示 bounding box是否包含目标。
每个 grid cell 有 C 个条件类别概率,即 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object),表示一个 grid cell 在包含 object 的条件下属于某个类别的概率【只有在 grid cell 包含 object 情况下才进行类别预测】。
在测试阶段,将 条件类别概率 和 置信度相乘,得到 bounding box 针对 特定类别 的 类别置信度得分【即 bounding box 分类得分和定位得分 的 综合反映】。
P.S:注意,条件类别概率是针对grid cell的,confidence score是针对bounding box的。
1、YOLO 将图像划分网格进行预测,每个网格单元的尺寸很有限,为何能够检测比网格大很多的物体 (比如某个物体占了十几个网格)?
YOLO 并不是将图片分割成 单独的独立的 网格 分别 输入模型进行预测,实际上,YOLO 网络最后的卷积层在原图上的感受野是远大于网格大小的,网格只是用于物体中心位置归属哪个网格的划分。
1、输入448×448×3的图片,网络输出7×7×30的张量,对应49个网格,每个网格给出 2个bounding box的预测,以及20个类别的条件类别概率
2、将 每个 bounding box 的置信度 和 其所属 grid cell 的条件类别概率 相乘,得到 每个 bounding box 的类别置信度【20×98的矩阵】
3、对20个类别(即每一行)分别进行以下操作:
4、最后,对每个 bounding box(即每一列) 的20个 score 取最大值作为 bounding box 的 score,将最大值对应的类别作为 bounding box 的类别。
1、为什么不先对 grid cell 根据最大的条件类别概率确定类别,从而确定直接其对应的两个 bounding box 的类别,再进行NMS?反正最后也是要对bounding box的类别概率取最大,这不是一样吗?这样不是可以节省许多没必要的比较操作?
首先在 ImageNet 上对 CNN网络 进行预训练,预训练的分类模型采用上图中的 前20个卷积层,接一个 average-pooling层 和 全连接层。
由于检测任务一般需要更高清的图片,所以 将网络的输入从224x224增加到了448x448。
YOLO 的训练是端到端的,所有东西 放到一起训练。
损失函数包括三个部分:
Yolo算法将目标检测看成回归问题,所以作者 简单粗暴的全部采用了均方差损失函数(sum-squared error loss) 【YOLO v1将类别预测也看成了回归问题,用的MSE= =】。
具体损失函数如下,
为了让各损失项得到平衡,采用了不同的权重值:
对于定位误差项:
对于IOU误差(置信度误差):
对于分类误差:
1、如果一个单元格内存在多个目标怎么办?
此时Yolo v1就只能选择其中一个来训练,这也是v1的缺点之一。
优点:
局限:
[1] YOLO目标检测中损失函数loss的理解及部分代码实现
[2] YOLO(You Only Look Once)算法详解
视频资料:
[1] CVPR2016 作者详细讲解YOLO (目标检测 深度学习) 视频
[2] YOLO v1深度解读 视频
PPT:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。