深入了解对象检测、识别和跟踪

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

概述

下面我们首先通过查字典定义和区分对象检测、对象识别和对象跟踪这三个术语。然后探讨每个过程所涉及的一些算法,以加强我们对这些定义的理解。

计算机视觉三位一体

计算机视觉术语对象检测对象识别通常可以互换(应用的命名通常取决于编写程序的作者)。另一术语对象跟踪经常与检测和识别算法一起使用。这三个术语相互合作,帮助打造更加可靠的应用,尽管可能不清楚它们之间的区别和联系(跟踪是否只是检测的延伸?)。但我们可以首先参考标准字典,然后了解各个过程的相关算法,明确区分这些过程。

想想对象发现(而非检测)和对象理解(代替识别),可能会有所帮助。当然,我们知道理解一件事和发现那件事完全不同。除了语义之外,我们还希望了解各个过程所涉及的算法(以基本了解这些算法的设计宗旨)。当我们了解了应用特定类型的算法会带来哪些结果后,就可以通过字面意思了解这些术语之间的差异 — 关乎于过程和结果。但字面意思非常重要,因为它们首先会影响我们在头脑中反映现实的方式。因此我们首先从检测的标准定义开始。

检测

检测算法提出问题:那儿有东西吗?

发现行为

字典通常可以帮助我们明确了解词语字面所包含和不包含的意思(尤其是当编程人员和设计人员以不同的方式使用这些词语的时候)。《韦氏词典》*将检测定义为:

发现、看到或注意到某物的过程。

这里的“某物”可以是任何事物(一只鸟、一架飞机或一个气球)。重点是看到某物那里。

对象检测的目的是注意到或发现(图像或视频帧内)对象的存在。能够将对象(不同的像素子集)与静态背景(较大的像素集,一帧一帧大部分时候保持不变的事物)区分开。但我们如何从背景中锁定对象?图像和视频的处理方法不同。

图像检测和视频检测

对象边界(图像)

由于照片是静态图像,我们无法通过运动来检测照片中的对象,必须依靠其他方法解析出场景。我们呈现真实场景的照片(一条繁忙的市区街道包含许多不同、重叠的对象和表面),该场景的繁忙特性使我们难以对其进行解析(知道对象的边界)。边缘检测法(例如 Canny 边缘检测)可帮助确定此类场景中的对象。边缘指对象边界,可通过查看图像中的强度如何变化(图像灰度级的突然变化)来发现边缘。知道边缘的具体位置不仅有助于检测明显的对象(倚白墙放置的蓝色自行车),还有助于我们准确解析对象重叠的复杂场景(一个人坐在椅子上可能被视作两个不同的对象,而不是一个大的混合对象)。

下面是有关 Canny 边缘检测的示例。我们使用 OpenCV* 库的算法cv2.Canny() 查找图像中的边缘。查找边缘(图 3)之前,首先将图 1 转化为灰度(图 2)。转化为灰色色图(灰度)能够增加图像的对比度,有助于更轻松地识别像素。

图 1.原始照片。

图 2.可增强图像对比度的灰度色图。

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

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

当物体出现在新的一帧,而前一帧没有(块上的新像素),我们可以设计出一种算法去发现并以检测的形式登记这种差别。为了注意到之前不在该处,但现在出现在该处的事物 — 这算是检测。而且与上述定义相符,视频检测技巧的示例包括背景减除法(常用于创建前景模板,比如 MOG(指高斯混合)和absdiff (绝对差)。

背景减除背后的理念

与静态图像不同,我们要在视频中处理多帧,这样我们可以实施背景减除法。背景减除背后的基本理念是生成前景模板(图 6)。

我们首先逐帧进行减除 — 当前帧(图 5)减前一帧(图 4)— 找出不同之处。

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

图 5.当前帧。

然后将阈值应用于不同之处,以创建一张包含场景中所有正在移动或新对象的二进制图像。这里的“不同之处”指在场景中飞行的无人机(检测到的对象)。

图 6.前景模板。

背景减除算法 MOG

高斯混合 (MOG) 不能与常见的方向梯度直方图 (HOG) 特性描述符混淆,HOG 技巧常与支持向量机(监督式机器学习模型)搭配使用,用于将对象分为“人类”或“非人类”。与执行分类任务的 HOG 不同,MOG 方法实施高斯混合模型以减去两帧之间的背景。借助检测技巧,此处关乎于(两帧之间的)不同之处。But 哪些不同之处(该对象是人?机器人?)还不是我们关心的地方。如果我们的目的是识别或分类某一对象,那么我们要用到的是识别技巧。

如何收到检测通知

为了提示我们(提供某种视觉提示)检测到对象,通常在检测到的物体周围画上矩形或方框(颜色鲜艳的那个)。如果(视频中)帧切换时发生变化,算法会喊出“嗨,刚刚在这一帧中出现(或移动)的一组像素是什么?”,然后决定“快!在周围画一个绿色方框,让人类知道我们检测到了物体。”

下图 7 显示了采用背景减除法的应用(使用实时流媒体播放)检测到对象。但该应用不提示该物体是什么。它仅查找前一帧没有出现的大范围像素 — 查找不同之处。

图 7.鬼鬼祟祟的 BunnyPeople™ 玩偶无法躲过基于背景减除法的应用的检测。

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

检测技巧OpenCV 库的函数/类示例
背景减除法
边缘检测
Absdiff
cv::bgsegm::BackgroundSubtractorMOG
cv::bgsegm::BackgroundSubtractorGMG
Canny

从抽象到具体

气体检测器指检测或感知是否存在气体的设备。根据设备精度的不同,如果存在甲烷、酒精气体、丙烷和其他化合物,可发出警报。金属探测器指检测是否存在金属(对于金属探测器来说,金、铜和铸铁都是一样的)的工具。对象检测器可发现是否存在对象 — 对象所在区域是这一帧中的像素范围。从抽象到具体时 — 从气体到甲烷,从金属到黄金,从对象到人 — 暗含着我们之前对具体事物的了解。通过这一点就可区分检测和识别 — 知道该对象是什么。我们可以认出检测到的气体是甲烷。我们可以确定探测到的金属是黄金。我们可以认出检测到的对象是一个人。对象识别技巧可帮助我们创建更精确的计算机视觉应用,以对该对象的细节(人或猿猴、男性或女性、鸟或飞机)进行处理。识别就像是在检测的基础上放上一副验光眼镜。放上眼镜后,我们就可以识别出远处微小模糊的对象实际上是猫,而不是石头。

识别

这里,算法更加好奇,问道:那儿有什么

之前有所了解

《韦氏词典》*将识别定义为:

 

由于之前有所了解或经验而知道是谁或某物的行为。

根据这一定义,我们知道对象识别是识别或了解(图像或视频帧中)事物性质的过程。识别(应用)可以基于匹配、学习或模式识别算法,目的标记(分类)某一对象 — 从而提出问题:该对象是什么

下图来源于鸟类识别与标记应用(使用英特尔® Movidius™ 神经计算棒)。更多关于该示例应用的信息可访问GitHub*。请注意标记“秃鹰”后面的“1.00”。它是与识别有关的置信度,此处算法百分百确定该对象是一只秃鹰。但对象识别并不能总保持这种精确度。

图 8.完全肯定地识别秃鹰。

在另一张图像(图 9)中,相同的应用不能完全确定在海岸线上盘旋的对象。尽管不能识别左侧远处的对象具体是什么,但能够准备将其与通用的对象类别“鸟”联系起来。对于其他对象,该应用持观望态度 — 无法确定该对象是信天翁或似乎是仓鸮。

图 9.经过训练以识别鸟类的识别应用无法确定图像中的对象。

而且,由于术语的使用不一致,有些人可能认为(检测识别)是一回事。但经过参考上述定义,可以肯定的是对象检测(发现某物在那儿)不能等同于识别某物是什么(由于算法之前有所了解,所以能够准确认出该对象)。

识别行为(我知道那个对象是秃鹰,与检测行为(我看到那儿有东西)是不同的。但当看到对象时,算法如何准确得知那是秃鹰?我们能否告诉算法如何通过其他鸟类知道该对象是秃鹰?大家知道,编写一款详细介绍秃鹰和其他鸟类的习性的计算机程序。事实证明,有些事我们无法有效计算机(提供指令),因此我们必须设计能够自主学习的算法。

学习经验的算法

我们使用识别技巧(足够聪明以区分海鸥和飞机的算法)进一步探明对象的性质。有些算法能够准确分类对象,因为它们经过训练 — 我们称之为机器学习算法。而且算法获取关于某物(比如鸟类)知识的方式是通过训练数据 — 接触数万张不同鸟类的图像,这样该算法能够学习识别不同种类的鸟。机器学习算法之所以适用,是因为它们能够提取图像的视觉特征。然后通过这些特征将某张图像(第一次看到的未知图像)和其他图像(在之前训练过程中“看到过”的图像)联系起来。如果我们在前文引用的识别应用(图 8)没有经过标记为“秃鹰”的图像训练,那么它在看到该图像时无法将鸟标记为秃鹰。但它仍然足够聪明,知道它是一种鸟(如图 9 所示,左侧远处的鸟标记为“鸟”但不知道具体是什么)。

表 2.识别技巧和 OpenCV* 库的函数。

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

跟踪

跟踪算法想知道某物在前方哪个位置。

密切关注某物

跟踪算法不能让某物消失。这些顽强的算法将一直跟随你(如果你是它们感兴趣的对象),无论你走到哪里都跟着你。至少这就是我们对于理想跟踪器的期望。

《韦氏词典》*将跟踪定义为:

 

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

对象跟踪的目的是关注某物(连续视频帧中对象的移动路径)。跟踪算法经常基于或搭配对象检测识别构建,旨在定位(和密切关注)视频流中某一移动的对象(或多个移动对象)。

下面是某一对象的定位记录(跟踪通常处理彼此相关的多个帧),帮助我们了解其位置随着时间的推移是如何变化的。这意味着我们有一个对象移动模型(提示:模型可用于预测)。卡尔曼滤波器(一系列数学方程式)可用于确定对象将来的位置。通过随时间推移所做的一系列测量,该算法支持对过去、现在和将来的状态进行预估。

当然,状态预估可用于跟踪,而且在移动对象情况下,我们希望预测其将来的状态 — 对象尚未做出的未来移动。但我们为何要这样做?对象可能会被遮挡,如果我们最终的目标是维持各帧中的对象身份,了解对象未来的位置可帮助我们处理遮挡情况(当事物成为障碍)。

遮挡问题

遮挡是妨碍大家密切关注某物的问题 — 即对象被暂时遮挡。我们一直在跟踪繁忙街道上的特定行人,后来他们被公交车挡住了。强大的跟踪算法能够处理这一临时遮挡情况,继续锁定感兴趣的人。事实上,这是比较难的一部分 — 确保算法锁定相同的事物,以确保不跟丢目标。即使行人已不在图像中(公交车像素将行人隐藏起来),该算法能够想到他们可能前往的未来路径。因此,我们能够继续有效地跟踪这一行人,尽管有大量障碍遮住了我们的视线。

表 3.跟踪技巧和 OpenCV* 库的函数。

跟踪技巧OpenCV 库的函数/类示例
卡尔曼滤波,CAMShiftcv::KalmanFilter Class
TrackerMIL
TrackerTLD
TrackerMedianFlow

各不相同但不互相排斥的过程

对象检测过程看到某物(我们称之为“对象”的像素子集)在那儿,对象识别技巧用于知道某物是什么 (将对象标记为具体事物,比如鸟),对象跟踪支持我们跟踪某一特定对象的移动路径。

通过准确定义,我们可以将这些过程视作各不相同,相互独立的过程。而将这些定义与其中涉及的算法结合起来有助于我们进一步了解这些术语是不能互换的 — 检测不是识别的近义词,跟踪也不仅仅只是检测的延伸。如果我们知道检测(基于真正的词意)的结果,我们就会知道,检测算法的目的不是分类或识别某物,而是单纯地注意到了它的存在。我们还知道,譬如卡尔曼滤波器等跟踪算法(能够确定对象未来的状态)不仅仅是譬如背景减除的延伸。识别关乎于对事物之前的了解,而检测不是。

现在我们知道,这些术语之间的区别不仅仅是词意的不同,而是过程和结果(基于它们的目的和所涉及的算法的结果)的不同。尽管它们之间各不相同,但这些计算机视觉过程之间没有好坏之分,它们经常相互合作,共同创建更加高级或强大(可靠)的应用 — 例如检测和识别算法搭配使用,或当跟踪出现故障时检测可用作备份。每个过程 — 对象检测、对象识别和对象跟踪 — 都有各自的目的,并相互补充,但......如果我们最终要搭配这些过程(想出一些特别聪明的算法组合)以创建实用、可靠的计算机视觉应用,我们首先需要知道如何区分它们。

代码示例

如需进一步了解本文中提供的部分算法和技巧,请查看 下方 GitHub* 中英特尔物联网开发人员套件库的代码示例。面部访问控制代码示例使用 OpenCV 库中的 FaceDetectorFaceRecognizer 类,而运动热图 则基于背景减除 (MOG)。

有关编译器优化的更完整信息,请参阅优化通知