- 作者:韩信子 @ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/223
- 申明:版权所有,转载请分割平台与作者并注明出处
珍藏 ShowMeAI 查看更多精彩内容
本系列为吴恩达老师《深度学习专项课程 (Deep Learning Specialization)》学习与总结整顿所得,对应的课程视频能够在 这里 查看。
引言
在 ShowMeAI 前一篇文章 经典 CNN 网络实例详解 中咱们对以下内容进行了介绍:
-
经典 CNN 构造
- LeNet-5
- AlexNet
- VGG
- ResNet(Residual Network,残差网络)
- Inception Neural Network
- 1×1 卷积
- 迁徙学习
- 数据扩增
- 手工工程与计算机现状
本篇次要介绍计算机视觉中最典型的利用之一指标检测,指标检测工作是对输出图像进行分类的同时,检测图像中是否蕴含某些指标,并对他们精确定位并标识。
1. 指标定位
咱们在后面的内容中,次要给大家介绍图像识别 (分类) 相干的常识,除了 图像识别 ,咱们还有「 指标定位 」和「 指标检测」工作,如下图所示。
定位分类问题不仅要求判断出图片中物体的品种,还要在图片中标记出它的具体位置,用 边框 (Bounding Box,或者称突围盒) 把物体圈起来。如图两头所示。
咱们略微阐明一下定位分类和指标检测工作的差异:通常在定位分类问题中,只有一个较大的对象位于图片两头地位;而在指标检测问题中,图片能够含有多个对象,甚至单张图片中会有多个不同分类的对象。
定位分类工作 中的「分类」局部大家曾经十分相熟了,应用如下的卷积神经网络即可实现。
原始图片通过若干卷积神经网络档次后,Softmax 层输入分类 (上图维度是 \( 4 \times 1\) ) 向量,别离是 pedestrain,car,motorcycle 和 background 四类。
对于指标定位问题,其模型如下所示:
为了定位图片中汽车的地位,能够让神经网络多输入 4 个数字,标记为 \(b_x\)、\(b_y\)、\(b_h\)、\(b_w\) (留神上图中 \( P_c\) 是一个示意指标物是否存在的 01 取值标签)。将图片左上角标记为 \((0, 0)\),右下角标记为 \((1, 1)\),则有:
- 橙色方框的中心点:\((b_x, b_y)\)
- 边界框的高度:\(b_h\)
- 边界框的宽度:\(b_w\)
因而,训练集不仅蕴含对象分类标签,还蕴含示意边界框的四个数字。定义指标标签 \(Y\) 如下:
$$
\left[\begin{matrix}P_c\\ b_x\\ b_y\\ b_h\\ b_w\\ c_1\\ c_2\\ c_3\end{matrix}\right]
$$
则有:
$$
P_c=1, Y = \left[\begin{matrix}1\\ b_x\\ b_y\\ b_h\\ b_w\\ c_1\\ c_2\\ c_3\end{matrix}\right]
$$
其中,\(c_n\) 示意存在第 \(n\) 个品种的概率;如果 \(P_c=0\),示意没有检测到指标,则输入标签前面的 7 个参数都是有效的,能够疏忽(用 ? 来示意)。
$$
P_c=0, Y = \left[\begin{matrix}0\\ ?\\ ?\\ ?\\ ?\\ ?\\ ?\\ ?\end{matrix}\right]
$$
`
损失函数能够示意为 \(L(\hat{y}, y)\),如果应用平方误差模式,对于不同的 \(P_c\) 有不同的损失函数(留神下标 \( i\) 指标签的第 \(i\) 个值):
- \(P_c=1\),即 \(y_1=1\):\(L(\hat{y},y)=(\hat{y}_1-y_1)^2+(\hat{y}_2-y_2)^2+\cdots+(\hat{y}_8-y_8)^2\)
- \(P_c=0\),即 \(y_1=0\):\(L(\hat{y},y)=(\hat{y}_1-y_1)^2\)
除了应用平方误差,也能够应用逻辑回归损失函数,类标签 \(c_1\) ,\(c_2\) ,\(c_3\) 也能够通过 Softmax 输入。相比较而言,平方误差曾经可能获得比拟好的成果。
2. 特色点检测
神经网络能够像标识指标的中心点地位那样,通过输入图片上的特色点,来实现对指标特色的辨认。在标签中,这些特色点以多个二维坐标的模式示意。
通过检测人脸特色点能够进行情绪分类与判断,或者利用于 AR 畛域等等。也能够透过检测姿势特色点来进行人体姿势检测。例如人脸识别,能够对人脸局部特色点坐标进行定位检测,并标记进去,如下图所示:
上图中的网络模型共检测人脸上 \(64\) 处特色点,加上是否为人脸的标记位,输入标签共有 \(64×2+1=129\) 个值。检测人脸特色点有一些典型的场景利用,比方能够进行情绪分类与判断,或者利用于 AR 畛域等。
除了人脸特色点检测之外,能够对其进行拓展,基于特色点连贯检测人体姿态动作,如下图所示:
3. 指标检测
指标检测问题中,咱们要对图片中的多个对象进行辨认和地位检测,一种直观能想到的实现办法是基于滑动窗口的指标检测 (Sliding Windows Detection) 算法。该算法的步骤如下:
- ① 训练集上收集相应的各种指标图片和非指标图片,样本图片要求尺寸较小,相应指标居于图片核心地位并根本占据整张图片。
- ② 应用训练集构建 CNN 模型,使得模型有较高的识别率。
- ③ 抉择大小合适的窗口与适合的固定步幅,对测试图片进行从左到右、从上倒下的滑动遍历。每个窗口区域应用曾经训练好的 CNN 模型进行辨认判断。若判断有指标,则此窗口即为指标区域;若判断没有指标,则此窗口为非指标区域。
- ④ 能够抉择更大的窗口,而后反复第三步的操作。
滑动窗口指标检测的长处:
- 原理简略,且不须要人为选定指标区域。
滑动窗口指标检测的毛病
- 须要人为直观设定滑动窗口的大小和步幅。滑动窗口过小或过大,步幅过大均会升高指标检测的正确率。
- 每次滑动都要进行一次 CNN 网络计算,如果滑动窗口和步幅较小,计算成本往往很大。
综上,滑动窗口指标检测算法尽管简略,然而性能不佳,效率较低。
4. 基于卷积的滑动窗口实现
滑动窗口指标检测算法能够借助卷积形式实现,以进步运行速度,节约反复运算老本。
咱们须要先对 CNN 网络结构做一些调整,以便对进入网络的「单个滑动窗口区域」更快捷计算,具体做法是把全连贯层转变成为卷积层,如下图所示:
咱们能够看到,应用与下层尺寸统一的滤波算子进行卷积运算,构建的卷积层就能够代替掉原来的全连贯层。最终失去的输入层维度是 \(1 \times 1 \times 4\),代表 4 类输入值。
对于待检测图片,可应用该网络参数和构造进行运算。例如 \(16 \times 16 \times 3\) 的图片,步进长度为 2,CNN 网络失去的输入层为 \(2 \times 2 \times 4\)。其中,\(2 \times 2\) 示意共有 4 个窗口后果。
对于更简单的 \(28 \times 28 \times 3\) 的图片,CNN 网络失去的输入层为 \(8 \times 8 \times 4\),共 64 个窗口后果。
后面提到的滑动窗口指标检测算法须要重复进行 CNN 正向计算。例如 \(16 \times 16 \times 3\) 的图片需进行 4 次,\(28 \times 28 \times 3\) 的图片需进行 \(64\) 次。
利用卷积操作代替后,不论原始图片有多大,只须要进行一次 CNN 正向计算,因为其中共享了很多反复计算局部,这大大节约了运算老本。
留神,窗口步进长度与抉择的 MAX POOL 大小无关。如果须要步进长度为 4,只需设置 MAX POOL 为 \(4 \times 4\) 即可。
相干论文:Sermanet et al., 2014. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks
5. 边框预测
滑动窗口指标检测算法中,边框的地位可能无奈完满笼罩指标(如下图蓝框),或者大小不适合,或者最精确的边框并非正方形,而是长方形。
YOLO(You Only Look Once)算法能够用于失去更准确的边框。YOLO 算法将原始图片划分为 \(n \times n\) 网格,并将指标定位一节中提到的图像分类和指标定位算法,逐个利用在每个网格中,每个网格都有标签如:
$$
\left[\begin{matrix}P_c\\ b_x\\ b_y\\ b_h\\ b_w\\ c_1\\ c_2\\ c_3\end{matrix}\right]
$$
若某个指标的中点落在某个网格,则该网格负责检测该对象。如果指标核心坐标不在以后网格内,则以后网格 \(P_c=0\);相同,则以后网格 \(P_c=1\) (即只看核心坐标是否在以后网格内)。判断有指标的网格中,限定了指标区域。
如下面的示例中,如果将输出的图片划分为 \(3 \times 3\) 的网格、须要检测的指标有 3 类,则每一网格局部图片的标签会是一个 8 维的列矩阵,最终输入的就是大小为 \(3 \times 3 \times 8\) 的后果。要失去这个后果,就要训练一个输出大小为 \(100 \times 100 \times 3\),输入大小为 \(3 \times 3 \times 8\) 的 CNN。在实践中,可能应用更为精密的 \(19 \times 19\) 网格,则两个指标的中点在同一个网格的概率更小。
YOLO 算法的长处:
- 和图像分类和指标定位算法相似,显式输入边框坐标和大小,不会受到滑窗分类器的步长大小限度。
- 依然只进行一次 CNN 正向计算,效率很高,甚至能够达到实时辨认。
如何编码边框 \(b_x\)、\(b_y\)、\(b_h\)、\(b_w\)?YOLO 算法设 \(b_x\)、\(b_y\)、\(b_h\)、\(b_w\) 的值是绝对于网格长的比例。则 \(b_x\)、\(b_y\) 在 0 到 1 之间,而 \(b_h\)、\(b_w\) 能够大于 1。当然,也有其余参数化的模式,且成果可能更好。这里只是给出一个通用的示意办法。
相干论文:Redmon et al., 2015. You Only Look Once: Unified, Real-Time Object Detection。Ng 认为该论文较难了解。
6. 交互比
交互比 (IoU, Intersection Over Union) 函数用于评估对象检测算法,它计算预测边框和理论边框交加 (\( I\) ) 与并集 (\( U\) ) 之比。
如上图右侧所示,橙色方框为实在指标区域,蓝色方框为检测指标区域。两块区域的交加为绿色局部,并集为紫色局部。蓝色方框与橙色方框的靠近水平能够用 IoU 比值来定义:
$$
IoU=\frac{I}{U}
$$
\(IoU\) 的值在 0~1 之间,且越靠近 1 示意指标的定位越精确。\(IoU \ge 0.5\) 时,个别能够认为预测边框是正确的,当然也能够更加严格地要求一个更高的阈值。
7. 非极大值克制
YOLO 算法中,可能有很多网格检测到同一指标。如下图所示
[外链图片转存失败, 源站可能有防盗链机制, 倡议将图片保留下来间接上传(img-ZRO3ZyqS-1649926014941)(http://image.showmeai.tech/de…)]
非极大值克制 (Non-max Suppression) 能够解决上述问题。它的做法很简略:
- 上图中每个网格的 \(P_c\) 值能够求出,\(P_c\) 值反映了该网格蕴含指标核心坐标的可信度。
- 首先选取 \(P_c\) 最大值对应的网格和区域,而后计算该区域与所有其它区域的 IoU,剔除掉 IoU 大于阈值 (例如 0.5) 的所有网格及区域。这样就能保障同一指标只有一个网格与之对应,且该网格 \(P_c\) 最大,最可信。
- 接着,再从剩下的网格中选取 \(P_c\) 最大的网格,反复上一步的操作。
- 最初,就能使得每个指标都仅由一个网格和区域对应。如下图所示:
总结非极大值克制 NMS 的步骤如下:
- ① 将蕴含指标核心坐标的可信度 \(P_c\) 小于阈值 (例如 0.6) 的网格抛弃;
- ② 选取领有最大 \(P_c\) 的网格;
- ③ 别离计算该网格和其余所有网格的 IoU,将 IoU 超过预设阈值的网格抛弃;
- ④ 反复第 2~3 步,直到不存在未解决的网格。
当然,下面提到的步骤实用于单类别指标检测。如果要进行多个类别指标检测,对于每个类别,应该独自做一次非极大值克制。
8.Anchor Boxes
到目前为止,咱们探讨的状况都是一个网格只检测一个对象。如果要将算法使用在多指标检测上(如下图一个人站在一辆车后面),怎么做呢?这里须要用到 Anchor Boxes。
以下图为例,同一网格呈现了两个指标:人和车。为了同时检测两个指标,咱们能够设置两个 Anchor Boxes:Anchor box 1 检测人,Anchor box 2 检测车。
对应到网络中,则每个网格多加了一层输入:原来的输入维度是 \(3 \times 3 \times 8\),当初是 \(3 \times 3 \times 2 \times 8\) (也能够写成 \( 3 \times 3 \times 16\) 的模式)。这里的 2 示意有两个 Anchor Boxes,用来在一个网格中同时检测多个指标。每个 Anchor box 都有一个 \(P_c\) 值,若两个 \(P_c\) 值均大于某阈值,则检测到了两个指标。
标签 \(y\) 状态为
$$
y=\left [
\begin{matrix}
Pc \\
bx \\
by \\
bh \\
bw \\
c1 \\
c2 \\
c3 \\
Pc \\
bx \\
by \\
bh \\
bw \\
c1 \\
c2 \\
c3
\end{matrix}
\right]
$$
在应用 YOLO 算法时,只需对每个 Anchor box 应用上一节的非最大值克制即可。Anchor Boxes 之间并行实现。当然,Anchor Boxes 也有局限性,对于同一网格有三个及以上指标,或者两个指标的 Anchor Box 高度重合的状况解决不好。
怎么抉择 Anchor Boxes:
- 个别手工指定 Anchor Boxes 形态,能够抉择 5 到 10 个 Anchor Box 形态,笼罩到想要检测的对象的各种形态
- 更高级的是应用 k 均值算法 (更具体算法介绍能够浏览 ShowMeAI 文章 图解机器学习 | 聚类算法详解),将两类对象形态聚类,抉择最具备代表性的一组 Anchor Box
9.YOLO 算法
汇总下面学习到的常识,就失去 YOLO 算法的流程,算是对前几节内容的回顾。网络结构如下图所示,蕴含了两个 Anchor Boxes。
- ① 对每个网格,预测失去 2 个 bounding box
- ② 剔除掉概率低的预测后果
- ③ 对每个类别利用非极大值克制 NMS 失去最终后果
10.R-CNN
后面介绍的滑动窗口指标检测算法对一些显著没有指标的区域也进行了扫描 (如下图最左下角地位),这升高了算法的运行效率。
为了解决这个问题,R-CNN(Region CNN,带区域的 CNN)被提出。通过对输出图片运行图像宰割算法,在不同的色块上找出候选区域(Region Proposal),而后只在这些区域上运行分类器。
R-CNN 的毛病是运行速度很慢,所以有一系列后续钻研工作改良。例如 Fast R-CNN(与基于卷积的滑动窗口实现类似,但失去候选区域的聚类步骤仍然很慢)、Faster R-CNN(应用卷积对图片进行宰割)。不过大多数时候还是比 YOLO 算法慢。RCNN 系列的算法也叫做 2 -stage 指标检测算法(因为会先产出后候选框,再预测和调整),YOLO 系列的算法叫做 1 -stage 指标检测办法。
相干论文:
R-CNN:Girshik et al., 2013. Rich feature hierarchies for accurate object detection and semantic segmentation
Fast R-CNN:Girshik, 2015. Fast R-CNN
Faster R-CNN:Ren et al., 2016. Faster R-CNN: Towards real-time object detection with region proposal networks
参考资料
- Sermanet et al., 2014. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks
- Redmon et al., 2015. You Only Look Once: Unified, Real-Time Object Detection
- Girshik et al., 2013. Rich feature hierarchies for accurate object detection and semantic segmentation
- Girshik, 2015. Fast R-CNN
- Ren et al., 2016. Faster R-CNN: Towards real-time object detection with region proposal networks
ShowMeAI 系列教程举荐
- 图解 Python 编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解 AI 数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
举荐文章
- 深度学习教程 | 深度学习概论
- 深度学习教程 | 神经网络根底
- 深度学习教程 | 浅层神经网络
- 深度学习教程 | 深层神经网络
- 深度学习教程 | 深度学习的实用层面
- 深度学习教程 | 神经网络优化算法
- 深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架
- 深度学习教程 | AI 利用实际策略(上)
- 深度学习教程 | AI 利用实际策略(下)
- 深度学习教程 | 卷积神经网络解读
- 深度学习教程 | 经典 CNN 网络实例详解
- 深度学习教程 | CNN 利用:指标检测
- 深度学习教程 | CNN 利用:人脸识别和神经格调转换
- 深度学习教程 | 序列模型与 RNN 网络
- 深度学习教程 | 自然语言解决与词嵌入
- 深度学习教程 | Seq2seq 序列模型和注意力机制