
# 面向嵌入式处理的基于深度图像的人流计数

Guilherme S. Soares $^{\text{✉}}$，Rubens C. Machado，Roberto A. Lotufo

巴西圣保罗州坎皮纳斯市坎皮纳斯大学电气与计算机工程学院

<mailto:soares.g@gmail.com>, <mailto:rubens.campos.machado@gmail.com>, <mailto:robertoalotuo@gmail.com>

<http://www.feec.unicamp.br>

摘要。本文提出了一种可在低功耗嵌入式处理器上实现的、基于俯视深度图像的人流计数算法。在行人检测阶段，算法采用形态学连通滤波筛选头部候选区域；在跟踪阶段，采用卡尔曼滤波，以便在检测失败的帧中获得良好的预测结果。本文还提出了一种快速插值算法，可估计受噪声影响的像素值，生成连续域图像。实验使用Kinect传感器采集数据，在树莓派3上实现了实时处理。数据集包含4025段行人进出室内环境的短视频序列，采集自三个不同的安装场景。实验证明该算法适用于嵌入式应用，在帧率低至5.5FPS的情况下仍可达到98%的准确率。

关键词：行人计数 · 深度图像 · 嵌入式处理

## 1 引言

各类传感器成本不断降低，普及率日益提高，推动了自动行人检测相关诸多方案的优化，也催生了新的需求。相关应用包括监控、安防、公共空间行人数量估计以及零售分析。常用的传感器类型从简单的红外对射探测器，到RGB相机、深度相机等更复杂的传感器不等。

目前已有多种用于解决自动行人计数相关问题的技术，这些技术大多依赖传统PC完成处理。例如：针对单RGB相机的方案见[^9] [^10]，针对立体RGB相机的方案见[^1]，针对深度相机的方案见[^2] [^7]。

也有少量研究考虑了低功耗嵌入式处理这一特殊需求。在[^8]中，研究者使用深度相机对房间内的人数进行静态计数，处理工作在树莓派2上完成。在[^4]中，研究者使用了深度传感器网络，传感器

---

连接到树莓派2，以实现对场景中行人的检测与跟踪；该方案最终获得的准确率约为95%。

本文提出了一种基于俯视深度图像的自动人流计数算法，我们还在树莓派3上实现并测试了该算法，使用Kinect深度传感器采集图像，完成了实时处理。

## 2 算法概述

本文提出的算法由四个阶段组成：预处理阶段，执行低级图像处理，为后续分析准备图像；行人检测阶段，识别单帧图像中所有行人的坐标；跟踪阶段，建立连续帧之间行人坐标的对应关系，确定行人轨迹；计数阶段，分析每条轨迹，判断该运动是进入、离开还是无效运动。这些步骤按顺序对视频的每一帧执行，后续将对其进行更详细的介绍。

### 2.1 预处理

预处理阶段包含四个步骤。第一步为二次采样操作，最终得到尺寸为$320 \times 240$像素的图像，以实现更快的处理速度；第二步将Kinect提供的10位原始视差值映射到8位线性图像中，使得生成的值与传感器到空间中对应点的距离（单位为米）成正比；第三步对图像进行求反；第四步则使用插值算法估算值未知的像素。

插值算法。Kinect传感器获取的深度图像通常存在一些固有噪声，这会导致部分像素的深度值未知。该问题主要由光源干扰、极暗表面、半透明物体、镜面反射，以及会在红外投影中形成阴影的遮挡导致。尽管带噪声像素的深度值无法确定，但传感器可以正确识别出这些像素，因此我们可以使用方法填充这些空缺。

该方法通过将所有无效像素设为0，再应用连续条件膨胀，完成有效像素的插值。每次迭代中，条件图像为所有无效像素构成的掩码。重复膨胀操作，直到所有初始无效像素都被赋予值，如图1所示。该过程与形态学重建的区别在于，由于条件图像会在每次迭代更新，每个像素的值仅会被修改一次。有关条件膨胀和其他形态学操作的更多细节可参见[^5]。

---

形态学操作的实现往往非常耗时。在本应用中，我们首先按照[^3]中的方法对无效像素计算距离变换，得到每个无效像素与其最近有效像素之间的距离，以此实现快速执行。接下来，我们将所有无效像素按距离升序排序，随后依次对这些像素应用膨胀操作，仅需为每个像素赋予其有效邻域中的最大值即可。

![Image](images/f37aeaddb981a0883383a295fb1c8818129c5216987a7d111c547b8e19010f47.jpg)

<div style="text-align: center;">Fig. 1. Examples of the interpolation algorithm for images with different levels of noise. The areas in red represent the pixels with unknown values, as provided by the Kinect sensor. (Color figure online)</div>

### 2.2 人体检测

算法的该阶段旨在识别单幅图像中所有存在的人体坐标。该过程分为两步实现：首先提取图像中所有的区域极大值；接下来根据若干参数对这些区域极大值进行过滤，仅保留更有可能对应人体的区域极大值。

根据[^5]中的定义，区域极大值是不与更高灰度值平坦区域相邻的平坦区域。它与局部最大值的区别在于，区域极大值是整个区域的属性，而非单个像素的属性。由于图像整体灰度存在细微变化，要提取相关的区域极大值必须进行过滤，否则得到的区域极大值数量会过多，且都对应非常小的区域。通过使用[^5]中描述的h-极大值算子，我们可以得到关联性更强的区域极大值，这些极大值实际上对应场景中有意义的物体。

获得经h-maxima算子滤波得到所有区域极大值后，下一步是筛选出更有可能对应场景中人体头部的区域极大值。我们通过分析每个区域极大值的两个标准完成筛选：其一，区域必须满足最小面积要求，借此排除尺寸过小的目标；其二，区域必须满足最小宽高比要求，借此排除过于细长的目标。随后计算筛选得到的区域的质心，作为跟踪阶段的输入。

---

![Image](images/cf3f62e96cf4f4f19286d56779225f94ba8c76604d2d7717414487799f0beedf.jpg)

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

![Image](images/ad1153bee08009d42b811573e545c063193c89dc8c171dbcf5216149d2074bc7.jpg)

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

![Image](images/16395f0d782507bfb376bf55140202710e26ca7d4f51e5a12b9324701529e9ca.jpg)

<div style="text-align: center;">(c)</div>

![Image](images/fabf1d7e8ea0e54ffecb131ba57ee51eaab1cbd654020cb086cc5b2210282550.jpg)

<div style="text-align: center;">(d)</div>

<div style="text-align: center;">Fig. 2. Steps of the people detection stage: (a) input image; (b) thresholding and area open operations; (c) regional maxima after h-maxima operation; and (d) selected regional maxima.</div>

为了获得更好的检测结果，我们在检测区域极大值之前还应用了阈值处理和面积开运算。阈值处理有助于排除高度过高或过低、不符合人头高度特征的目标，面积开运算则可以消除阈值处理后可能产生的噪声。图2总结了行人检测阶段的最终流程。

### 2.3 跟踪

跟踪阶段的任务是通过在连续两个视频帧的检测质心之间建立对应关系，确定场景中每个行人的运动。本文采用的方法仅考虑质心的空间坐标；后续改进可在匹配过程中加入关联区域的其他信息，例如形状、面积等。

预测与匹配。为了提高质心匹配的准确率，我们为每个质心使用一个卡尔曼滤波[^6]来预测其在下一帧中的位置。卡尔曼滤波还可以校正测量得到的位置，从而降低测量噪声，生成更平滑的轨迹。此外，对于行人在部分帧中未被检测到的序列，卡尔曼滤波可以估计出行人在这些未检测帧中的位置，这对维持跟踪是必不可少的。

跟踪阶段的第一步是使用卡尔曼滤波，预测上一帧场景内所有质心在当前帧的位置。随后，将每个预测质心与当前所有检测得到的质心进行比较，计算它们之间的欧氏距离。得到的结果是一个存储所有两两距离的$m \times n$矩阵D，其中m是上一帧预测质心的数量，n是当前帧检测质心的数量。之后按距离升序依次分析D中的每个元素；对于每个元素$d_{i,j}$，若满足以下标准，则确定质心i和质心j匹配：

– 距离$d_{i,j}$不超过最大距离$d_{\max}$；

- 质心i和质心j都尚未与其他质心匹配。

---

确定所有匹配关系后，当前帧中与上一帧存在对应关系的质心会由卡尔曼滤波校正位置。当前帧中未匹配上的质心被认定为是刚进入场景的新行人，我们为每个这类质心初始化一个新的卡尔曼滤波。最后，上一帧预测得到的未匹配质心会被传播到当前帧，但已经达到最大连续传播次数的质心除外；这类质心被认定为已经离开场景，因此将其丢弃。图3展示了跟踪阶段的主要步骤。

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

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

![Image](images/a250a0574791374b33165576eb49960e75eceaa2aecbf2285e763f6658a5f031.jpg)

<div style="text-align: center;">(c)</div>

<div style="text-align: center;">(d)</div>

<div style="text-align: center;">(e)</div>

<div style="text-align: center;">Fig. 3. Steps of the tracking stage: (a) true motion of centroids between two consecutive frames; (b) predictions made by the Kalman filter; (c) distances below the threshold  $d_{max}$; (d) matches between centroids; (e) corrections made by the Kalman filter.</div>

卡尔曼滤波。在卡尔曼滤波理论中，k时刻系统真实状态x演化的通用模型为

 $$ \mathbf{x}_{k}=\mathbf{F}_{k}\mathbf{x}_{k-1}+\mathbf{G}_{k}\mathbf{u}_{k}+\mathbf{w}_{k} $$

其中$\mathbf{F}_k$为转移模型，$\mathbf{G}_k$为控制输入模型，$\mathbf{w}_k$为过程噪声。真实状态的观测值$\mathbf{z}_k$由下式给出

 $$ \mathbf{z}_{k}=\mathbf{H}_{k}\mathbf{x}_{k}+\mathbf{v}_{k} $$

其中$\mathbf{H}_k$为观测模型，$\mathbf{v}_k$为观测噪声。

在本特定应用中，动态系统模型十分简单：该模型假设人员的预测位置取决于其当前位置和当前速度，并且在没有输入（加速度）的情况下

---

其预测速度将保持不变。实际加速度为未知量，完全由过程噪声$\mathbf{w}_k$建模。因此，式(1)变为

 $$ \underbrace{\left[\begin{matrix}{x_{k}}\\ {y_{k}}\\ {z_{k}}\\ {\dot{x}_{k}}\\ {\dot{y}_{k}}\\ {\dot{z}_{k}}\\ \end{matrix}\right]}_{\mathbf{x}_{k}}=\underbrace{\left[\begin{matrix}{1}&{0}&{0}&{\Delta t}&{0}&{0}\\ {0}&{1}&{0}&{0}&{\Delta t}&{0}\\ {0}&{0}&{1}&{0}&{0}&{\Delta t}\\ {0}&{0}&{0}&{1}&{0}&{0}\\ {0}&{0}&{0}&{0}&{1}&{0}\\ \end{matrix}\right]}_{\mathbf{F}_{k}}\underbrace{\left[\begin{matrix}{x_{k-1}}\\ {y_{k-1}}\\ {z_{k-1}}\\ {\dot{x}_{k-1}}\\ {\dot{y}_{k-1}}\\ {\dot{z}_{k-1}}\\ \end{matrix}\right]}_{\mathbf{x}_{k-1}}+\mathbf{w}_{k} $$

其中$\Delta t$为连续两帧之间的时间间隔。

至于观测模型，我们唯一能够测量的量就是质心位置。因此，式(2)可以写为

 $$ \underbrace{\left[\begin{matrix}{x_{k}}\\ {y_{k}}\\ {z_{k}}\\ \end{matrix}\right]}_{\mathbf{z}_{k}}=\underbrace{\left[\begin{matrix}{1\quad0\quad0\quad0\quad0}\\ {0\quad1\quad0\quad0\quad0}\\ {0\quad0\quad1\quad0\quad0}\\ \end{matrix}\right]}_{\mathbf{H}_{k}}\underbrace{\left[\begin{matrix}{x_{k}}\\ {y_{k}}\\ {z_{k}}\\ {\dot{x}_{k}}\\ {\dot{y}_{k}}\\ {\dot{z}_{k}}\\ \end{matrix}\right]}_{\mathbf{x}_{k}}+\mathbf{v}_{k} $$

丢帧问题。Kinect传感器的采集帧率为30 FPS。但在实际应用中，无法保证所有采集到的帧都能在实时应用中完成处理。有限的处理能力以及其他硬件限制，使得处理帧率更低且不恒定。由于跟踪是与时间相关的步骤，因此必须考虑两个已处理帧之间经过的实际时间$\Delta T$。特别需要注意以下几点：

卡尔曼滤波的预测阶段应当重复n次；n表示算法两次迭代之间的帧步长，即自上一次处理帧后采集到的帧数，由下式给出

 $$ n=\frac{\Delta T}{\Delta t} $$

– 由于不确定性会随连续预测次数的增加而增大，因此阈值距离$d_{max}$应当随n增大给出更大容差，可设置为

 $$ d_{\mathrm{m a x}}=v_{\mathrm{m a x}}\Delta T $$

其中$v_{max}$为假设的人员最大移动速度。

---

## 3 实验

### 3.1 数据集

实验共使用了三套不同的实验装置，各有不同特性，如表1和图4所示。图像采集完成后，会同步进行处理、记录，同时保存算法输出。后续分析中，我们将所有数据拆分为4025个短视频序列，并为每个序列手动标注了对应的人员进出数量。

<div style="text-align: center;">Table 1. Characteristics of the three installations.</div>

<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>Installation A</td><td style='text-align: center; word-wrap: break-word;'>Installation B</td><td style='text-align: center; word-wrap: break-word;'>Installation C</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Sensor height ( H)</td><td style='text-align: center; word-wrap: break-word;'>2.90 m</td><td style='text-align: center; word-wrap: break-word;'>3.80 m</td><td style='text-align: center; word-wrap: break-word;'>4.00 m</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Zenith angle ( $\theta$)</td><td style='text-align: center; word-wrap: break-word;'>5°</td><td style='text-align: center; word-wrap: break-word;'>15°</td><td style='text-align: center; word-wrap: break-word;'>15°</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Door type</td><td style='text-align: center; word-wrap: break-word;'>Hinged</td><td style='text-align: center; word-wrap: break-word;'>Hinged</td><td style='text-align: center; word-wrap: break-word;'>Sliding</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Door material</td><td style='text-align: center; word-wrap: break-word;'>Glass</td><td style='text-align: center; word-wrap: break-word;'>Glass</td><td style='text-align: center; word-wrap: break-word;'>Glass</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Room type</td><td style='text-align: center; word-wrap: break-word;'>Hallway</td><td style='text-align: center; word-wrap: break-word;'>Open room</td><td style='text-align: center; word-wrap: break-word;'>Open room</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Direct sunlight</td><td style='text-align: center; word-wrap: break-word;'>Yes</td><td style='text-align: center; word-wrap: break-word;'>Yes</td><td style='text-align: center; word-wrap: break-word;'>No</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Sunlight source</td><td style='text-align: center; word-wrap: break-word;'>Skylight above</td><td style='text-align: center; word-wrap: break-word;'>Front door</td><td style='text-align: center; word-wrap: break-word;'>-</td></tr></table>

![Image](images/0f4fedfd36e36043002389333e308ea82bb9f569f11586cb14a3be8df2df383d.jpg)

![Image](images/1d44c13292943fe1e2887c8d838080eb123f69246f1c1cf15aa618ba7a236823.jpg)

<div style="text-align: center;">Fig. 4. Sample images of each installation.</div>

### 3.2 结果

处理工作由Raspberry Pi 3实时完成，该设备配备1.2GHz四核ARM处理器和1GB内存。实验结果如表2所示。对于实时执行，平均帧率a

<div style="text-align: center;">Table 2. Results of the experiments for the three installations.</div>

<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>Valid pixels</td><td style='text-align: center; word-wrap: break-word;'>TP</td><td style='text-align: center; word-wrap: break-word;'>FN</td><td style='text-align: center; word-wrap: break-word;'>FP</td><td style='text-align: center; word-wrap: break-word;'>Recall</td><td style='text-align: center; word-wrap: break-word;'>Precision</td><td style='text-align: center; word-wrap: break-word;'>Accuracy</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Installation A</td><td style='text-align: center; word-wrap: break-word;'>83.0%</td><td style='text-align: center; word-wrap: break-word;'>964</td><td style='text-align: center; word-wrap: break-word;'>25</td><td style='text-align: center; word-wrap: break-word;'>14</td><td style='text-align: center; word-wrap: break-word;'>0.97</td><td style='text-align: center; word-wrap: break-word;'>0.99</td><td style='text-align: center; word-wrap: break-word;'>0.96</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Installation B</td><td style='text-align: center; word-wrap: break-word;'>66.8%</td><td style='text-align: center; word-wrap: break-word;'>807</td><td style='text-align: center; word-wrap: break-word;'>147</td><td style='text-align: center; word-wrap: break-word;'>10</td><td style='text-align: center; word-wrap: break-word;'>0.85</td><td style='text-align: center; word-wrap: break-word;'>0.99</td><td style='text-align: center; word-wrap: break-word;'>0.84</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Installation C</td><td style='text-align: center; word-wrap: break-word;'>86.8%</td><td style='text-align: center; word-wrap: break-word;'>1462</td><td style='text-align: center; word-wrap: break-word;'>14</td><td style='text-align: center; word-wrap: break-word;'>16</td><td style='text-align: center; word-wrap: break-word;'>0.99</td><td style='text-align: center; word-wrap: break-word;'>0.99</td><td style='text-align: center; word-wrap: break-word;'>0.98</td></tr></table>

---

在Raspberry Pi 3上约为5.5 FPS。可以看出，系统在特定装置下的最大精度与图像采集质量密切相关，每帧有效像素的平均百分比就是证明。

## 4 结论

我们在真实场景中开展的实验证明，使用深度传感器能够实现高精度人流量统计，同时支持实时嵌入式处理。我们的算法精度可达98%，结果可与文献中已有的人流量统计研究结果相媲美，并且能够在低功耗单板计算机上完成全部计算。

## 参考文献

[^1]: Bernini, N., Bombini, L., Buzzoni, M., Cerri, P., Grisleri, P.: An embedded system for counting passengers in public transportation vehicles. In: 2014 IEEE/ASME 10th International Conference on Mechatronic and Embedded Systems and Applications (MESA), pp. 1–6, September 2014

[^2]: Bondi, E., Seidenari, L., Bagdanov, A.D., Del Bimbo, A.: Real-time people counting from depth imagery of crowded environments. In: 2014 11th IEEE International Conference on Advanced Video and Signal Based Surveillance (AVSS), pp. 337–342. IEEE (2014)

[^3]: Borgefors, G.: Distance transformations in digital images. Comput. Vis. Graph. Image Process. 34(3), 344–371 (1986)

[^4]: Burbano, A., Bouaziz, S., Vasiliu, M.: 3D-sensing distributed embedded system for people tracking and counting. In: 2015 International Conference on Computational Science and Computational Intelligence (CSCI), pp. 470–475, December 2015

[^5]: Dougherty, E.R., Lotufo, R.A.: Hands-on Morphological Image Processing. SPIE Tutorial Texts in Optical Engineering, vol. TT59. SPIE Publications, Bellingham (2003)

[^6]: Kalman, R.E.: A new approach to linear filtering and prediction problems. J. Basic Eng. 82(1), 35–45 (1960)

[^7]: Malawski, F.: Top-view people counting in public transportation using Kinect. Chall. Mod. Technol. 5, 17–20 (2014)

[^8]: Sgouropoulos, D., Spyrou, E., Siantikos, G., Giannakopoulos, T.: Counting and tracking people in a smart room: an IoT approach. In: 2015 10th International Workshop on Semantic and Social Media Adaptation and Personalization (SMAP), pp. 1–5, November 2015

[^9]: Yang, D.B., Gonzalez-Baos, H.H., Guibas, L.J.: Counting people in crowds with a real-time network of simple image sensors. In: 2003 Proceedings of the Ninth IEEE International Conference on Computer Vision, pp. 122–129. IEEE (2003)

[^10]: Zhang, E., Chen, F.: A fast and robust people counting method in video surveillance, pp. 339–343. IEEE, December 2007
