CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes
CVPR 2018论文原文:https://arxiv.org/abs/1802.10062
CSRNet 网络可以理解高度拥挤的场景并执行准确的计数估计以及呈现高质量密度图。
该网络主要包括两个部分,前使用一个卷积网络用于 2D 特征提取,后用一个空洞卷积网络代替池化操作。
对label文件进行高斯滤波处理,作为模型预测的GroundTruth。
CSRNet通过网络将输入图像映射到其各自的密度图。
该模型不使用任何全连接层,因此输入图像的大小是可变的。
模型从大量不同的数据中学习,并且考虑到图像分辨率,没有信息丢失。
在预测时不需要重新、调整图像大小。
模型体系结构使得输入图像为(x,y,3),输出是尺寸(x / 8,y / 8,1)的desnity图。
在四个数据集(ShanghaiTech数据集,UCF_CC_50数据集,WorldEXPO_10数据集和UCSD数据集)上应用CSRNet,展现了最先进的性能。
作者代码:https://github.com/leeyeehoo/CSRNet-pytorch (Pytorch版本)
本文讲解代码:https://github.com/luckyluckydadada/CSRnet (keras版本 配套本博客文章讲解 注释完整)
人群场景分析的潜在解决方案可以分为三类:基于检测的方法,基于回归的方法和基于密度估计的方法。
目前基于密度图估计多数采用了 multi-column (MCNN) 的架构和密度级别分类器,在这些方法中观察到四个缺点:
(1)很难训练multi-column CNN。
这种膨胀的网络结构需要更长时间训练。
(2)multi-column CNN引入冗余结构。
不同的列似乎表现相似而没有明显的差异。
作者实验验证了采用 multi-column 表现的效果没比没采用 multi-column 的要好,该实验设计了一个具有相似数量参数的更深入,更规则的网络(表中A deeper CNN)。
设计 multi-column CNN (MCNN) 的本意是希望可以学习不同尺寸感受野的特征,
但是下图显示三个column 学习到的特征相似,没有达到设计之初的目的。
(3)在MCNN中发送图像之前,需要密度级别分类器。
然而,由于对象的数量在大范围内变化,因此在实时拥塞的场景分析中难以定义密度水平的粒度。
此外,使用细粒度分类器意味着需要实现更多列,这使得设计更复杂并且导致更多冗余而且计算量比较大 。
(4)这些工作花费大部分参数进行密度等级分类,以标记输入区域,而不是将参数分配给最终密度图生成。
由于MCNN中的分支结构效率不高,因此缺少用于生成密度图的参数会降低最终精度。
考虑到上述所有缺点,我们提出了一种新的方法,专注于编码拥挤场景中的更深层特征并生成高质量密度图。
拥挤场景解析的发展从简单的人群数值估计到人群密度图估计,生成准确的人群分布图挑战性比较大。
其中一个主要的困难就是离散化的问题,人在图像中不是只占用一个像素,密度图需要保持局部邻域的连续性。
其他的困难包括场景的多样性,相机角度的多样性。
在数据预处理中,主要目标是将数据集提供的图像转换为密度图。
对于给定图像,数据集提供了由该图像中的头部标注组成的稀疏矩阵。
通过高斯滤波器将该稀疏矩阵转换为2D密度图。
密度图中所有单元格的总和为图像中的实际人数。
具体请参阅Preprocess.ipynb注释
过程:
通俗解释,假如这张图只有1个人头点,那么通过高斯滤波这个凸点就会压在这张图上,以高斯分布的方式压入这张图,图上的所有点都被填充了值,图像上点的值形成空间上的高斯分布,这些值的总和为1。同理,有两个人头时,就通过第二次高斯分布转换,叠加在前一个高斯分布上,这样所有的像素点的求和为2。有几个人,像素点的值求和就是几。
我们不采用多分支网络结构。具体网络架构如图:
作者实验发现B方案最好,也就是Dilation rate(膨胀率) =2。
具体请参阅Model.ipynb
我们先将密度图宽高转为原来1/8,这样网络输出的结果(pred)的shape 就和密度图(truth)的shape一样了,都为(x/8,y/8,1)。
所以我们采用欧式距离作为我们的损失函数。就是pred的各点和truth各点的均方差。
具体请参阅Model.ipynb注释
在keras中,难以训练输入图像的大小可变的模型,Keras不允许在同一批次中训练可变大小的输入。
解决此问题的一种方法是组合具有相同图像尺寸的所有图像并将它们作为批次进行训练。
另一种方法是独立地训练每个图像并在所有图像上运行循环(随机梯度下降,batch_size=1),这种方法在内存使用和计算时间方面效率不高。
因此,最好的一种方法是在keras中构建了自定义数据生成器,以有效地训练可变大小的图像,使用数据生成器,可以实现高效的内存使用,并且培训时间大幅缩短。
论文还指定了图像裁剪作为数据增强的一部分,但是,Pytorch的版本实现不会在训练时使用图像裁剪。
因此,我们提供了一个函数preprocess_input(),可以在image_generator()中使用它来添加裁剪功能。
具体请参阅Model.ipynb注释
将原图输入模型,得到单通道图(x/8,y/8,1),也就是预测的密度图,对密度图上所有值求和,即为预测人数,密度图上值大的表示该区域人流密集。
ShanghaiTech人群计数数据包含1198个带注释的图像,总数为330,165人。
该数据集由两部分组成,A部分包含482张图像,这些图像具有从互联网上随机下载的高度拥挤的场景,而B部分包含716张图像,这些图像具有从上海街道拍摄的相对稀疏的人群场景。
结果如图,很好就对了。
其他数据集不多解释了,直接上图,表现依然很好。
在本文中,提出了一种名为CSRNet的新型架构,用于人群计数和高质量密度图生成,并采用易于训练的端到端方法。
我们使用扩张卷积层来聚集拥挤场景中的多尺度上下文信息,通过利用扩张的卷积层,CSR-Net可以在不损失分辨率的情况下扩展感受野。
我们在四个人群计数数据集中演示了我们的模型,发现均具有最好性能的。
我们还将模型扩展到车辆计数任务,也达到了最佳精度。可以作为其他的拥挤场景计数。