深度学习教程 | CNN应用:目标检测

简介: 本节介绍目标检测,是计算机视觉中最典型的应用之一,主要内容包括:目标定位,特征点检测,目标检测,边框预测,非极大值抑制,YOLO,RCNN等。

ShowMeAI研究中心

作者:韩信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/35
本文地址http://www.showmeai.tech/article-detail/223
声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI查看更多精彩内容


第4门课 卷积神经网络,第3周:目标检测
本系列为吴恩达老师《深度学习专项课程(Deep Learning Specialization)》学习与总结整理所得,对应的课程视频可以在这里查看。


引言

ShowMeAI前一篇文章 经典CNN网络实例详解 中我们对以下内容进行了介绍:

  • 经典CNN结构

    • LeNet-5
    • AlexNet
    • VGG
  • ResNet(Residual Network,残差网络)
  • Inception Neural Network
  • 1x1卷积
  • 迁移学习
  • 数据扩增
  • 手工工程与计算机现状

目标检测

本篇主要介绍计算机视觉中最典型的应用之一目标检测,目标检测任务是对输入图像进行分类的同时,检测图像中是否包含某些目标,并对他们准确定位并标识。

1.目标定位

目标定位 Object Localization

我们在前面的内容中,主要给大家介绍图像识别(分类)相关的知识,除了图像识别,我们还有「目标定位」和「目标检测」任务,如下图所示。

定位分类问题不仅要求判断出图片中物体的种类,还要在图片中标记出它的具体位置,用边框(Bounding Box,或者称包围盒)把物体圈起来。如图中间所示。

目标定位

我们稍微说明一下定位分类和目标检测任务的差别:通常在定位分类问题中,只有一个较大的对象位于图片中间位置;而在目标检测问题中,图片可以含有多个对象,甚至单张图片中会有多个不同分类的对象。

定位分类任务中的「分类」部分大家已经非常熟悉了,使用如下的卷积神经网络即可完成。

目标定位

原始图片经过若干卷积神经网络层次后,Softmax层输出分类(上图维度是 equation?tex=4%20%20%5Ctimes%201 )向量,分别是pedestrain,car,motorcycle和background四类。


对于目标定位问题,其模型如下所示:

目标定位

为了定位图片中汽车的位置,可以让神经网络多输出 equation?tex=4 个数字,标记为 equation?tex=b_xequation?tex=b_yequation?tex=b_hequation?tex=b_w (注意上图中 equation?tex=P_c 是一个表示目标物是否存在的01取值标签)。将图片左上角标记为 equation?tex=%280%2C%200%29,右下角标记为 equation?tex=%281%2C%201%29,则有:

  • 橙色方框的中心点:equation?tex=%28b_x%2C%20b_y%29
  • 边界框的高度:equation?tex=b_h
  • 边界框的宽度:equation?tex=b_w

因此,训练集不仅包含对象分类标签,还包含表示边界框的四个数字。定义目标标签 equation?tex=Y 如下:

equation?tex=%5Cleft%5B%5Cbegin%7Bmatrix%7DP_c%5C%5C%20b_x%5C%5C%20b_y%5C%5C%20b_h%5C%5C%20b_w%5C%5C%20c_1%5C%5C%20c_2%5C%5C%20c_3%5Cend%7Bmatrix%7D%5Cright%5D

则有:

equation?tex=P_c%3D1%2C%20Y%20%3D%20%5Cleft%5B%5Cbegin%7Bmatrix%7D1%5C%5C%20b_x%5C%5C%20b_y%5C%5C%20b_h%5C%5C%20b_w%5C%5C%20c_1%5C%5C%20c_2%5C%5C%20c_3%5Cend%7Bmatrix%7D%5Cright%5D

其中,equation?tex=c_n 表示存在第 equation?tex=n 个种类的概率;如果 equation?tex=P_c%3D0,表示没有检测到目标,则输出标签后面的 equation?tex=7 个参数都是无效的,可以忽略(用 ? 来表示)。

equation?tex=P_c%3D0%2C%20Y%20%3D%20%5Cleft%5B%5Cbegin%7Bmatrix%7D0%5C%5C%20%3F%5C%5C%20%3F%5C%5C%20%3F%5C%5C%20%3F%5C%5C%20%3F%5C%5C%20%3F%5C%5C%20%3F%5Cend%7Bmatrix%7D%5Cright%5D


损失函数可以表示为 equation?tex=L%28%5Chat%7By%7D%2C%20y%29,如果使用平方误差形式,对于不同的 equation?tex=P_c 有不同的损失函数(注意下标 equation?tex=i 指标签的第 equation?tex=i 个值):

equation?tex=P_c%3D1,即 equation?tex=y_1%3D1equation?tex=L%28%5Chat%7By%7D%2Cy%29%3D%28%5Chat%7By%7D_1-y_1%29%5E2%2B%28%5Chat%7By%7D_2-y_2%29%5E2%2B%5Ccdots%2B%28%5Chat%7By%7D_8-y_8%29%5E2

equation?tex=P_c%3D0,即 equation?tex=y_1%3D0equation?tex=L%28%5Chat%7By%7D%2Cy%29%3D%28%5Chat%7By%7D_1-y_1%29%5E2

除了使用平方误差,也可以使用逻辑回归损失函数,类标签 equation?tex=c_1, equation?tex=c_2equation?tex=c_3 也可以通过 Softmax 输出。相比较而言,平方误差已经能够取得比较好的效果。

2.特征点检测

特征点检测 Landmark Detection

神经网络可以像标识目标的中心点位置那样,通过输出图片上的特征点,来实现对目标特征的识别。在标签中,这些特征点以多个二维坐标的形式表示。

通过检测人脸特征点可以进行情绪分类与判断,或者应用于 AR 领域等等。也可以透过检测姿态特征点来进行人体姿态检测。例如人脸识别,可以对人脸部分特征点坐标进行定位检测,并标记出来,如下图所示:

特征点检测

上图中的网络模型共检测人脸上 equation?tex=64 处特征点,加上是否为人脸的标志位,输出标签共有 equation?tex=64x2%2B1%3D129 个值。检测人脸特征点有一些典型的场景应用,比如可以进行情绪分类与判断,或者应用于AR领域等。

特征点检测

除了人脸特征点检测之外,可以对其进行拓展,基于特征点连接检测人体姿势动作,如上图所示。

3.目标检测

目标检测 Object Detection

目标检测问题中,我们要对图片中的多个对象进行识别和位置检测,一种直观能想到的实现方法是基于滑动窗口的目标检测 (Sliding Windows Detection) 算法。该算法的步骤如下:

目标检测

  • ① 训练集上搜集相应的各种目标图片和非目标图片,样本图片要求尺寸较小,相应目标居于图片中心位置并基本占据整张图片。
  • ② 使用训练集构建 CNN 模型,使得模型有较高的识别率。
  • ③ 选择大小适宜的窗口与合适的固定步幅,对测试图片进行从左到右、从上倒下的滑动遍历。每个窗口区域使用已经训练好的 CNN 模型进行识别判断。若判断有目标,则此窗口即为目标区域;若判断没有目标,则此窗口为非目标区域。
  • ④ 可以选择更大的窗口,然后重复第三步的操作。


滑动窗口目标检测的优点

  • 原理简单,且不需要人为选定目标区域。

滑动窗口目标检测的缺点

  • 需要人为直观设定滑动窗口的大小和步幅。滑动窗口过小或过大,步幅过大均会降低目标检测的正确率。
  • 每次滑动都要进行一次 CNN 网络计算,如果滑动窗口和步幅较小,计算成本往往很大。

综上,滑动窗口目标检测算法虽然简单,但是性能不佳,效率较低。

4.基于卷积的滑动窗口实现

卷积的滑动窗口实现 Convolutional Implementation of Sliding Windows

滑动窗口目标检测算法可以借助卷积方式实现,以提高运行速度,节约重复运算成本。

我们需要先对CNN网络结构做一些调整,以便对进入网络的「单个滑动窗口区域」更快捷计算,具体做法是把全连接层转变成为卷积层,如下图所示:

基于卷积的滑动窗口实现

我们可以看到,使用与上层尺寸一致的滤波算子进行卷积运算,构建的卷积层就可以替代掉原来的全连接层。最终得到的输出层维度是 equation?tex=1%20%20%5Ctimes%201%20%20%5Ctimes%204,代表4类输出值。

对于待检测图片,可使用该网络参数和结构进行运算。例如 equation?tex=16%20%20%5Ctimes%2016%20%20%5Ctimes%203 的图片,步进长度为 equation?tex=2,CNN网络得到的输出层为 equation?tex=2%20%20%5Ctimes%202%20%20%5Ctimes%204。其中, equation?tex=2%20%20%5Ctimes%202 表示共有 equation?tex=4 个窗口结果。

基于卷积的滑动窗口实现

对于更复杂的 equation?tex=28%20%20%5Ctimes%2028%20%20%5Ctimes%203 的图片,CNN 网络得到的输出层为 equation?tex=8%20%20%5Ctimes%208%20%20%5Ctimes%204,共 equation?tex=64 个窗口结果。

基于卷积的滑动窗口实现

前面提到的滑动窗口目标检测算法需要反复进行 CNN 正向计算。例如 equation?tex=16%20%20%5Ctimes%2016%20%20%5Ctimes%203 的图片需进行 equation?tex=4 次, equation?tex=28%20%20%5Ctimes%2028%20%20%5Ctimes%203 的图片需进行 equation?tex=64 次。

利用卷积操作替代后,不管原始图片有多大,只需要进行一次CNN正向计算,因为其中共享了很多重复计算部分,这大大节约了运算成本。

注意,窗口步进长度与选择的 MAX POOL 大小有关。如果需要步进长度为 equation?tex=4,只需设置 MAX POOL 为 equation?tex=4%20%20%5Ctimes%204 即可。

相关论文: Sermanet et al., 2014. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks

5.边框预测

Bounding Box预测 Bounding Box Predictions

滑动窗口目标检测算法中,边框的位置可能无法完美覆盖目标(如下图蓝框),或者大小不合适,或者最准确的边框并非正方形,而是长方形。

边框预测

YOLO(You Only Look Once)算法可以用于得到更精确的边框。YOLO 算法将原始图片划分为 equation?tex=n%20%5Ctimes%20n 网格,并将目标定位一节中提到的图像分类和目标定位算法,逐一应用在每个网格中,每个网格都有标签如:

equation?tex=%5Cleft%5B%5Cbegin%7Bmatrix%7DP_c%5C%5C%20b_x%5C%5C%20b_y%5C%5C%20b_h%5C%5C%20b_w%5C%5C%20c_1%5C%5C%20c_2%5C%5C%20c_3%5Cend%7Bmatrix%7D%5Cright%5D

若某个目标的中点落在某个网格,则该网格负责检测该对象。如果目标中心坐标不在当前网格内,则当前网格 equation?tex=P_c%3D0 ;相反,则当前网格 equation?tex=P_c%3D1 (即只看中心坐标是否在当前网格内)。判断有目标的网格中,限定了目标区域。

边框预测

如上面的示例中,如果将输入的图片划分为 equation?tex=3%20%5Ctimes%203 的网格、需要检测的目标有 equation?tex=3 类,则每一网格部分图片的标签会是一个 equation?tex=8 维的列矩阵,最终输出的就是大小为 equation?tex=3%20%5Ctimes%203%20%5Ctimes%208 的结果。要得到这个结果,就要训练一个输入大小为 equation?tex=100%20%5Ctimes%20100%20%5Ctimes%203,输出大小为 equation?tex=3%20%5Ctimes%203%20%5Ctimes%208 的 CNN。在实践中,可能使用更为精细的 equation?tex=19%20%5Ctimes%2019 网格,则两个目标的中点在同一个网格的概率更小。


YOLO 算法的优点

  • 和图像分类和目标定位算法类似,显式输出边框坐标和大小,不会受到滑窗分类器的步长大小限制。
  • 仍然只进行一次 CNN 正向计算,效率很高,甚至可以达到实时识别。

如何编码边框 equation?tex=b_xequation?tex=b_yequation?tex=b_hequation?tex=b_w ?YOLO 算法设 equation?tex=b_xequation?tex=b_yequation?tex=b_hequation?tex=b_w 的值是相对于网格长的比例。则 equation?tex=b_xequation?tex=b_yequation?tex=0equation?tex=1 之间,而 equation?tex=b_hequation?tex=b_w 可以大于 equation?tex=1。当然,也有其他参数化的形式,且效果可能更好。这里只是给出一个通用的表示方法。

相关论文: Redmon et al., 2015. You Only Look Once: Unified, Real-Time Object Detection。Ng 认为该论文较难理解。

6.交互比

交并比 Intersection over Union

交互比(IoU, Intersection Over Union)函数用于评价对象检测算法,它计算预测边框和实际边框交集( equation?tex=I )与并集( equation?tex=U )之比。

交互比IoU

如上图右侧所示,橙色方框为真实目标区域,蓝色方框为检测目标区域。两块区域的交集为绿色部分,并集为紫色部分。蓝色方框与橙色方框的接近程度可以用 IoU 比值来定义:

equation?tex=IoU%3D%5Cfrac%7BI%7D%7BU%7D

equation?tex=IoU 的值在 0~1 之间,且越接近 equation?tex=1 表示目标的定位越准确equation?tex=IoU%20%5Cge%200.5 时,一般可以认为预测边框是正确的,当然也可以更加严格地要求一个更高的阈值。

7.非极大值抑制

非极大值抑制 Non-max suppression

YOLO 算法中,可能有很多网格检测到同一目标。如下图所示

非极大值抑制NMS


非极大值抑制(Non-max Suppression)可以解决上述问题。它的做法很简单:

非极大值抑制NMS

  • 上图中每个网格的 equation?tex=P_c 值可以求出, equation?tex=P_c 值反映了该网格包含目标中心坐标的可信度。
  • 首先选取 equation?tex=P_c 最大值对应的网格和区域,然后计算该区域与所有其它区域的IoU,剔除掉IoU大于阈值(例如0.5)的所有网格及区域。这样就能保证同一目标只有一个网格与之对应,且该网格 equation?tex=P_c 最大,最可信。
  • 接着,再从剩下的网格中选取 equation?tex=P_c 最大的网格,重复上一步的操作。
  • 最后,就能使得每个目标都仅由一个网格和区域对应。如下图所示:


总结非极大值抑制NMS的步骤如下

  • ① 将包含目标中心坐标的可信度 equation?tex=P_c 小于阈值(例如 equation?tex=0.6 )的网格丢弃;
  • ② 选取拥有最大 equation?tex=P_c 的网格;
  • ③ 分别计算该网格和其他所有网格的 IoU,将 IoU 超过预设阈值的网格丢弃;
  • ④ 重复第 2~3 步,直到不存在未处理的网格。

当然,上面提到的步骤适用于单类别目标检测。如果要进行多个类别目标检测,对于每个类别,应该单独做一次非极大值抑制。

8.Anchor Boxes

Anchor Boxes

到目前为止,我们讨论的情况都是一个网格只检测一个对象。如果要将算法运用在多目标检测上(如下图一个人站在一辆车前面),怎么做呢?这里需要用到 Anchor Boxes。

以下图为例,同一网格出现了两个目标:人和车。为了同时检测两个目标,我们可以设置两个Anchor Boxes:Anchor box 1检测人,Anchor box 2检测车。

Anchor Boxes

对应到网络中,则每个网格多加了一层输出:原来的输出维度是 equation?tex=3%20%20%5Ctimes%203%20%20%5Ctimes%208,现在是 equation?tex=3%20%20%5Ctimes%203%20%20%5Ctimes%202%20%20%5Ctimes%208 (也可以写成 equation?tex=3%20%20%5Ctimes%203%20%20%5Ctimes%2016 的形式)。这里的2表示有两个Anchor Boxes,用来在一个网格中同时检测多个目标。每个Anchor box都有一个 equation?tex=P_c 值,若两个 equation?tex=P_c 值均大于某阈值,则检测到了两个目标。

标签 equation?tex=y 形态为

equation?tex=y%3D%5Cleft%20%5B%20%5Cbegin%7Bmatrix%7D%20Pc%20%5C%5C%20bx%20%5C%5C%20by%20%5C%5C%20bh%20%5C%5C%20bw%20%5C%5C%20c1%20%5C%5C%20c2%20%5C%5C%20c3%20%5C%5C%20Pc%20%5C%5C%20bx%20%5C%5C%20by%20%5C%5C%20bh%20%5C%5C%20bw%20%5C%5C%20c1%20%5C%5C%20c2%20%5C%5C%20c3%20%5Cend%7Bmatrix%7D%20%5Cright%5D

在使用YOLO算法时,只需对每个Anchor box使用上一节的非最大值抑制即可。Anchor Boxes之间并行实现。当然,Anchor Boxes 也有局限性,对于同一网格有三个及以上目标,或者两个目标的 Anchor Box 高度重合的情况处理不好


怎么选择Anchor Boxes

  • 一般手工指定Anchor Boxes形状,可以选择5到10个Anchor Box形状,覆盖到想要检测的对象的各种形状
  • 更高级的是使用k均值算法(更详细算法介绍可以阅读ShowMeAI文章 图解机器学习 | 聚类算法详解),将两类对象形状聚类,选择最具有代表性的一组Anchor Box

9.YOLO 算法

YOLO 算法 Putting it Together: YOLO Algorithm

汇总上面学习到的知识,就得到 YOLO 算法的流程,算是对前几节内容的回顾。网络结构如下图所示,包含了两个 Anchor Boxes。

YOLO 算法

  • ① 对每个网格,预测得到 2 个bounding box
  • ② 剔除掉概率低的预测结果
  • ③ 对每个类别应用非极大值抑制NMS得到最终结果

10.R-CNN

候选区域  Region Proposals

前面介绍的滑动窗口目标检测算法对一些明显没有目标的区域也进行了扫描(如下图最左下角位置),这降低了算法的运行效率。
为了解决这个问题,R-CNN (Region CNN,带区域的 CNN)被提出。通过对输入图片运行图像分割算法,在不同的色块上找出候选区域(Region Proposal),然后只在这些区域上运行分类器。

R-CNN

R-CNN

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

参考资料

ShowMeAI系列教程推荐

推荐文章

ShowMeAI用知识加速每一次技术成长

目录
相关文章
|
7天前
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
39 5
|
9天前
|
机器学习/深度学习 数据采集 算法
深度学习在图像识别中的应用与挑战
本文探讨了深度学习技术在图像识别领域的应用,重点分析了卷积神经网络(CNN)的基本原理、优势以及面临的主要挑战。通过案例研究,展示了深度学习如何提高图像识别的准确性和效率,同时指出了数据质量、模型泛化能力和计算资源等关键因素对性能的影响。
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##
|
9天前
|
机器学习/深度学习 人工智能 算法
深度学习在图像识别中的革命性应用####
本文不采用传统摘要形式,直接以一段引人入胜的事实开头:想象一下,一台机器能够比人类更快速、更准确地识别出图片中的对象,这不再是科幻电影的情节,而是深度学习技术在图像识别领域带来的现实变革。通过构建复杂的神经网络模型,特别是卷积神经网络(CNN),计算机能够从海量数据中学习到丰富的视觉特征,从而实现对图像内容的高效理解和分类。本文将深入探讨深度学习如何改变图像识别的游戏规则,以及这一技术背后的原理、关键挑战与未来趋势。 ####
29 1
|
9天前
|
机器学习/深度学习 传感器 边缘计算
基于深度学习的图像识别技术在自动驾驶中的应用####
随着人工智能技术的飞速发展,深度学习已成为推动自动驾驶技术突破的关键力量之一。本文深入探讨了深度学习算法,特别是卷积神经网络(CNN)在图像识别领域的创新应用,以及这些技术如何被集成到自动驾驶汽车的视觉系统中,实现对复杂道路环境的实时感知与理解,从而提升驾驶的安全性和效率。通过分析当前技术的最前沿进展、面临的挑战及未来趋势,本文旨在为读者提供一个全面而深入的视角,理解深度学习如何塑造自动驾驶的未来。 ####
42 1
|
9天前
|
机器学习/深度学习
深度学习在图像识别中的应用与挑战
本文探讨了深度学习技术在图像识别领域的应用,并分析了其面临的主要挑战。通过综述深度学习模型的基本原理、图像识别任务的特点以及当前的研究进展,本文旨在为读者提供一个关于深度学习在图像识别中应用的全面视角。
19 0
|
20天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN): 从理论到实践
本文将深入浅出地介绍卷积神经网络(CNN)的工作原理,并带领读者通过一个简单的图像分类项目,实现从理论到代码的转变。我们将探索CNN如何识别和处理图像数据,并通过实例展示如何训练一个有效的CNN模型。无论你是深度学习领域的新手还是希望扩展你的技术栈,这篇文章都将为你提供宝贵的知识和技能。
57 7
|
16天前
|
机器学习/深度学习 自然语言处理 算法
深入理解深度学习中的卷积神经网络(CNN)
深入理解深度学习中的卷积神经网络(CNN)
18 1
|
23天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
本文旨在通过深入浅出的方式,为读者揭示卷积神经网络(CNN)的神秘面纱,并展示其在图像识别领域的实际应用。我们将从CNN的基本概念出发,逐步深入到网络结构、工作原理以及训练过程,最后通过一个实际的代码示例,带领读者体验CNN的强大功能。无论你是深度学习的初学者,还是希望进一步了解CNN的专业人士,这篇文章都将为你提供有价值的信息和启发。
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新

热门文章

最新文章