本文主要是介绍人群计数(Crowd Counting)相关内容,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
引用自知乎链接:人群计数(Crowd counting)从入门到深入
CSDN链接:人群计数:Single-Image Crowd Counting via Multi-Column Convolutional Neural Network(CVPR2016)
人群计数的研究意义
人群计数,又叫人群密度估计,直白的讲就是一种通过计算机计算或估计图像中人数的技术。通过对人群聚集的分析,可以帮助城市管理者、大型活动组织方实时了解人群拥挤情况,以利于早期防范群体事件、人群踩踏等,在视频监控、公共安全方面的应用广泛。
人群计数的研究目标
人群计数的研究目标是为了得到图像中人群的分布和人的数目。
人群计数的常用数据集
数据集名称 | 年 | 属性 | 平均分辨率 | 样本数目 | 人头数目 | 平均Cnt | 链接 |
---|---|---|---|---|---|---|---|
Name | Year | Attributes | Avg. Resolution | No. Samples | No. Instance | Avg. Cnt | Link |
IOCfish5K | 2023 | Congested | 1080*1920 | 5,637 | 659,024 | 117 | IOCfish5K |
FUDAN-UCC | 2022 | Congested, Unlabeled | 612*448 | 4,000 | - | - | FUDAN-UCC |
RGBT-CC | 2021 | Congested, Thermal | 640*480 | 2,030 | 138,389 | 68 | RGBT-CC |
NWPU-Crowd | 2020 | Congested, Localization | 2191*3209 | 5,109 | 2,133,375 | 418 | NWPU-Crowd NWPU2 |
JHU-CROWD++ | 2020 | Congested | 1430*910 | 4,372 | 1,515,005 | 346 | JHU-CROWD++ |
UCF-QNRF | 2018 | Congested | 2013*2902 | 1,535 | 1,251,642 | 815 | UCF-QNRF |
ShanghaiTech Part A | 2016 | Congested | 589*868 | 482 | 241,677 | 501 | ShanghaiTech |
UCF_CC_50 | 2013 | Congested | 2101*2888 | 50 | 63,974 | 1,279 | UCF_CC_50 |
由于图像中的人数众多,标注成本太高,通常人群计数的标注采用点标注,即在人头上标注一个点坐标。如下图所示
评测指标
人群计数通常采用MAE和MSE作为评测指标。MAE是预测人数和真实人数的绝对误差,MSE是预测人数和真实人数的均方误差。粗略地说,MAE表示估计的准确性,MSE表示估计的稳健性。
→均方根误差也就是均方误差的平方根,MSE代表实际人数与预测人数之间的误差的平方和开根号
→NAE也就是标准化绝对误差,其中n是样本数量, y i y_i yi是实际值, y h a t i y_{hat_i} yhati是预测值, y m e a n y_{mean} ymean是实际值的均值,NAE衡量预测值与实际值之间的绝对误差占实际值平均值的比例。
→PSNR和SSIM,具体介绍链接:图像质量评价指标之 PSNR 和 SSIM
→Grid Average Mean Absolute Error(网格平均绝对误差,GAMMAE是指将原图像分成多个网格(grid)进行预测,并计算每个网格中实际像素值与预测像素值之间的平均绝对误差(MAE)。然后将这些MAE再次取平均得到整幅图像的GAMMAE值。)
人群计数常用方法
(MCNN-Introduction-part部分)
1. 基于检测的人群计数方法 早期的方法采用一种检测风格的框架,该框架在视频序列的两个连续帧上扫描检测器,基于增强外观和运动特征来估计行人的数量。在基于检测的人群计数方法中,人们通常假设一个人群是由一些给定的检测器可以检测到的个体组成的。这种基于检测的方法的局限性是,在聚集环境或非常密集的人群中,人之间的遮挡会显著影响检测器的性能,从而影响最终的估计精度。
2. 基于视觉特征轨迹聚类 在计算视频中的人群时,人们提出对跟踪的视觉特征的轨迹进行聚类。例如,[24]使用高度并行化的KLT跟踪器和聚类法来估计移动人群的数量。[3]对简单的图像特征进行跟踪,并将其概率性地分组为代表独立运动实体的聚类。然而,这种基于跟踪的方法并不能用于从单个静态图像中估计人群的数量。
3. 基于特征的回归方法 人群计数最广泛使用的方法可以说是基于特征的回归,这种方法的主要步骤是:
1)前景分割;
2)从前景中提取各种特征,如人群掩模的面积
3)利用回归函数估计人群数量。线性或分段线性函数是相对简单的模型,具有良好的性能。其他更先进/有效的方法是岭回归(RR)、高斯过程回归(GPR)和神经网络(NN)
4. 基于CNN的方法来统计不同场景下的人群 Zhang等提出了一种基于CNN的方法来统计不同场景下的人群。他们首先为特定场景预先训练网络。当给定一个新场景的测试图像时,他们根据视图信息和密度图的相似性,选择相似的训练数据对预先训练的网络进行微调。他们的方法在大多数现有数据集上表现良好。但他们的方法需要在训练场景和测试场景上都绘制透视图。不幸的是,在许多人群计数的实际应用中,透视图并不容易获得,这限制了这种方法的适用性。
人群计数方法分类 (常用)
(1) 基于目标检测的方法: 这类方法就是通过对图像上每个行人或这人头进行定位与识别,再根绝结果统计人数。优点在于可以做到准确的行人或者人头位置,但缺点在于对高密度的人群图像来说,其检测效果差;
(2)基于回归的方法:这类方法可以叫做人群数目估计,没有精确定位行人位置,而是对大概的人群数目给出个估计值;优点在于对高密度人群图像来说,其效果是比基于目标检测方法的好,但缺点没有精确的定位。
基于回归的方法分为两类:
1)直接回归:如在深度学习的卷积神经网络中输入人群图像,直接输出一个人群数目估计值;
2)密度图回归:密度图回归的意思是(已知的数据集是这样的,每一张人群图像中的每个人头所在近似中心位置的坐标作为人工标注),根据已知的每个人头位置,再估计该位置所在人头的大小,这样可以得到该人头的覆盖区域,通过一种方法(MCNN中采用几何自适应高斯核),将该区域转化为该区域内可能为人头的概率,该区域概率和为1(或者表示每个像素可能有多少个人),最终我们可以得到一张人群密度图。
(3)基于CNN进行密度图预测
1 )行人检测 : 这种方法比较直接,在人群较稀疏的场景中,通过检测视频中的每一个行人,进而得到人群计数的结果,一般是用基于外观和运动特征的boosting,贝叶斯模型为基础的分割,或集成的自顶向下和自底向上的处理,这种方法在人群拥挤情况下不大奏效,需要运用到基于部件模型(如DPM)的检测器来克服人群拥挤遮挡的问题。
2)视觉特征轨迹聚类:对于视频监控,一般用KLT跟踪器和聚类的方法,通过轨迹聚类得到的数目来估计人数。
3)基于特征的回归: 建立图像特征和图像人数的回归模型, 通过测量图像特征从而估计场景中的人数。由于拥挤情况下采用直接法容易受到遮挡等难点问题的影响,而间接法从人群的整体特征出发,具有大规模人群计数的能力。
4)基于卷积神经网络(CNN)
1、监控视频中人群计数算法
介绍下视觉特征轨迹聚类和基于特征的回归两种方法。
视觉特征轨迹聚类一般是针对视频图像序列,用KLT跟踪器和聚类的方法,通过轨迹聚类得到的数目来估计人数。比如Clustering method for counting passengers getting in a bus with single camera[5]这篇文章是研究公交车车门视频的乘客计数,采用的就是视觉特征轨迹聚类方法。如下图所示为该文章的单目摄像头乘客计数系统流程图。
基于特征的回归一般分为以下3个步骤:
1)前景分割:前景(行人或人群)分割的目的是将人群从图像中分割出来便于后面的特征提取,分割性能的好坏直接关系的最终的计数精度,因此这是限制传统算法性能的一个重要因素。常用的分割算法有:光流法、混合动态纹理、小波分析 、背景差分等。
2)特征提取:从分割得到的前景提取各种不同的底层特征,常用的特征有:人群面积和周长、边缘信息、纹理特征、闵可夫斯基维度等。
3)人数回归:将提取到的特征回归到图像中的人数。常用的回归方法有:线性回归、分段线性回归、脊回归、高斯过程回归等[1]。
可以通过发表于CVPR08的Privacy Preserving Crowd Monitoring: Counting People without People Models or Tracking[2]来了解以下整个算法流程。首先用动态纹理的方法分割出运动的人群,之后做视角归一化,在归一化后的人群块上提取特征,用高斯过程回归将提取的特征回归到图像中人群数量。系统框图如下:
2、单幅图像人群计数算法
对于单幅图像而言没有运动信息,那么人群分割就显得非常困难,因此此类算法一般直接从整张图像或者将图像分块从其子区域提取特征,然后再计算图像中人群数量。图像分块可以理解为是一种离散化透视效果的方法。
3、基于深度学习的人群计数算法
在监控视频的人群计数算法中,前景分割是不可或缺的步骤,然而前景分割本事就是一个比较困难的任务,算法性能很大程度地受其影响。最近深度学习比较热门,在各种传统领域内取得了惊人的进展。卷积神经网络实现了端对端训练,无需进行前景分割以及人工设计和提取特征,经过多层卷积之后得到高层的语义特征。CVPR2015的Cross-scene Crowd Counting via Deep Convolutional Neural Networks[3]提出了一个适用人群计数的深度卷积神经网络模型如下图所示,相比于人工特征对人群有更好的表述能力,交替回归该图像块的人群密度和人群总数来实现人数估计。此外,提出了一种数据驱动的方法从训练数据中选择样本来微调的预训练好的CNN模型,以适应未知的应用场景。
上图中,conv1是32 773filters,conv2是32 7732filters,conv3是64 5532filters。conv1和conv2之后都是一个2*2的最大值pooling。
密度图的生成
学习此链接人群计数之MCNN
论文:《Single-Image Crowd Counting via Multi-Column Convolutional Neural Network》
密度图表示经过两个步骤:人群图像标注表示,人群图像标注转换为人群密度图
**1.人群图像标注表示:**如图1所示19×19大小方格表示人群图像(绿色外层方格表示坐标),该图像包含3个人,以左上角为坐标原点,坐标(3,6), (12,9), (17,15)表示标注的人头中心点位置(在图中表示方格对应坐标的值为1)
2. 人群密度图转换表示(人群图像标注转换为人群密度图)
假设在图像中每个人头大小都是3*3像素(当然这只是示例假设,MCNN中用几何自适应高斯核来估计图像中每个人头的大小并转换为密度图,这是后话了,这里我们想讲述的是什么是密度图,以及转换为密度图的方法之一)
上图就是我们作为卷积神经网络进行人群计数的Ground Truth了,各个人头区域的概率之和为1,得到对完整人群图像的密度图后,对其进行积分(求和)就是人群数目了。(因为对于只是01的标注图太难对其进行学习,且人头不只是一个点,是一个区域)
Matlab fspecial(‘gaussian’,[3,3],0.3)函数所得二维高斯核,其中[3,3]表示参数二维高斯核大小,0.3表示参数二维高斯核标准差sigma
上图是人群图像及其密度图的示例,用热力图来显示人群密度图就是右侧对应的Ground Truth
MCNN中密度图生成
在像素点xi处如果有人头,我们将其表示为函数δ(x−xi),即在x=xi处为1,其他地方全为0的函数。那么,xi表示人头中心坐标位置,用delta函数表示,对于一张有N个人头标注的人群图像来说可以表示为这个函数H(x)
其实得到的就是如图1的人群图像标注表示
为了将它转为一个连续密度函数,使用高斯核Gσ,密度可以描述为
根据图像中每个人的头部大小确定传播参数σ。发现人头大小通常与拥挤场景中两个相邻人的中心之间的距离有关,作为一种折中,对于那些拥挤场景的密度图,通常根据每个人与邻域的平均距离来自适应地确定每个人的传播参数。
对于图像中给定的每个头部xi,我们定义该像素点到它的k个最近邻域的距离为
平均距离则为
求这个k近邻距离的目的是用于表示的估计人头大小,使用高斯核是需要设定高斯核大小的,也表示人头大小(利用beta),利用平均距离乘beta自适应传递参数,用以表示人头区域大小。
透视的存在,越远人头越小,人头之间的距离也越近,对应传播参数σ也越小 ,对应于人头区域
人群分布密集的话求得的d值相对准确,人头大小估计误差小;但如果太多稀疏,其k近邻平均距离太远的话,这样值就会非常大,人头估计误差大,因此将d限制在100像素内。
最终的密度函数为
转化为连续密度函数,其中G所表示的就是高斯核,sigma为高斯核标准差,beta是个设定值,论文里取0.3,d为图像中该人头距离其k邻近人头的欧式距离和的平均。实验验证β = 0.3效果最好,这样生成的密度图在人头小/大的位置高斯核的方差小/大(较集中/分散),能够更好地表征人头大小的特征。
这篇关于人群计数(Crowd Counting)相关内容的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!