65.9K
CodeProject 正在变化。 阅读更多。
Home

深入了解目标检测、识别和跟踪

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (7投票s)

2018 年 1 月 25 日

CPOL

15分钟阅读

viewsIcon

13636

下面我们借助字典来恰当地定义和区分目标检测、目标识别和目标跟踪这几个术语。

Through machine learning, computer programs learn how to identify people and objects.

概述

下面我们借助字典来恰当地定义和区分目标检测、目标识别和目标跟踪这几个术语。然后,我们将探讨每个过程中涉及的一些算法,以支撑我们的定义。

计算机视觉三位一体

计算机视觉术语目标检测目标识别经常被互换使用(应用程序的命名很多时候取决于编写程序的人)。另一个术语目标跟踪也经常与检测和识别算法一起出现。这三者可以协同工作,构建更可靠的应用程序,尽管它们之间的区别以及它们之间的关系可能不清楚(跟踪只是检测的延伸吗?)。但我们可以通过首先参考标准字典,然后查看与每个过程相关的算法来清晰地区分它们。

将目标检测思考为“发现”,将目标识别思考为“理解”可能很有帮助。当然,我们知道理解一个事物与发现一个事物是不同的。抛开语义不谈,我们想了解每个过程中涉及的算法(对算法的设计目的有一个基本的了解)。当我们理解应用特定模型或算法类型的结果时,知道这些术语的区别就不再仅仅是词语问题——而是过程和结果的问题。但词语的含义仍然很重要,因为它们首先影响我们如何在头脑中表征现实。所以,让我们从检测的标准定义开始。

检测

检测算法提出的问题是:“那里东西吗?”

发现行为

字典总是有助于澄清一个词的含义和不含义(尤其是在那些经常被好心程序员和工程师不一致地使用的词语)。Merriam Webster* 将检测定义为:

发现、找到或注意到某事物的行为或过程。

这个“某事物”可以是任何东西(一只鸟、一架飞机或一个气球)。主要思想是注意到那里东西。

因此,目标检测的目的是注意到或发现物体(在图像或视频帧中)的存在。能够将物体(像素的一个独立子集)与静态背景(更大像素集,即每帧几乎保持不变的部分)区分开来。但是,我们如何才能将物体与背景区分开呢?嗯,图像和视频的处理方式不同。

图像和视频的检测

物体边界(图像)

由于照片是静态图像,我们无法使用运动来检测照片中的物体,而必须依赖其他方法来解析场景。当面对真实生活场景的照片时(例如,繁忙的市中心街道,包含大量不同、重叠的物体和表面),场景的繁忙性质使其难以解读(知道物体的边界)。边缘检测方法(例如,Canny 边缘检测)可以帮助确定此类场景中的物体。边缘定义了物体的边界,可以通过观察图像中像素强度的变化(灰度级的急剧变化)来找到。知道边缘在哪里,不仅有助于检测明显的物体(例如,靠在米白色墙壁上的蓝色自行车),还有助于正确解读物体可能重叠的稍微复杂的情况(例如,坐在椅子上的人可以被视为两个独立的物体,而不是一个大型混合体)。

下面是 Canny 边缘检测的一个例子。我们使用 OpenCV* 库中的 Canny 算法,cv2.Canny(),来查找图像中的边缘。图 1 首先被转换为灰度图(图 2),然后我们查找边缘(图 3)。转换为灰度颜色图(灰度)会增加图像的对比度,从而更容易辨别像素。

图 1. 原图。

图 2. 灰度颜色图以增强图像对比度。

图 3. Canny 边缘检测应用于灰度图像。

此帧中的像素有些不同(视频)

当一个帧中出现了一个在前一帧中不存在的东西时(一些新的像素块),我们可以设计一个算法来注意到这种差异并将其注册为检测。注意到那里有东西之前不存在——这就算是检测。并且根据我们上面的定义,视频检测技术的例子包括背景差分方法(创建前景掩码的流行方法),例如MOG(高斯混合模型)和absdiff(绝对差值)。

背景差分的原理

与静态图像不同,视频处理多个帧,这使我们能够实现背景差分方法。背景差分的基本思想是生成一个前景掩码(图 6)。

我们首先从一帧减去另一帧——当前帧(图 5)减去前一帧(图 4)——以找到差异。

图 4. 前一帧(背景模型)。

图 5. 当前帧。

然后对差值应用阈值,以创建包含场景中任何移动或新对象的二值图像。这里,“差值”是飞入场景的无人机(已检测到的对象)。

图 6. 前景掩码。

MOG,一种背景差分算法

高斯混合模型 (MOG) 不要与流行的方向梯度直方图 (HOG) 特征描述符混淆,HOG 是一种技术(通常与支持向量机,一种监督机器学习模型配对)可用于将对象分类为“人”或“非人”。与执行分类任务的 HOG 不同,MOG 方法实现了高斯混合模型来减去帧之间的背景。对于检测技术,存在差异(帧之间)很重要。但这个差异是什么(对象是人?机器人?)目前不关心。当我们旨在识别或分类一个对象时,这就是识别技术发挥作用的地方。

我们如何收到检测通知

为了通知我们(提供某种视觉线索)关于一个对象被检测到,通常会在被检测到的事物周围画一个矩形框(通常是亮色的)。当帧与帧之间出现变化时(在视频的情况下),算法会喊道:“嘿!那一帧中新出现的(或移动的)像素群是什么?”然后决定“快!在它周围画一个绿色的框,让人类知道我们检测到了什么。”

下面的图 7 显示了一个对象被一个使用背景差分方法的应用程序(带有实时摄像头流)检测到。但该应用程序完全不知道这个对象是什么。它只是寻找前一帧中不存在的大片像素区域——它寻找差异。

图 7. 一个鬼鬼祟祟的 BunnyPeople™ 玩偶无法阻止基于背景差分方法的应用程序进行检测。

表 1. OpenCV* 库中的检测技术和函数

检测技术 OpenCV 库中的函数/类示例
背景差分方法
边缘检测
Absdiff
cv::bgsegm::BackgroundSubtractorMOG
cv::bgsegm::BackgroundSubtractorGMG
Canny

从通用到具体的过渡

气体探测器是用于检测或感应气体存在的设备。根据设备的精度,甲烷、酒精蒸汽、丙烷以及更多化学物质都可以发出警报。金属探测器是用于检测金属存在的仪器(对金属探测器来说,金、黄铜和铸铁是相同的)。目标探测器则检测物体的存在——物体只是帧中的像素区域。当我们从通用转向具体时——气体到甲烷,金属到黄金,物体到人——这意味着我们先前了解具体信息。这就是区分检测和识别之处——知道物体是什么。我们可以将检测到的气体识别为甲烷。我们可以将检测到的金属识别为黄金。我们可以将检测到的物体识别为一个人。目标识别技术使我们能够创建更精确的计算机视觉应用程序,这些应用程序可以处理物体(人或灵长类动物、男性或女性、鸟类或飞机)的细节。识别就像为检测戴上一副处方眼镜。戴上眼镜后,我们现在可以识别出远处模糊的小物体实际上是一只猫,而不是一块石头。

致谢

在这里,算法变得更加好奇,问道:“那里什么?”

对某事有先验知识

Merriam Webster 将识别定义为:

由于先前的知识或经验,知道某人或某物是谁或什么的行为。

基于此,我们可以将目标识别理解为一种识别或了解物体性质(在图像或视频帧中)的过程。识别(应用程序)可以基于匹配、学习或模式识别算法,目标是标记(分类)物体——提出问题:物体是什么

下图来自一个(使用 Intel® Movidius™ Neural Compute Sticks 的)用于识别和标记鸟类物种的应用程序。您可以在 GitHub* 上了解更多关于此示例应用程序的信息。注意标签“白头海雕”后面的“1.00”。识别有一个置信度级别,这里算法以 100% 的确定性知道该物体实际上是一只白头海雕。但目标识别并非总是如此准确。

图 8. 以完美的确定性识别出白头海雕。

面对另一张图像(图 9),同一个应用程序对海岸线上方盘旋的任何物体都不完全确定。虽然无法将最左侧的物体识别为任何特定物体,但它能够(尽管不怎么确定地)将其与更广泛的“鸟类”这一通用物体类别相关联。对于其他物体,它处于犹豫不决的状态——它无法确定该物体是信天翁还是看起来像仓鸮。

图 9. 一个用于识别鸟类物种的识别应用程序不确定图像中的物体。

再次,由于术语不总是使用一致,有些人可能认为它们(检测识别)是相同的。但通过使用上述定义作为指导,对一个物体的检测(注意到那里有东西)肯定不能等同于识别那个物体是什么(能够正确识别物体,因为算法有关于它的先验知识)。

识别行为(我知道那个物体是白头海雕)不同于检测行为(我注意到那里有东西)。但是算法如何知道它看到的是白头海雕呢?我们能否算法分辨白头海雕和其他鸟类?也就是说,写一个计算机程序详细说明白头海雕和其他鸟类物种的性质。事实证明,这些是我们无法有效地给计算机(提供指令)的东西,因此我们必须设计能够自己学习的算法。

从经验中学习的算法

我们可以使用识别技术(足够智能的算法,能够区分海鸥和商业喷气式飞机)来进一步探究物体的性质。这些算法之所以能够精确地分类物体,是因为它们经过了训练——我们称之为机器学习算法。算法通过训练数据获取关于某事物(例如,鸟类物种)的知识——通过接触数以万计的各种鸟类物种的图像,算法可以学会识别不同种类的鸟类。机器学习算法之所以有效,是因为它们可以从图像中提取视觉特征。然后,算法使用这些特征将一个图像(它首次遇到的未知图像)与另一个图像(在训练过程中它之前“看到”过的图像)相关联。如果我们引用的识别应用程序(图 8)从未用标记为“白头海雕”的图像进行训练,那么在遇到白头海雕时,它将无法将其标记为白头海雕。但它可能仍然足够智能,能够知道它是一只鸟(正如我们在图 9 中看到的,最左侧的物体被标记为“鸟”,但不是任何特定的)。

表 2. OpenCV 库中的识别技术和函数。

识别技术 OpenCV 库中的函数/类示例
特征提取和机器学习模型
HOG 和支持向量机 (SVM)
深度学习模型(卷积神经网络)
FaceRecognizer
FaceRecognizer::train
createEigenFaceRecognizer
Fisherfaces 用于性别分类

跟踪

跟踪算法想知道某物将走向何方。

密切关注某物

跟踪算法简直停不下来。这些顽强的算法会跟着你(如果你是关注的对象),无论你去哪里都会跟着你。至少,这就是我们对理想的跟踪器的期望。

Merriam Webster 将动词跟踪定义为:

跟随或观察某事物或某人的路径。

因此,目标跟踪的目的是关注某物(物体在连续视频帧中的路径)。跟踪算法通常建立在目标检测识别的基础上或与之协同工作,旨在在视频流中随着时间的推移定位(并保持稳定监视)一个或多个移动的目标。

物体有一个位置历史记录(跟踪总是相对于其他帧来处理帧),这使我们能够知道其位置随时间的变化。这意味着我们有一个物体的运动模型(提示:模型可用于预测)。卡尔曼滤波器,一组数学方程,可用于确定物体未来的位置。通过使用随时间进行的一系列测量,该算法提供了一种估计过去、现在和未来状态的方法。

当然,状态估计对于跟踪很有用,在我们移动的物体的情况下,我们希望预测未来的状态——物体在做出下一个动作之前就能预测出其下一个动作。但是我们为什么要这样做呢?嗯,物体可能会被遮挡,如果我们的最终目标是保持物体在帧之间的一致性,那么对物体未来位置的了解有助于我们处理遮挡(当有东西挡住视线时)。

遮挡问题

当你试图密切关注某物时,遮挡可能是一个问题——即物体暂时被挡住。假设我们一直在跟踪城市街道上一名行人,然后他们被一辆公交车挡住了。一个鲁棒的跟踪算法可以处理临时遮挡并保持对感兴趣的人的锁定。事实上,这就是难点——确保算法始终锁定在同一事物上,以免跟踪丢失。即使行人不再出现在图像中(公交车的像素遮挡了我们的行人),算法也对他们可能经过的未来路径有所了解。因此,尽管有无数可能遮挡我们视线的障碍物,我们仍然可以有效地跟踪行人。

表 3. OpenCV 库中的跟踪技术和函数。

跟踪技术 OpenCV 库中的函数/类示例
卡尔曼滤波,CAMShift cv::KalmanFilter 类
TrackerMIL
TrackerTLD
TrackerMedianFlow

独立但非互斥的过程

目标检测过程可以注意到那里东西(我们称之为“目标”的像素子集),目标识别技术可用于知道那个东西是什么(将目标标记为特定的事物,例如鸟类),而目标跟踪则可以使我们能够跟踪特定目标 的路径。

准确的定义有助于我们清楚地看到这些过程是截然不同的。将定义与对所涉及算法的理解相结合,可以进一步说明这些术语不可互换——检测不是识别的同义词,跟踪也并非仅仅是检测的延伸。如果我们了解检测的最终结果(基于该词的真实含义),我们就会知道检测算法的目标不是对事物进行分类或识别,而是简单地注意到它的存在。我们也会知道,像卡尔曼滤波器(可以确定物体未来状态)这样的跟踪算法,并不是像背景差分那样简单的延伸。并且识别始终与先验知识相关,而检测则不然。

我们现在知道,区分这些术语的不是词语问题,而是过程和结果(基于所涉及算法的目标和结果)。尽管它们是独立的,但一个计算机视觉过程并不比另一个更好,它们通常可以协同工作以创建更高级或更鲁棒(可靠)的应用程序——例如,检测和识别算法配对,或者在跟踪失败时使用检测作为后备。每个过程——目标检测、目标识别和目标跟踪——都有其自身的目的,并且它们可以互为补充,但是……如果我们最终要将它们组合起来(想出一些特别巧妙的算法组合)来创建有用且可靠的计算机视觉应用程序,那么我们首先需要知道如何区分它们。

代码示例

要进一步探索本文中提到的一些算法和技术,请查看 GitHub* 上的 Intel IoT Developer Kit 存储库中的以下代码示例。人脸访问控制代码示例使用了 OpenCV 库中的 FaceDetectorFaceRecognizer 类,而运动热力图则基于背景差分(MOG)。

© . All rights reserved.