目标
通过分享内容,可以自己用 keras 实现 yolov3 ,官网是使用 darknet 来实现 yolov3 的主体网络。我们用 keras 或是 pytorch 来实现 yolov3。
我也在学习,如果分享内容中有不正确的地方请指正。我会及时更新内容通过大家指正提高分享精准性。
基本要求
- 熟悉深度学习以及卷积神经网
- 熟悉掌握 python
- 熟悉 tensorflow, keras 和 numpy 等库
内容
- 目标检测的发展历史
- YOLO 目标检测的原理
- 数据收集
- 自己动手写 YOLO 源码(keras 版本)
- 还有实践
最近在学习目标检测,其实目标检测是一个已经落地但是还是有很大空间的课题,说他落地是因为目标检测早深度学习出现之前大家就用计算机视觉一些算法来实现了目标检测,并取得了不错的效果,例如 HOG 结合 SVM 实现行人检测。但是为什么说还有很大空间呢? 因为现在目标检测无论速度还是精准度还是无法达到我们人类水平,虽然在某些方面已经超过我们,但是综合还是和我们人类有一定距离。
概述目标检测
我们都知道可以将目标检测(Object Detection)任务拆分为。
-
表示目标
我们用 w, h 和中心点 4 参数来在图像中表示。 -
图像识别
接下来就是分类问题
目标检测理论并不是复杂,那么也就是说目标检测并不是理论上难题而是一个工程上的难题。
目标检测的历史
我们知道目标检测早在机器学习出现之前,就使用特征提取和 SVM 实现一些目标检测,例如行人检测。其实在深度学习出现之前,目标检测中人为干涉部分较多,也就是说那时目标检测而不是学出来,而是说动做出来。而在深度学习出现之后,目标检测变成了由机器学习来完成的。深度学习出现之后,主要有两个分支
two stage detection: 代表就是 RCNN 系列,目标检测分为两个阶段,第一个阶段是候选框,第二个阶段是识别物体。
one stage detection: 代表就是 SSD 和今天我们的主角 YOLO。在 YOLO 中就是将上面两个件事一次性完成了。
滑动窗口方式目标识别(Sliding Window)
通过使用不同尺寸的窗口在图像滑动来获取一系列不同大小的图像,然后将这些图像输入主要由卷积构成神经网络来完成识别的工作。比较好理解易懂,因为滑窗位置就是最终识别物体位置,所以这种算法是很难精准定位物体位置。仔细一想这种算法实质就是将图像识别问题转为图像检测问题。还有就是因为滑窗之间有面积交叉所以这样带有大量冗余的数据输入到卷积进行计算势必会带来大量冗余。候选区域(Region Proposal)
有点类似图像分割的技术,将图像,是通过聚类的方法(select search),在 RCNN 中使用候选区域的方法。???最大外接矩形。随后也引入卷积来生成候选区域
YOLO 出现让我们向实时目标检测更迈进了一步。YOLO 相对其他目标检测,在可以接受响应速度前提下给出良好表现(精准度)。当 YOLOv3 出现除了 mAP(Mean Average Precision) 输给了 RetinaNet 而速度是 RetinaNet 的 3 倍。
其实我们工作也大致分为两个阶段一个数据收集和训练模型,其实不要小瞧数据收集的工作,数据收集虽然看起来没有构建模型和训练模型那么高大尚但是他是我们是否能够训练出好的模型基础,所以也是至关重要一个环节,不容忽视。
YOLO 目标检测原理
YOLO 是 You Only Look Once 缩写,其主要作者就是 Joseph Redmon。我们知道在模型设计上通常会主要分几个步骤来,设计函数集合,然后定义目标函数,通过减少目标函数来更新模型参数,这就是训练模型过程。
卷积
我们知道图片经过一层一层卷积提取特征图,宽度和高度不断减少,而特征图深度(通道)不断增加,可以将图片宽度(w)和高度(h)来表示图片某一个点位置信息,而图片深度(c)就是该位置特征信息。
在开始介绍 YOLOv3 之前我们简单介绍一下 YOLOv1 和 YOLOv2, 有了对 YOLOv1 和 YOLOv2 的基础有助于大家更好地了解 YOLOv3
YOLOv1
不断经过卷积过程就是将空间信息逐渐压缩融合到深度(通道)上,最终的一维特征信息的向量,然后经过全连接进行分类。
一张图片切分 网格,每一个网格负责检测是否存在物体,如果存在物体也就是说不是背景,每一个网格具有两个候选框,而且还具有属于某一个类别的概率。经过筛选找到拟合目标最好的网格以及其候选框。
我们网络输入一个张图,输出这样一个矩阵(如下图) 的矩阵。
- 表示我们将图片划分为网格数量,网格是我们检测的目标基础
- Condifence(置信度) 是 0 到 1 之间数值,这个数值表示该网格是物体还是背景的置信度
- X , Y 表示物体中心点位置
- Width 和 Hight 表示物体的检测框大小
(confidence + X + Y + Width + Hight) = 5 为一个边界框,这样边界框有两个 ,然后还剩 20 维度,20 维度是根据目标可能概率而定,也就是如果我们目标可能属于 20 个类别中某一个类的概率。这就不做过多解释了。
IOU
损失函数
预测
- 将小于 0.2 设置为 0
- 排序
-
nms 极大值抑制
YOLOv2
在 YOLOv2 参见 SSD 和 faster-RCNN 引入了锚框,在 YOLOv2 现对于 YOLOv1 提出先验框,每一个网格都给出 5 先验框,这样增加一些确定性,而从减少了训练时间。
anchor(锚框)
我们标注目标主体,我们每一个网格点(grid)都有 5 个候选框,这些候选框也是通过无监督最近邻算法计算的,这些框具有不同形态如图,然后我们真实目标的边框还和这些候选框通过计算 IOU 来得到最佳的候选框。这就是将原来 V1 候选框替换为 5 候选框,候选框不是真实的 x y w h,而是一种偏移量。
这样我们通过偏置来表示候选框(检测框)的位置,而不是像 YOLOv1 通过真实 y x 和宽和高来表检测框, 和 表示网格位置,然后该网格检测物体通过相对网格坐标 和 偏差值来表示物体中心点 和 检测的边框用和来表示。