
# 基于RGB-D信息的实时准确人群计数

Huiyuan Fu, Huadong Ma, Hongtian Xiao

北京大学通信软件与多媒体重点实验室，北京邮电大学，北京 100876，中国 fu\_hui\<mailto:_yuan@yahoo.com.cn>, <mailto:mhd@bupt.edu.cn>, <mailto:buptxht@gmail.com>

## 摘要

实时准确的人群计数是智能视觉监控系统中的一项重要任务。 过去的大多数研究只能在没有严重遮挡的情况下，对经过的人进行鲁棒计数，而这在实际监控场景中非常常见。 为了解决这个问题，我们提出了一种使用商用深度摄像头，针对RGB-D（RGB加深度）数据的人群计数新方法。 在我们的方法中，我们首先通过基于深度信息的快速模板匹配，检测监控区域中经过或静止人物的每个头部和肩膀，并使用凸包分割进行行人填充。 然后，我们基于RGB信息双向跟踪和计数每个检测到的头部和肩膀。 通过这种方法，我们构建了一个用于鲁棒和快速人群计数的实用系统。 广泛的实验结果表明，我们的方法比最先进的方法有了显着改进，并且构建的系统不仅对严重遮挡具有鲁棒性，而且可以部署在实时人群计数应用场景中。

关键词：监控，人群计数，人数统计，RGB-D数据，实时系统

### 1. 引言

可靠且实时的群体计数是智能视觉监控中的一项关键任务。 它是许多典型基于视觉的应用的基础。 例如，了解公共场所的人群密度可以帮助管理者识别危险情况并适当调节交通。 另一个例子是，博物馆可以根据实时的人流量信息控制进入人数。 尽管如此重要，但在复杂环境中实现鲁棒的人群计数仍然远未完全解决。

最近，计算机视觉方法被广泛用于人群计数或人数统计 [^1] [^2] [^3] [^4] [^5]。

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

<div style="text-align: center;">Fig. 1. Typical scenes with heavy occlusions we addressed for crowd counting in this paper. Current methods are not very robust to these complex scenes.</div>

人群计数也可以被看作是在复杂场景中，在存在严重遮挡的情况下的人数统计（参见图 1）。[^1] 的作者提出了一种用于估计人群的方法，但他们无法准确统计当前的人流量。[^2]、[^3]、[^4]、[^5] 的作者可以在简单的环境中很好地统计人数。但是，他们不可避免地会受到复杂环境的干扰，例如图 1 中的严重遮挡。在本文中，我们提出了一种新的方案来克服这个难题，该难题对人群计数非常重要。我们的方法主要基于来自廉价深度摄像头（如 Kinect）的深度信息。据我们所知，很少有人使用深度数据来通过同时处理从颜色和深度格式捕获的实时画面来计数人。在我们的方法中，我们首先移除背景以获得更好的人群计数。然后，我们使用基于归一化的相关性模板匹配方法来帮助找到行人位置。第三，我们提出了一种新的方案，用于选择凸包分割点，以获得每个独立的行人。最后，我们可以实时双向检测头部和肩膀以进行人群计数。此外，我们的方法不仅可以检测和计数移动的人，还可以检测静止的人。实验结果表明了我们方法的有效性。

本文的其余部分组织如下：第 2 节详细介绍了所提出的方法。第 3 节描述了实验结果和分析。最后，第 4 节总结了本文。

---

![Image](images/c00d29d93e7400c5cb54dc905cfb2fd803055986cc13bba0208abb305e73f87f.jpg)

<div style="text-align: center;">Fig. 2. Illumination of our algorithm. (a) origin color image. (b) origin depth image. (c) background removal result. (d) model for matching. (e) matching result. (f) pedestrian filling and convex hull detection. (g) top head point detection. (h) final head-shoulder detection result.</div>

#### 2.1. 背景移除

### 2. 我们的人群计数算法

为了消除地板对行人分割的影响，并加快以下阶段的模板匹配速度，我们需要首先在我们的算法中移除背景。我们遍历每个像素的深度数据，以获得最大值 H 和最小值 L。每个像素的最终深度值可以通过以下公式计算：

在本节中，我们详细介绍了以下四个方面的算法：背景移除、模板匹配、凸包分割的行人填充以及头部和肩膀检测，用于最终的人群计数。我们的算法摘要在节末列出。

 $$ depth\_{n}ew=\left\{\begin{array}{cc}depth\_{o}ld&if~depth\_{o}ld>L+a(H-L)\\0&else\end{array}\right. $$

其中，a 表示特定场景中的比例因子。在我们的实验中，我们经验性地将 a 设置为 105。这样，我们就可以有效地移除大部分背景（尤其是地板，如图 2(c) 所示）。

#### 2.2. 基于归一化的模板匹配

在我们的算法中，我们使用基于相关性的模板匹配方法来找到最佳拟合点。模板模型的选择细节将在实验部分说明（参见图 5）。在 [^6] 的启发下，我们在模板匹配中使用归一化方案，以减少模板和图像之间的光照变化的影响。该方法如下：

 $$ R(x,y)=\frac{\sum\limits_{x^{\prime},y^{\prime}}[{(x^{\prime},y^{\prime})}.I(x+x^{\prime},y+y^{\prime})]^{2}}{\sqrt{\sum\limits_{x^{\prime},y^{\prime}}T{(x^{\prime},y^{\prime})}^{2}\cdot\sum\limits_{x^{\prime},y^{\prime}}I(x+x^{\prime},y+y^{\prime})^{2}}} $$

![Image](images/4420202ce749ce48ff7d6c7ec475cd1fc3ea0ffe3fecd78578e552533f358fc7.jpg)

<div style="text-align: center;">Fig. 3. Segmentation point chosen condition for convex hull segmentation. (a) original segmentation result from filling image. (b) minimum convex polygon detection result. (c) segmentation point detection result. (d) final result.</div>

其中，I 表示输入图像，T 表示模板，R 表示结果。$T(x', y')$ 和 $I(x + x', y + y')$ 表示如下：

 $$ T(x^{\prime},y^{\prime})=T(x^{\prime},y^{\prime})-\frac{1}{(w,h).\sum_{x^{\prime},y^{\prime}}T(x^{\prime \prime},y^{\prime \prime})} $$

 $$ I(x+x^{\prime},y+y^{\prime})=I(x+x^{\prime},y+y^{\prime})-\frac{1}{(w,h).\sum_{x^{\prime\prime},y^{\prime\prime}}I(x+x^{\prime\prime},y+y^{\prime\prime})} $$

其中，w 和 h 分别表示输入图像的权重和高度。匹配结果如图 2(e) 所示。

#### 2.3. 凸包分割的行人填充

当我们在每个行人中获得最佳拟合点时，我们会在深度图像中填充行人。 我们的方案是在深度小于预先设定的阈值 $\alpha$ 的相邻点处进行填充，直到满足条件为止。

当遮挡严重时，被遮挡的人会被识别为一个人（参见图 3(a)）。 为了克服这个问题，我们在我们的算法中引入了凸包分割方法。 如图 3(b) 所示，我们可以轻松获得最小凸多边形。 然后，如图 3(c) 所示，我们找到起始点和结束点（黄色标记）和深度点（蓝色标记）。 为了获得凸包分割点，我们提出了一种新的方案，如下所示：

 $$ \begin{aligned}condition:\left\{\begin{array}{l}\left|start.x-\min x\right|<\beta or end.x-\min x|<\beta\\\left|start.x-end.x\right|>\eta\\ strat.y<depth_{-}p.y or end.y<depth_{-}p.y\\\left|strat.y-end.y/strat.x-end.x\right|<\varepsilon\end{array}\right.\end{aligned} $$

其中 depth_p 是用于分割的候选点。 min x 表示封闭矩形的 x 值的最小值。 $\beta$、$\eta$ 和 $\varepsilon$ 是阈值。 这样，我们可以获得最终的红色点（参见图 3(c)），最终的分割结果如图 3(d) 所示。

#### 2.4. 头肩检测、跟踪和计数

如图 2(f) 所示，我们已经填充了每个行人。 我们可以轻松找到顶部头部点，例如在图 2(g) 中（白色点）。 然后，我们可以通过设置具有 $20*20$ 比例的正方形来检测头部和肩膀（我们的实验

---

```pseudo
// Algorithm 1: The proposed algorithm for crowd counting

```

初始化：In = 0，Out = 0

- 移除背景，根据公式 (1)。

- 使用模板匹配方法，在公式 (2) 和公式 (4) 之间找到最佳拟合点。

- 用颜色填充每个行人，并根据公式 (5) 选择适合的凸包分割点。

- 基于以上步骤，双向检测、跟踪和计数拥挤的人群。

结果输出：In、Out

![Image](images/248486eef640f3a565a52366754ad1e7794136a11ee37d56398285e237f8f430.jpg)

<div style="text-align: center;">Fig. 4. Results of pedestrian filling with convex hull segmentation according to our proposed condition in Eq. (5).</div>

显示此比例适合大多数场景。 如果我们能够在拥挤的场景中正确检测到每个行人，那么后续的跟踪和计数就是一个简单的任务。 由于篇幅限制，我们在此处不详细介绍。 在实验中，我们将给出我们的最终结果。

### 3. 实验结果

本文提出了一种使用 RGB-D 信息进行人群计数的全新方法。 为了证明我们提出的方案是有效的，我们在以下不同场景中测试了我们的方法。

首先，我们评估了凸包分割和模板选择在我们的算法中的最终结果的性能。 在我们的实验中，将阈值 $\alpha$ 设置为 4。 此外，我们将 $\beta$、$\eta$ 和 $\varepsilon$ 分别设置为 3、15 和 0.8。 如 Fig. 4 所示，我们可以发现凸包分割结果始终正确。

其次，我们详细地展示了我们匹配模型的选择。我们在我们的方法中采用了统计策略。我们综合了10个不同形状和5个不同比例的模型（如图5所示，我们展示了典型的模型）。在我们的实验中，我们发现比例会略微影响性能。如图5所示，我们展示了4个具有不同比例的模型：$10 \times 10$、$14 \times 14$、$20 \times 20$和$30 \times 30$。我们发现$20 \times 20$是最好的（带有红色矩形）。然后，我们在我们的算法中比较了不同形状的模型（参见图5）。视觉说明（图5的顶部）和运行时间表（图5的底部）都表明，它们对最终人群计数的性能非常相似。

![Image](images/cc8d89335fe57083f939dd14d5b43220950b8e3a8539f09ee9165d9e3443eba3.jpg)

<div style="text-align: center;">Fig. 5. Statistical comparison on different models with visual results and mean processing speed for crowd counting. We show three typical models here. Considering the results are similar and processing speed reduction with multiple models meantime, we only use the first model in our experiment.</div>

因此，我们在我们的实验中选择了带有绿色环的模型。

然后，我们通过将其与众所周知的最先进算法[^7] [^8]进行比较来展示我们的方法。基于部分的模型方法[^7]是行人检测的最佳算法之一。基于[^8]的骨骼跟踪方法[^9]在通用环境中是有效的。考虑到篇幅，我们仅在典型的办公室场景和建筑物走廊场景中比较这些方法。请注意，我们重点比较不同方法的人群计数准确性和计数速度。更通俗地说，我们不关心这些方法中使用的特定技术。如图6所示，我们的算法在人群检测方面比[^7]和[^8]更稳健。以下，我们分别在这两个场景中比较了它们的计数准确性和计数速度。如图7所示，当人群不密集时，我们的方法和基于骨骼跟踪的方法[^8]具有相似的结果。它们都比基于骨骼跟踪的方法[^8]更好。但是，当人群密集时，我们的方法更有效。然后，我们评估了这三种算法的处理速度。如图8所示，我们发现我们的方法和[^8]的方法都比[^7]的方法运行得更快。

最后，我们估计了我们的算法在不同复杂场景中的表现，这些场景是我们日常生活中常见的场景。我们选择了五个典型的场景：办公室、地铁入口、扶梯出口、建筑物出口和建筑物走廊。这些场景是我们生活中常见的，并且它们对智能监控的需求是迫切的。基于我们提出的方法，我们开发了一个实用的系统，用于监控人群场景，例如这五个场景。样本结果如图9所示。表1显示了我们的算法在这五个不同场景中的准确性和速度。在本文中，我们重点关注监控近距离但拥挤的区域（例如室内场景、扶梯出口等）。因此，虽然深度相机的感应范围受到限制，但对于我们的监控目的来说，这已经足够。

---

![Image](images/1368a704041cfbb275b039cc9165e557cf085b7d8e76440b2c7678deb2f40801.jpg)

![Image](images/1747c89a7cc721b9247b2faed3fcd6e7e3c72a3168dd9ef9efa8ee447f01d7cb.jpg)

<div style="text-align: center;">Fig. 6. Comparison on crowd detection precision with two state-of-art algorithms in office scene (left) and building corridor scene (right).</div>

![Image](images/b1d2bc9ac7f606f3e1b3e552d798679b0ff2a254304f4e4460b87fdc9ee2ccab.jpg)

![Image](images/28cb684631edf329931eba82d4218cfcaf594bdc372864f97a007fd1027cb96c.jpg)

<div style="text-align: center;">Fig. 7. Comparison on crowd counting precision with two state-of-art algorithms in office scene (left) and building corridor scene (right).</div>

![Image](images/700036a17dd40e30c4339374e894acf8e991de75cdd92e24de2a57dbbcf049fd.jpg)

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

<div style="text-align: center;">Fig. 8. Comparison on crowd counting speed with two state-of-art algorithms in office scene (left) and building corridor scene (right).</div>

### 4. 结论

在本文中，我们提出了一种使用RGB-D信息的全新方案，用于人群计数。我们通过将其与最先进的方法进行比较来评估我们的算法，实验结果具有说服力。基于这种方法，我们构建了一个用于人群计数的实用系统。实验结果表明，我们的方法是有效的。

### 5. 参考文献

[^1]: P. Kilambi, E. Ribnick, A. J. Joshi, O. Masoud, and N. Papanikolopoulos, “Estimating pedestrian counts in groups,” Computer Vision and Image Understanding, vol. 110, pp. 43–59, 2008.

<div style="text-align: center;">Table 1. Test for accuracy and speed of our algorithm for crowd counting</div>

[^2]: H. D. Ma, C. B. Zeng, and C. X. Ling, “A reliable people counting system via multiple cameras,” ACM Transactions on Intelligent Systems and Technology, vol. 3, pp. 1–22, 2012.

<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;'></td><td style='text-align: center; word-wrap: break-word;'># IN</td><td style='text-align: center; word-wrap: break-word;'># OUT</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'># SPEED</td></tr><tr><td rowspan="3">Video 1 (office)</td><td style='text-align: center; word-wrap: break-word;'>Truth</td><td style='text-align: center; word-wrap: break-word;'>410</td><td style='text-align: center; word-wrap: break-word;'>370</td><td style='text-align: center; word-wrap: break-word;'>Head-shoulder detection</td><td style='text-align: center; word-wrap: break-word;'>26.2 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Result</td><td style='text-align: center; word-wrap: break-word;'>398</td><td style='text-align: center; word-wrap: break-word;'>359</td><td style='text-align: center; word-wrap: break-word;'>Total algorithm</td><td style='text-align: center; word-wrap: break-word;'>21.5 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Accuracy</td><td style='text-align: center; word-wrap: break-word;'>97.1%</td><td style='text-align: center; word-wrap: break-word;'>97.0%</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td rowspan="3">Video 2 (subway entrance)</td><td style='text-align: center; word-wrap: break-word;'>Truth</td><td style='text-align: center; word-wrap: break-word;'>360</td><td style='text-align: center; word-wrap: break-word;'>469</td><td style='text-align: center; word-wrap: break-word;'>Head-shoulder detection</td><td style='text-align: center; word-wrap: break-word;'>24.3 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Result</td><td style='text-align: center; word-wrap: break-word;'>351</td><td style='text-align: center; word-wrap: break-word;'>458</td><td style='text-align: center; word-wrap: break-word;'>Total algorithm</td><td style='text-align: center; word-wrap: break-word;'>20.2 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Accuracy</td><td style='text-align: center; word-wrap: break-word;'>97.5%</td><td style='text-align: center; word-wrap: break-word;'>97.7%</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td rowspan="3">Video 3 (escalator export)</td><td style='text-align: center; word-wrap: break-word;'>Truth</td><td style='text-align: center; word-wrap: break-word;'>950</td><td style='text-align: center; word-wrap: break-word;'>1034</td><td style='text-align: center; word-wrap: break-word;'>Head-shoulder detection</td><td style='text-align: center; word-wrap: break-word;'>23.5 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Result</td><td style='text-align: center; word-wrap: break-word;'>932</td><td style='text-align: center; word-wrap: break-word;'>989</td><td style='text-align: center; word-wrap: break-word;'>Total algorithm</td><td style='text-align: center; word-wrap: break-word;'>19.8 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Accuracy</td><td style='text-align: center; word-wrap: break-word;'>98.1%</td><td style='text-align: center; word-wrap: break-word;'>95.6%</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td rowspan="3">Video 4 (building export)</td><td style='text-align: center; word-wrap: break-word;'>Truth</td><td style='text-align: center; word-wrap: break-word;'>1342</td><td style='text-align: center; word-wrap: break-word;'>875</td><td style='text-align: center; word-wrap: break-word;'>Head-shoulder detection</td><td style='text-align: center; word-wrap: break-word;'>25.5 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Result</td><td style='text-align: center; word-wrap: break-word;'>1306</td><td style='text-align: center; word-wrap: break-word;'>861</td><td style='text-align: center; word-wrap: break-word;'>Total algorithm</td><td style='text-align: center; word-wrap: break-word;'>21.2 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Accuracy</td><td style='text-align: center; word-wrap: break-word;'>97.3%</td><td style='text-align: center; word-wrap: break-word;'>98.4%</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td rowspan="3">Video 5 (building corridor)</td><td style='text-align: center; word-wrap: break-word;'>Truth</td><td style='text-align: center; word-wrap: break-word;'>856</td><td style='text-align: center; word-wrap: break-word;'>834</td><td style='text-align: center; word-wrap: break-word;'>Head-shoulder detection</td><td style='text-align: center; word-wrap: break-word;'>23.7 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Result</td><td style='text-align: center; word-wrap: break-word;'>835</td><td style='text-align: center; word-wrap: break-word;'>819</td><td style='text-align: center; word-wrap: break-word;'>Total algorithm</td><td style='text-align: center; word-wrap: break-word;'>20.9 FPS</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Accuracy</td><td style='text-align: center; word-wrap: break-word;'>97.5%</td><td style='text-align: center; word-wrap: break-word;'>98.2%</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td></tr></table>

![Image](images/2513dbb2fa82234914a94965dd3aa471afb4df46d2701442d32764b1b0454697.jpg)

<div style="text-align: center;">Fig. 9. Sample results for crowd counting in different scenes. From left to right: building corridor, building export, escalator export, office and subway entrance.</div>

[^3]: B. Antic, D. Letic, D. Culibrk, and V. Crnojevic, “K-means based segmentation for real-time zenithal people counting,” IEEE International Conference on Image Processing, pp. 2565–2568, 2009.

[^4]: Y. Cong, H. F. Gong, S. C. Zhu, and Y. D. Tang, “Flow mosaicking: real-time pedestrian counting without scene-specific learning,” IEEE International Conference on Computer Vision and Pattern Recognition, pp. 1093–1100, 2009.

[^5]: L. Snidaro, C. Micheloni, and C. Chiavedale, “Video security for ambient intelligence,” IEEE Transactions on Systems, Man and Cybernetics, Part A, vol. 1, pp. 133–144, 2005.

[^6]: G. Bradski and A. Kaebler, “Learning opencv-computer vision with the opencv library,” O'REILLY press, 2009.

[^7]: P. F. Felzenszwalb, R. B. Girshick, D. McAllester, and D. Ramanan, “Object detection with discriminatively trained part based models,” IEEE Transactions on Pattern Recognition and Machine Intelligence, 2010.

[^8]: Microsoft, “Demo of skeleton tracking based method for people tracking,” <http://www.microsoft.com/en-us/kinect/windows/develop/overview.aspx>, 2011.

[^9]: J. Shotton, A. Fitzgibbon, and etc M. Cook, “Real-time human pose recognition in parts from single depth images,” IEEE International Conference on Computer Vision and Pattern Recognition, pp. 1297–1304, 2011.
