前言
什么是人群计数
人群计数(Crowd Counting)是计算机视觉和图像处理领域的一个重要研究方向,旨在通过分析图像或视频中的人群密度和人数来估计人群的规模。这一领域的应用范围广泛,包括安全监控、城市规划、交通管理、公共安全、以及事件管理等。
看起来有点像目标检测做的事情,比如下面的图像:
对于这张图——一张比较稀疏的人群图像貌似使用传统的比如 Yolo 检测算法挨个打检测框一样可以计算出人群数量,那为什么还需要专门的人群计数算法呢?
再来看下面的图:
可以看到相对于第一张图,这张人群图像的人群密度更大了,在较暗处事实上靠人眼都很难辨认是否是人了,对于 Yolo 来说更是如此,然鹅这还不是最夸张的,再来看下面的两幅图:
对于这种情况,类似于 Yolo 的那些检测算法基本无能为力了,错检率误检率回非常非常高,因此我们需要专门的人群计数算法来解决这种问题。
人群计数的应用
人群计数的应用领域非常广泛,各个行业都能利用人群计数技术来优化运营、提升安全性和提高效率。以下是一些主要应用领域的详细介绍:
- 公共安全
- 大型活动监控:
在音乐会、体育赛事和节日庆典等大型活动中,实时监控人群数量可以帮助安全管理人员评估人流密度,并在必要时采取措施,如疏散或限制入场。 - 危机响应:
在发生紧急情况(如火灾、自然灾害等)时,能够实时获取人群信息,帮助制定疏散策略和部署急救资源。
- 大型活动监控:
- 交通管理
-
人流量监测:
在交通繁忙的区域(如地铁站、公交车站、街道等)监测人流量,优化交通信号控制和公共交通调度,以减少拥堵和等待时间。
-
公共交通优化:
根据人流数据分析,调整公共交通的发车频率和运行路线,提升乘客的出行体验。
-
- 城市规划
-
基础设施建设:
通过对人流量的分析,为城市基础设施的设计和建设提供数据支持,确保满足未来人流的需求。
-
区域开发:
监测人群活动的热点区域,为商业区、娱乐场所和公共设施的选址提供依据。
-
- 商业分析
-
零售店流量分析:
商家可以利用人群计数数据分析顾客流量,评估不同时间段和促销活动对顾客到访的影响,从而优化店内布局和促销策略。
-
顾客行为分析:
通过人流分析,商家可以了解顾客的流动路径和停留时间,进而改进产品陈列和店内导航。
-
- 医疗健康
-
医院管理:
在医院和诊所中监控病人流量,帮助优化就诊流程、减少等待时间和提高资源利用效率。
-
公共卫生监控:
在公共场所(如商场、地铁等)监测人流量,以评估疫情传播风险并制定相应的防控措施。
-
- 旅游和景点管理
-
景区人流监测:
在旅游景点实时监测游客数量,帮助管理游客流动,提升游客体验,同时避免拥挤和潜在的安全隐患。
-
智能导览:
结合人流计数与智能导览系统,推荐游客最佳游览时间和路线,避免高峰时段。
-
- 智能建筑
-
访客管理:
在智能建筑中,通过人流监测系统管理访客流量,提升安全性和便利性,例如在办公楼、展览馆等场所。
-
环境控制:
根据人流密度自动调整建筑内的照明、空调等设备,提高能源效率。
-
- 运动和娱乐
-
体育场馆管理:
在体育场馆监测观众流量,优化入场和离场流程,提高观众的观赛体验。
-
娱乐活动分析:
分析游乐园和娱乐场所的客流数据,调整运营策略以提升顾客满意度。
-
- 研究与分析
-
社会行为研究:
学术研究者可以使用人群计数数据分析人群行为、社会互动和动态变化等现象,为社会科学研究提供数据支持。
-
心理学研究:
研究人员可以分析人群在不同场景下的行为反应,理解人类心理和行为模式。
-
- 城市安全监控
-
犯罪预防:
在城市中设置人群计数系统,与监控摄像头结合,帮助警方实时监控潜在的犯罪活动。
-
事件响应:
通过人流量监测,预测和识别异常事件(如暴乱、骚乱等),并快速响应。
-
人群计数算法
基于检测的人群计数算法
毫无疑问,首当其冲的肯定就是目标检测算法了,因为它解决的问题和人群计数要解决的问题高度相似:
也就是将图像输入到目标检测算法中然后输出人群计数即可。
目标检测是对人群进行定位,通过定位的方式来找到人群从而对其进行计数。
在目标场景比较稀疏的情况下,可以看到目标检测算法的效果还是不错的(如上图所示)。
但是之前说过,一旦遇到密集场景,那么目标检测算法的效率和精度是会下跌非常严重的,没办法满足需求,因此这种方式就逐渐被抛弃了。
基于回归的人群计数算法
什么是基于回归方式的人群计数算法?
以上图为例,假设一张图中的人数为 n,那么在经过 CNN 之后 CNN 会直接输出一个值,然后通过该 n 值和预测值进行一个回归计算,然后不断的优化模型从而得到一个基于回归的人群统计模型,这样就可以得到人群数了。
回归计算还记得是啥吧?经典的房价预测问题:
具体可以去看我的这篇博文:《AI基础:从线性回归到梯度下降》
因此对于这种算法的优点和缺点也是明显的:
其实其最大的缺点就是人群数量估计不够准确,假设一个人的肤色和周围环境比较相似的话,那么这个人就很有可能不会被算法给检测到,因此它缺失了对人群定位的信息所以对人群的检测并没有预想的那么优秀。
基于密度图的人群计数算法
因此,针对目标检测算法在密集的场景的缺陷和基于回归的算法缺失人群定位信息的缺陷,于是就提出了基于密度图的人群计数算法。
当然,这种算法也是采用卷积神经网络来搭建模型的:首先输入一张密集人群的图像,当然这张密集图像的每一个人都是通过头部来进行定位的,然后输入到 CNN 中进行特征提取,最后输出一张单通道的密度图。这张密度图反应的是人群的密度分布以及人群的定位信息。那么真实的密度图如何得到?这个我们后面会说。
得到密度图之后,我们又如何计算最终的人群数量呢?
很简单的,其实只需要对密度图进行求和就可以了。待会儿我们在讲真实的密度图怎么得到的时候大家就理解为什么求和就能得到最后的人群数。
如何进行模型的优化呢?其实还是以往的套路:
通过预测得到一个密度图然后和真实的密度图计算损失然后对齐模型进行一个反向传播进行模型优化就可以了。
这个真实的密度图和预测的密度图计算的损失函数我们一般采用的是 欧式距离的损失函数,也有别的,这里不再赘述。
最后介绍一下其优缺点如下:
人群计数模型架构
主流的有如下架构:
常用数据集
数据集其实非常多,这里只列举了比较常用的四个数据集:
真实密度图的生成
前面我们说过,基于密度图的人群计数算法最终会预测得到一个单通道的密度图,那么真实的密度图是如何得到的呢?
我们这里就来解释一下。
其实是采用了高斯方法对人群图进行生成得到的一个真实的密度图。
首先我们会对一张人群图像中的每个人的头部进行一个标注,也就是进行一个点标注,但是这个点并不能反应这个人的范围大小,因为人头部的大小会影响最终的检测效果,如果直接采用点来进行最终预测的话,那么会导致模型的波动也就是训练很不稳定,并且很难收敛,最终的预测效果不会很好。
而采用高斯函数生成最终的密度图是怎么做呢?就是说我们指定这个头部也就是点标注它的给定范围内是它头部的大小,也就是说这是当前这个人他所占据图片中像素的范围。
下面图中的 G 函数公式就是代表的高斯函数:
derta 函数(也就是G函数前面的那个函数)表示就是人头部的标注和周围像素之间的函数关系,然后通过高斯函数 G 生成最终的一个密度范围分布。
注意 β 是一个指定的参数,d一横 表示它和最近 k 个最近邻的距离的平均距离。
对于上图中的这个公式:
它所采用的是一个自适应的几何生成,也就是说当前图片中的人群密度范围的分布是自适应的并不是根据指定的范围来的。
它通过计算 k 个最近邻的距离,也就是说当前这个人可能和周围的几个人是相邻的,那么指定这 k 个最近的人群也就是这个人的范围就是它最终的密度分布,从而进一步提升算法的性能。
如果不太明白的话,再来看下面这幅图:
上图中左边灰色方框中的 1 表示的是我当前标注的一个人的头部的位置,也就是说在灰色九宫格图像的中间位置这个 1 的位置,有一个人。
然后经过上图中的二维高斯函数处理之后,就可以得到右侧粉图中的范围分布或者说密度分布了。
可以计算出其总和为 1,因为高斯函数的最终积分结果是等于 1 的。所蕴含的意思就是说这个人的分布范围就是在这个三乘三的范围之内了,这也就解释了为什么我们之前说求最终的密度图的和就是代表最终人群的数量。
上图中的下面部分也就是对应的代码实现。
σ (sigma)参数表示的是高斯函数图像的瘦与胖(或者说宽与窄)。
这就是真实的密度图的生成过程(对于二维高斯函数的图像啥的一定要有一个理解)。
损失函数定义
欧式距离的解释:
评价指标
主流评价指标: