文章提出了一种根据单张静态图像精确估算人群密度分布和数量的方法。其主要方法是多列卷积神经网络Multi-column Convolutional Neural Network (MCNN),实现从图片到其密度图像的映射。MCNN允许任意大小的输入图像,并通过使用大小各不相同的卷积核,使每一列CNN适应不同的人头大小,以此来实现对任意视角和任意分辨率图像的精确密度估计。另外,作者还收集并标注了一个包含1198张图像和330000个标注点的数据集供训练和测试。
目前的人群计数算法面临如下问题:
使用卷积神经网络做人群计数主要有两种:
- 输入图片,直接输出估算的人数。
- 输入图片,输出人群密度图像,再将密度图累加得到人数。
本文的方法采用第二种方式,因为密度图像包含信息更多,如人群的空间分布信息等,同时也更适合视角各不相同的任意输入图像。
若有一个人头位于像素xi,用狄拉克函数表示,则标记有N个人头的整张图像可表示为:
通过高斯核函数将其转换成连续的密度函数:
此方法假设xi是图像平面的独立样本,但实际由于视角的不同,xi可能代表了场景中完全不同的大小范围。
若假设在每个人头点周围人群是均匀分布的,则该人头点与他的k个近邻的平均距离可以合理的估算由于视角引起的几何偏差。因此需引入基于人头大小的分布参数σ。作者发现在密集人群中人头大小通常和最近两个人间的距离有关,因此提出基于与邻居的平均距离决定高斯分布的参数,即几何适应的核。
由此密度函数可表示为:
其中β为常数,作者实验发现,β等于0.3时结果最佳。
由于视角的差异,图像中的人头大小各不相同,因此固定大小的卷积核并不适用。作者受多列深度神经网络MDNN的启发提出了多列卷积神经网络MCNN,用不同大小的卷积核来对应不同大小的人头。
网络包含三列卷积神经网络,其卷积核大小和数量各不相同,但网络结构基本一致。池化层为2x2的最大池化,激活函数为ReLU。另外为减少计算量,大卷积核对应的列对应的卷积核数量较少。最后各列输出的结果合并到一起,并使用1x1的卷积核转换成最终的密度图像。
损失函数使用了生成的密度图和真实密度图之间的欧氏距离:
实现的注意点:
对人群计数问题的评估标准为绝对平均误差和平方平均误差:
对于ShanghaiTech数据集,作者先进行了数据增强,对每一张训练图片取了9张图像,大小均为原图的1/4,用于训练。其中人数较多的Part A使用了几何适应的核来生成密度图,而人群较稀疏的Part B则使用固定的高斯核。训练时首先预训练每一列,再对整个网络进行训练。
每一列单独训练的效果以及整个网路直接训练和进行预训练后的效果对比如下:
最终在ShanghaiTech数据集下的结果以及与之前方法的比较如下:
另外在UCF_CC_50数据集、UCSD数据集和WorldExpo’10数据集下的结果分别为:
为测试模型的泛化能力,作者尝试将在ShanghaiTech Part A数据集训练的模型迁移到UCF_CC_50数据集上,分别做了4种测试:直接在UCF_CC_50上训练、直接使用Part A训练的模型、对Part A训练模型整体调整训练以及只对最后两层进行调整训练。其结果如下:
实验结果表明只对最后两层做调整训练效果最好,作者认为其原因是UCF_CC_50数据集训练样本过少,只训练最后几层可以使模型再保留原有特征提取能力的同时适应新的数据集,而将整个网络一起调整则会导致网络整体偏向新数据集,由于其训练样本不足而导致精度不高。