作者论文:CrowdNet: A Deep Convolutional Network for Dense Crowd Counting
链接:论文原文
一,论文的思路
作者通过整合深层和浅层的全卷机网络生成的特征图,从而生成密度图。这种整合方式可以有效捕获高层的语义信息(脸、身体检测)和低层的特征。另外由于大部分数据集的样本非常少,作者采用了多尺度数据增强。作者主要在UCF CC 50
数据集上验证了CrowdNet算法。
二,网络结构
2.1,深层网络
深层网络结构用来捕获高级的语义信息,网络结构类似于VGG-16。由于人群密度估计需要预测图片中每个像素点的值所以不同于分类网络结构,需要进行改进。为了获取像素级的预测,则需要去除VGG中的全连接层,因此网络就变成了全卷机网络结构模型。
网络的具体改进如下:
VGG中有5个最大池化层,每个最大池化层的步长为2,所以图片的下采样率是32。为了不让输出图片的分辨率过小,作者把第三层的池化层步长设置为1,同时去除第5层池化层(这样做的原因我个人认为是因为,作者使用的数据集中人头数很大,人头离相机较远,尺寸很小所以不宜设置过大的下采样率,否者失真比较严重)。通过这样的操作对VGG网络进行改进后,其下采样率变为了8,即输出特征图变为输入特征图的八分之一。由于对第四层最大池化层进行了改进,导致后面的感受野存在误匹配问题。作者采用了空洞卷积来扩大感受野来解决感受野误匹配的问题。所以很重要的一点是,作者把第四层最大池化层后面卷积改为空洞卷积,使其感受野翻倍。这样可以使网络操作任意原始训练的感受野。
2.2,浅层网
浅层网络用来识别离相机比较远的的人头。由于人头检测不需要要高层的语义信息,所以只设计了三个卷积层,每层24个5*5大小的卷积核。浅层网络主要用检测小的人头。
2.3,深层网路和浅层网络的联合
最后把深层网络和浅层网络的输出进行级联操作,因为深层和浅层网络的下采样率都是八分之一。进行通道级联后利用1*1的卷积进行处理。然后把输出图利用双线性差值上采样到原始输入尺寸图大小来获取最终的人群密度图预测。通过对预测密度图求和(积分)可以获取图片中总的人数。网络通过L2损失进行反向传播。
2.4 Ground Truth
头部标注的准确位置常常是模糊的,而且不同的标注者(前额、脸部中心等)的标注位置也不同,这使得CNN的训练非常困难。
作者利用归一化的高斯核简单模糊每个头部注释从而产生ground truth。这种模糊可以使密度图的和等于人群中的总人数。以这种方式准备ground truth可以使CNN更容易地学习ground truth,因为CNN不再需要正确地获得head注释的准确点。它还提供了关于哪些区域对统计有贡献以及贡献多少的信息。这有助于训练CNN正确预测人群密度和人群计数。
2.5 数据增强
作者主要采用了两类数据增强,第一类数据增强用于处于人群图像的尺度变化性,第二类数据增强用于CNN的性能,主要是改善CNN在容易出错的地区的性能,例如:,高度密集的人群区域。
为了使CNN对尺度变化更加鲁棒,作者从每个训练图像的多尺度金字塔表示中裁剪小块。考虑了原图的0.5~1.2倍的图像,步长为0.1的尺度。可以见下图。
作者从这个金字塔状的表示中裁剪出225×225块重叠50%的区域。同时作者发现,CNNs对出现高密度人群的区域。为了克服这个问题,通过更频繁地采样高密度的patch来增加训练数据。
三,实验
作者在UCF_CC_50数据集上进行了实验,该数据集中图像只包含50张图片,并且每张图片的分辨率不同。图片中最大的人头数是4543,最少的人头数是94,平均人头数是1279.5,总人头数为63974。作者通过5折交叉验证评估算法的性能,每折包含10张图,选4折作为训练样本。在这40张图片中采样255*255的patches(和数据增强的方法描述一样)。
和其他算法的MAE指标对比
另外作者对比了只利用浅层网络和只使用深层网络和同时使用深层和浅层网络的实验结果
作者还对比了使用数据增强和不使用数据增强的实验结果