
# 俯视深度图像中可靠的人体检测与跟踪

Michael Rauter

奥地利技术研究院

奥地利维也纳1220 多瑙城街1号

<mailto:michael.rauter@ait.ac.at>

## 摘要

本文提出了一种适用于俯视摄像机系统采集的深度图像的人体检测与跟踪方法。我们引入了一种全新的特征描述子，在本文研究的场景中，该描述子性能优于简化局部三值模式等现有最优特征。我们利用该特征描述子，通过判别分类方案训练头肩检测器。一个独立的处理步骤确保只需评估数量最少但足够的头肩候选区域，这让算法拥有出色的运行时性能。最后的跟踪步骤可在时间维度上可靠地传播检测结果，输出稳定的跟踪结果。本文提出的方法性能足够优秀，能够识别许多包含尾随、搭肩闯入等具有挑战性的人体场景。

### 1. 引言

视频数据中的人体检测是视频监控领域的核心需求。人们通常需要从这些检测结果中获取衍生信息，例如人体轨迹或场景内的人数。观测场景中存在多个人体会带来诸多挑战，对彼此靠近、可能相互重叠的不同人体进行分割就是典型例子。这类问题在传统二维侧视摄像机布置方案中十分常见，在此背景下，尤其处理拥挤场景时，实现鲁棒的人体检测与分割是一项极其困难的任务。

场景光照变化是开发可靠人体检测算法的另一大难点。传统彩色相机采集的彩色数据对光照变化尤其敏感，短时间内连续帧的像素值就可能发生剧烈变化。此外，阴影和反射也会导致检测算法得到错误结果。

基于距离数据的人体检测与计数，相比传统基于彩色数据的方法更具优势，正变得越来越流行。立体相机系统解决了传统方法对光照条件敏感等缺陷。

当摄像机安装在被测行人上方并垂直向下拍摄时，行人相互遮挡的问题可以得到缓解甚至消除。尽管如此，仍有部分任务存在挑战，例如行人近距离同行（搭肩闯入、尾随进入）的情况。

本文提出了一种用于俯视深度图像的全新人体检测与跟踪方法。我们指出该方法的三个核心优势：(1) 和许多其他方法不同，我们的方法不需要依赖背景建模进行前景/背景分割，因此不会遇到背景建模相关的典型问题，例如前景物体在一段时间后被误归为背景、对短期光照变化敏感，以及由此产生的无效前景分割问题。(2) 我们提出了一种新的特征描述子，可最大化经判别训练的头肩分类器的检测性能。(3) 我们介绍了如何减少分类器需要处理的头部候选区域（即需要检测的潜在头部）数量，从而大幅降低处理时间。

相关工作的讨论将在第2节展开。我们在第3节描述本文提出的方法。接下来，我们在第4节介绍实验与结果。最后，我们在第5节给出本文的结论。

### 2. 相关工作

已有多种方法利用深度信息，采用传统的侧视相机场景设置。在[^7]中，研究者维护了背景图像的均值-标准差背景模型，通过背景减除法检测前景 blobs，再利用每个前景 blob 的深度信息估计场景中人体的位置；不过头部检测不依赖立体信息，而是采用部分椭圆拟合算法实现。在[^6]中，作者使用基于立体视觉的背景减除法将图像分割为不同的视差层，再将这些视差层用于轮廓拟合。

---

分割步骤。最后执行跟踪步骤。在[^5]中，基于立体视觉的人体头部检测采用了尺度自适应滤波器，该滤波器基于近似头部轮廓的椭圆形状构建。研究者利用均值漂移算法抑制伪线索，并在似然图中定位头部。在另一项研究[^9]中，作者提出了一种人体检测方法，该方法利用方向深度特征直方图进行尺度空间搜索，并提出将这类特征与颜色数据结合使用。在[^12]中，研究者提出深度差直方图作为一种新的特征描述子。将检测窗口划分为网格与块，x方向和y方向深度差的局部描述子聚合为直方图。作者使用该描述子训练支持向量机分类器，以在深度图像中检测行人。在[^14]中，作者提出了另一种特征描述子：简化局部三值模式。x方向和y方向的深度差被量化为0、+1和-1，分别对应不同的差值关系，一共得到9种可观测模式。检测窗口被划分为不重叠的块，再由所有块构建直方图。

其他方法采用的设置是将相机安装在被观测人体的上方，垂直向下对准场景。在[^1]中，研究者对头部高度范围内的三维感兴趣体进行分析以定位头部。将深度图像经垂直投影重采样为占据图，以消除透视畸变，再利用高斯混合模型从占据图计算人体位置。在[^13]中，高度图被分割为不同的高度区间，为每个区间生成二值图像，图像中仅保留高度属于对应区间的区域。采用形态学操作（即带圆形结构元素的开运算）定位人体头部，之后在跟踪步骤中对这些头部进行跟踪，并使用卡尔曼滤波预测头部位置。在[^10]中，作者使用自适应背景模型提取前景区域，再在这些前景区域上匹配球形壳模板，确定前景 blob 中头部的数量、位置和高度。在 blob 分割步骤中，作者对包含多个头部的前景 blob 进行分割，最终将检测结果输入基于一组卡尔曼滤波的跟踪器。

### 3. 研究方法

我们提出了一种包含多个算法步骤的人体检测、跟踪与计数方法。第一步我们在深度图中搜索局部极大值3.1。这些点将作为种子点，供下一步3.2的头部定位算法使用。在这一步中我们找到候选头部的中心，并将其交给基于分类的头部检测器3.3。头部检测器会判断该候选头部是否为真实有效的头部。最后一步，跟踪算法对不同时间的检测结果进行聚合，计算出每个头部的运动轨迹3.4。

需要注意的是，我们的算法进行前景/背景分割不依赖背景建模，因此不会遇到背景建模的典型缺陷，例如：长时间静止不动的人最终会被融入背景，进而无法被检测出来。此外，突发的短期光照变化也会导致错误的前景分割。

本文提出的方法以3D立体相机系统提供的场景俯视深度图为基础。在该8位深度图中，距离相机越近的物体像素深度值越小，距离越远的物体深度值越大。无效像素用零编码，表示该像素位置没有可用的有效深度信息。在我们的场景中，相机的安装高度是预先已知的，因此我们可以轻松确定物体在世界坐标系中的高度。我们额外增加了一步对深度图深度值的反转处理，因此地面上物体的深度值从低值开始，物体距离越近深度值越大（深度值为零的无效像素保持不变）。

#### 3.1 局部极大值搜索

该算法步骤的目标是为后续步骤（头部定位算法）生成足够多的初始头部候选。我们通过在深度图中计算局部极大值实现这一目标。极大值搜索的搜索窗口大小设置为预期的最小头部直径（靠近地面的头部的直径大小）。

3.3节的公式2用于计算尺寸已知、与相机距离已知的目标物体的像素尺寸。

我们对来自[^8]的非极大值抑制二维邻域扫描线算法进行了扩展，用于在深度图中搜索局部极大值。我们对原算法的扩展包含三个方面：(1) 我们改进了算法，使其支持非正方形搜索窗口；(2) 我们允许极大值平台在搜索窗口中为该平台生成局部极大值；(3) 我们允许搜索窗口中多个数值完全相同的局部极大值各自生成局部极大值。

需要注意的是，深度值完全相同的平台或多个极大值在实际应用中确实会出现。这是因为我们使用的是8位深度图，局部邻域内出现多个相同深度值的情况并不罕见。因此，本文对原算法所做的扩展对于避免头部被意外抑制至关重要。

---

![Image](images/253607ace41c1950665e1e56d4aa57c6aafbe39ad38f7012130ad56a60190f2a.jpg)

<div style="text-align: center;">(a) regular non-overlapping grids</div>

![Image](images/2db65f3a85195a01580ae70ccb5c693e8c2edb67a534e9b1849824397dddbc57.jpg)

<div style="text-align: center;">(b) overlapping grids</div>

![Image](images/4a090724d3bb4f94fbadd53d48657a5917e8510a2dbbd653bbada7cdb397c06c.jpg)

<div style="text-align: center;">Figure 1. Different configurations of grids</div>

#### 3.2 头部定位算法

局部极大值搜索得到的候选点（种子点）通常与候选头部的真实中心点存在偏差。我们需要得到的正是头部的真实中心，因为后续头部检测器需要将其作为输入。因此该算法步骤的目的就是定位头部的中心。

<div style="text-align: center;">(c) rings of grids (separate histograms)</div>

我们采用了一种与Mean-Shift算法类似的梯度爬升算法 [^3]。我们在计算偏移向量时会纳入无效深度值的考虑。我们使用大小等于预期头部直径的搜索窗口，该大小可以根据种子点的深度值计算得到。对所有种子点执行该梯度爬升算法后，我们得到了最终候选头部的列表。不同的初始候选头部点可能会得到位置相同的最终候选头部点，因此我们通过消除列表中的重复项来处理该问题。

#### 3.3. 头部检测

我们提出了一种新的深度特征描述子，它利用参考值来计算深度差。

我们设计该特征描述子的出发点是快速准确地计算深度图像中矩形像素区域内的平均深度值。需要注意的是，深度图像中可能包含被标记为零值的无效深度，我们在计算过程中必须将无效像素考虑在内（见方程1）。下文我们将该矩形像素区域称为一个块。这类块内的平均深度值计算方式如下：

 $$ \overline{d_{B}}=\frac{\sum\limits_{x\in B}i_{D}}{\left(\left\|B\right\|-\sum\limits_{x\in B}i_{I}\right)} $$

其中 $i_D$ 为深度图像，$i_I$ 为零一映射图，其中1表示对应位置为无效深度值，B为像素块。由于我们需要使用尺度自适应检测窗口，因此需要处理像素块而非单个像素。我们为 [^11] 和 $i_D$ 使用积分图 $i_I$，以高效计算块内所有值的对应求和。纳入无效深度像素是为了保证结果的正确性：无效深度像素的值为零，如果直接用块总和除以块区域内的总像素数，得到的均值会偏低，因此我们会统计无效像素的数量，并将其从分母中扣除。

为了构建局部深度邻域的描述，我们使用一个中心位于头部位置的参考块来计算其他块与该参考块之间的深度差。我们会生成这些深度差值的直方图，直方图各分箱的值组成的向量就是SVM的输入。

我们测试了多组不同的块配置。测试内容包括不同大小的规则块网格，分为无重叠（见图1(a)）和有重叠（见图1(b)）两种情况，同时也测试了手动在检测窗口内放置块的配置。下文我们将介绍手动块放置方案，需要指出的是，本文提出的这种块配置具备旋转不变性。我们在参考块周围以圆形模式定义了多组块（见图1(c)），每一环块到参考块中心的半径都不同。我们为每一环块分别生成直方图，然后将所有直方图的分箱拼接成一个向量，该向量就是SVM的输入。

块的大小由检测窗口的尺寸推导得到，而检测窗口本身是尺度自适应的，具体说明如下。

检测窗口以像素为单位的大小可通过下式计算

 $$ s_{w}=\frac{f}{d}\cdot s_{r} $$

其中f为以像素为单位的焦距，d为目标的预期距离，$s_{r}$ 为目标在垂直于相机光轴方向上的像素尺寸。

---

我们采用支持向量机（SVM）学习与预测对候选头部区域进行分类。上文介绍的特征被用来构建数据向量，用于SVM的训练和分类。我们使用带径向基函数核的LIBSVM [^2]库，并且按照LIBSVM文档的建议，通过网格搜索结合交叉验证优化参数。

正如第4节所示，在我们的目标场景中，本文提出的特征描述子优于简化局部三值模式 [^14] 特征描述子；而在原作者的工作中，该描述子被证明优于来自 [^9]、[^12] 的其他描述子。

#### 3.4 跟踪算法

算法的最后一步是跟踪算法。跟踪算法的目标是找到当前帧检测结果与前序帧中已跟踪目标（轨迹）之间的关联关系。得到的轨迹可供我们提取信息，查看被跟踪人员的移动路径。此外，跟踪还可以抑制检测器产生的单次误报。

由于我们设计时就将运行时性能需求纳入考量，因此我们提出的跟踪问题解决方案只是最优解的一个近似。

针对所有可能的检测结果d和轨迹t，我们计算得到一个关联距离代价矩阵 $C_{d,t}$。我们采用平方欧氏距离计算距离代价，通过阈值定义了关联的最大允许距离：大于该值的关联距离会被惩罚，从而避免该关联被选入最终的关联配置。我们为三种不同的关联规则分别计算代价，选取代价最小的关联配置，以此得到检测结果与轨迹之间的最优关联方案。这三种关联规则分别是：(1) 最近邻关联（检测结果按最小距离排序，按该顺序完成关联），(2) 基于最小可关联检测数的轨迹排序关联（即可作为该轨迹关联候选的检测），(3) 基于最小可关联轨迹数的检测排序关联。

在绝大多数情况下，算法会选择最近邻关联配置，但在部分复杂场景中，(2)和(3)确实是更优的选择。尤其是在低帧率场景下，人员移动速度快，帧间位移大，最近邻规则常常会选出次优配置。我们维护一个包含潜在轨迹和有效轨迹的轨迹列表，在每一帧中都会计算检测结果与轨迹之间的最优关联配置。现有轨迹会根据关联检测得到的新位置更新（旧位置也会保存在轨迹历史中），未关联上的轨迹会被标记为关联失败，位置不更新。当一条轨迹连续预定义数量的帧都无法完成关联，我们就将它从轨迹列表中删除。当前帧中未与现有轨迹关联的检测结果会被用来初始化一条新轨迹，默认情况下新轨迹是潜在轨迹（无效）。潜在轨迹需要连续预定义数量的帧都被检测到，才能成为有效轨迹。通过这种方式，检测器偶尔产生的误报不会成为有效轨迹，也就不会降低方法的整体性能。

### 4 实验与结果

我们比较了分别采用本文提出的特征与简化局部三值模式（Simplified Local Ternary Patterns, SLTP）特征的基于SVM分类器的检测器的检测性能。在[^14]中对SLTP特征进行了介绍与评估，结果显示SLTP的性能优于[^4]中提出的深度方向直方图（Histogram of Oriented Depths, HOG）[^9]特征，以及[^12]中提出的深度差直方图（Histogram of Depth Difference, HDD）特征。与我们的特征类似，HDD特征也利用深度差，但HDD仅计算局部深度差，不使用深度参考值。我们将证明，本文特征在我们的应用场景中性能优于SLTP特征，而正如[^14]中所述，SLTP特征本身又优于HDD特征。

我们的测试使用了包含4212个正样本和14040个负样本的训练集，以及包含5184个正样本和7344个负样本的测试集。所有样本均经过人工标注，并按每$10^{\circ}$次旋转一步的方式自动旋转，以生成更多样本，提升数据集的多样性。测试结果表明，我们提出的特征性能优于SLTP特征（参见表1）。虽然所有方法的真阳性检测率都表现不错，但我们的方法在真阴性检测率上更具优势。

![Image](images/be57193203d0613f013f14a9c647e414e487e3392ec09034fdf153b6e82dfd28.jpg)

<div style="text-align: center;">Table 1. Feature performance comparison</div>

我们使用C++实现了所提算法，采用Intel集成性能基元（Intel Integrated Performance Primitives）完成快速图像处理操作，使用LIBSVM [^2]进行支持向量机的训练与分类。算法的运行时性能如表2所示。测试系统配置为：搭载4物理核心+4虚拟核心@2.93 GHz的Intel Xeon处理器、12 GB内存，运行64位Windows7操作系统。

---

chine。我们分别编译了该算法的32位版本与64位版本。64位版本的运行速度略快于32位版本，这一结果符合预期，因为所用操作系统本身就是原生64位系统。因此我们仅给出64位实现的计时结果。目前该算法仅在单个处理器核心上运行。

头部假设生成步骤占用了最多的运行时间，这符合预期，因为该步骤同时涉及极大值搜索和梯度爬山算法。其中尤其是极大值搜索需要扫描整幅图像，因此计算量很大。由于头部候选区域的数量在头部假设生成步骤已经被大幅缩减，所有头部候选的SVM头部分类步骤计算时间适中，该步骤的处理时间约为1毫秒。第3节提到的深度值转换步骤占用0.5毫秒。从表2可以看出，其余步骤（特征计算与跟踪）占用的时间可以忽略不计。

总处理时间不到3.5毫秒，这一结果十分可观。

<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>algorithm step</td><td style='text-align: center; word-wrap: break-word;'>runtime</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>depth values conversion</td><td style='text-align: center; word-wrap: break-word;'>0.52 msec</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>head hypothesis generation</td><td style='text-align: center; word-wrap: break-word;'>1.77 msec</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>depth difference histogram computation</td><td style='text-align: center; word-wrap: break-word;'>0.04 msec</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>svm-based head classification</td><td style='text-align: center; word-wrap: break-word;'>1.09 msec</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>association/tracking</td><td style='text-align: center; word-wrap: break-word;'>0.01 msec</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>total</td><td style='text-align: center; word-wrap: break-word;'>3.43 msec</td></tr><tr><td colspan="2">algorithm runtime (average of 1000 frames)</td></tr><tr><td colspan="2">depth image dimensions: 608×328 pixels</td></tr><tr><td colspan="2">test system: Intel Xeon CPU with 4 physical and 4 virtual cores @ 2.93 GHz,</td></tr><tr><td colspan="2">12 GB RAM running on Windows7 64-bit</td></tr></table>

<div style="text-align: center;">Table 2. Average runtime performance of the algorithm</div>

该算法已集成到需要人员分离和计数功能的自动边检系统中。图2展示了我们的方法在该场景下的部分跟踪结果。轨迹仅在预定义的感兴趣区域（region of interest, ROI）内计算。在更大的（黄色）ROI内会启动新的潜在轨迹，但只有在更小的（绿色）ROI内出现的轨迹才会被允许成为有效轨迹。每条轨迹都被分配了一个唯一标识符。此外，系统还会显示计算得到的人员身高，单位为厘米。左上角会显示当前人员计数，该计数就是所有有效轨迹的总和。

图2(a)展示了两名距离很近的行人（背驮同行）的运动轨迹。尽管右侧行人蹲在身材更高大的左侧行人身旁，该算法仍然能够正确检测并跟踪这两个人。图2(b)展示了三人背驮同行的场景，算法可以正确检测和跟踪每一个独立个体。图2(c)和2(d)展示了我们用帽子干扰系统的测试案例，该帽子拥有和人类头部相近的深度值。可以看到：仅一顶帽子、没有对应人类肩部的深度值时，不会产生错误检测（图2(c)）；当帽子被举在人类头部的高度，且靠近人类肩部时，就会产生错误检测，干扰跟踪器，使其将帽子分配为一个先前已跟踪头部的轨迹（图2(d)）。图2(e)和2(f)展示了两个携带行李、背负背包的行人案例，这类情况不会产生错误检测或虚假轨迹。

### 5. 结论与未来工作

本文提出了一种在俯视视角深度图像中检测、跟踪并统计行人数量的方法。我们描述了该算法涉及的所有步骤，尤其是我们关于合适特征及其对分类性能影响的研究结果。研究表明，我们的方法可以成功解决背驮同行、尾随跟走这类特别困难的场景。由于我们的算法不依赖背景建模，因此不会受到背景建模缺陷的影响，这让我们的方法具备很强的鲁棒性，适用于真实场景。我们给出了该算法运行时间的整体分析。我们也提出了算法的若干扩展与改进方向：将本文提出的特征描述符与其他特征（例如彩色数据上的HOG特征）结合，可以进一步提升检测性能；利用多个处理器核心处理算法的部分模块，可以进一步提升算法的计算性能，例如头部定位步骤中的梯度爬升计算就可以对每个种子点并行处理。

## 参考文献

[^1]: D. Beymer. Person counting using stereo. In Proceedings of the Workshop on Human Motion, pages 127–133, 2000.

[^2]: C.-C. Chang and C.-J. Lin. LIBSVM: A library for support vector machines. ACM Transactions on Intelligent Systems and Technology, 2:27:1–27:27, 2011. Software available at <http://www.csie.ntu.edu.tw/~cjlin/libsvm>.


## [^3]: D. Comaniciu, P. Meer, and S. Member. Mean shift: A robust approach toward feature space analysis. IEEE Transactions on Pattern Analysis and Machine Intelligence, 24:603–619, 2002.


---

![Image](images/163d380aa32186ebca01a26e113fe29fbd97d16ce33bbda228e84d90d8a86bf3.jpg)

<div style="text-align: center;">(a) piggybacking persons (right person crouching)</div>

![Image](images/5ad520b5acbbcd660e1b9cb1383ac0c77a5ddbd8acd6230339636d4ff0ffaa4d.jpg)

<div style="text-align: center;">(c) hat with no supporting body parts (shoulder)</div>

![Image](images/b007d4ac1032ac963f6a9e8c9500fa02dc23ec30c8cbb6ed9dc84efcc24a8ae1.jpg)

![Image](images/85704a74bdb20c367de607665ee25484bb0f3e9db6810235d25a0af79cef3c99.jpg)

<div style="text-align: center;">(e) person with luggage not affecting detection quality</div>

<div style="text-align: center;">(b) 3 persons piggybacking</div>

![Image](images/d17ca6eca7fea8688934de67680d8ed82428b1fe410adeb96e746bdcb45b41fa.jpg)

<div style="text-align: center;">(d) hat and supporting shoulder depth values distracting tracking</div>

![Image](images/94151253c7cfe7e29c9695bc13a6ee8f815dd6d26c2164362e493dc948791463.jpg)

<div style="text-align: center;">(f) person with backpack not affecting detection quality</div>

<div style="text-align: center;">Figure 2. Resulting trajectories of our method in a framework for tracking and counting humans in a gate system</div>

[^4]: N. Dalal and B. Triggs. Histograms of oriented gradients for human detection. In In CVPR, pages 886–893, 2005.

[^5]: X. Huang, L. Li, and T. Sim. Stereo-based human head detection from crowd scenes. In International Conference on Image Processing, pages 1353–1356 Vol.2, 2004.

[^6]: R. Luo and Y. Guo. Real-time stereo tracking of multiple moving heads. In Proceedings of the IEEE ICCV Workshop on Recognition, Analysis, and Tracking of Faces and Gestures in Real-Time Systems, pages 55–59, 2001.

[^7]: S. Park and J. Aggarwal. Head segmentation and head orientation in 3d space for pose estimation of multiple people. In Proceedings of the 4th IEEE Southwest Symposium on Image Analysis and Interpretation, pages 192–196, 2000.

[^8]: T. Pham. Non-maximum suppression using fewer than two comparisons per pixel. In Advanced Concepts for Intelligent Vision Systems, volume 6474 of Lecture Notes in Computer Science, pages 438–451. 2010.

[^9]: L. Spinello and K. Arras. People detection in rgb-d data. In IEEE/RSJ International Conference on Intelligent Robots and Systems, pages 3838–3843, 2011.

[^10]: T. van Oosterhout, S. Bakkes, and B. J. A. Kröse. Head detection in stereo data for people counting and segmentation. In Proceedings of the Sixth International Conference on Computer Vision Theory and Applications, pages 620–625, 2011.

[^11]: P. A. Viola and M. J. Jones. Rapid object detection using a boosted cascade of simple features. In CVPR, pages 511–518, 2001.

[^12]: S. Wu, S. Yu, and W. Chen. An attempt to pedestrian detection in depth images. In Intelligent Visual Surveillance, 2011 Third Chinese Conference on, pages 97–100, 2011.

[^13]: T. Yahiaoui, C. Meurie, L. Khoudour, and F. Cabestaing. A people counting system based on dense and close stereovision. In Proceedings of the 3rd international conference on Image and Signal Processing, pages 59–66, 2008.

[^14]: S. Yu, S. Wu, and L. Wang. Sltp: A fast descriptor for people detection in depth images. In International Conference on Advanced Video and Signal-Based Surveillance, pages 43–47, 2012.
