zoukankan      html  css  js  c++  java
  • 人群计数:Single-Image Crowd Counting via Multi-Column Convolutional Neural Network

    人群计数:Single-Image Crowd Counting via Multi-Column Convolutional Neural Network(CVPR2016)

    本博文主要是CVPR2016的《Single-Image Crowd Counting via Multi-Column Convolutional Neural Network》这篇文章的阅读笔记,以及对人群计数领域做一个简要介绍。最后补充介绍一篇18年的针对算法落地的人群计数方案《A Deeply-Recursive Convolutional Network For Crowd Counting》

    Abstract

    这篇论文开发了一种可以从一个单幅的图像中准确地估计任意人群密度和任意角度的人群数目。文章提出了一种简单有效的的多列卷积神经网络结构(MCNN)将图像映射到其人群密度图上。该方法允许输入任意尺寸或分辨率的图像,每列CNN学习得到的特征可以自适应由于透视或图像分辨率引起的人/头大小的变化,并能在不需要输入图的透视先验情况下通过几何自适应的核来精确计算人群密度图。作者提到他们训练得到的MCNN模型要优于现有的其他方法。

    Introduction

    公共场合中通过摄像机实现人数计数具有重要的研究价值。比如: 候车大厅中人群计数的结果,可优化公共交通的调度; 某区域中人数的急剧变化既可能会导致意外事件的发生, 又可能是意外事件发生的结果。公共场合中采用摄像机实现人群计数在智能安防领域具有重要价值。因此, 人群计数(Crowd Counting)或者人群密度估计(Crowd Density Estimation)是计算机视觉和智能视频监控领域的重要研究内容。

    人群计数的通常的方法大致可以分为三种:
    1 )行人检测 : 这种方法比较直接,在人群较稀疏的场景中,通过检测视频中的每一个行人,进而得到人群计数的结果,一般是用基于外观和运动特征的boosting,贝叶斯模型为基础的分割,或集成的自顶向下和自底向上的处理,这种方法在人群拥挤情况下不大奏效,需要运用到基于部件模型(如DPM)的检测器来克服人群拥挤遮挡的问题。
    2)视觉特征轨迹聚类:对于视频监控,一般用KLT跟踪器和聚类的方法,通过轨迹聚类得到的数目来估计人数。
    3)基于特征的回归: 建立图像特征和图像人数的回归模型, 通过测量图像特征从而估计场景中的人数。由于拥挤情况下采用直接法容易受到遮挡等难点问题的影响,而间接法从人群的整体特征出发,具有大规模人群计数的能力。

    Related work

    1、监控视频中人群计数算法
    这边就介绍下视觉特征轨迹聚类和基于特征的回归两种方法。
    视觉特征轨迹聚类一般是针对视频图像序列,用KLT跟踪器和聚类的方法,通过轨迹聚类得到的数目来估计人数。比如Clustering method for counting passengers getting in a bus with single camera[5]这篇文章是研究公交车车门视频的乘客计数,采用的就是视觉特征轨迹聚类方法。如下图所示为该文章的单目摄像头乘客计数系统流程图。

    1
    1.图1.单目摄像头乘客计数系统流程图1.

    基于特征的回归一般分为以下3个步骤:
    1)前景分割:前景(行人或人群)分割的目的是将人群从图像中分割出来便于后面的特征提取,分割性能的好坏直接关系的最终的计数精度,因此这是限制传统算法性能的一个重要因素。常用的分割算法有:光流法、混合动态纹理、小波分析 、背景差分等。
    2)特征提取:从分割得到的前景提取各种不同的底层特征,常用的特征有:人群面积和周长、边缘信息、纹理特征、闵可夫斯基维度等。
    3)人数回归:将提取到的特征回归到图像中的人数。常用的回归方法有:线性回归、分段线性回归、脊回归、高斯过程回归等[1]。
    可以通过发表于CVPR08的Privacy Preserving Crowd Monitoring: Counting People without People Models or Tracking[2]来了解以下整个算法流程。首先用动态纹理的方法分割出运动的人群,之后做视角归一化,在归一化后的人群块上提取特征,用高斯过程回归将提取的特征回归到图像中人群数量。系统框图如下:

    2
    2.图2.人群计数系统流程图2.

    2、单幅图像人群计数算法
    对于单幅图像而言没有运动信息,那么人群分割就显得非常困难,因此此类算法一般直接从整张图像或者将图像分块从其子区域提取特征,然后再计算图像中人群数量。图像分块可以理解为是一种离散化透视效果的方法。

    3
    3.图3.图像分块3.

    3、基于深度学习的人群计数算法
    在监控视频的人群计数算法中,前景分割是不可或缺的步骤,然而前景分割本事就是一个比较困难的任务,算法性能很大程度地受其影响。最近深度学习比较热门,在各种传统领域内取得了惊人的进展。卷积神经网络实现了端对端训练,无需进行前景分割以及人工设计和提取特征,经过多层卷积之后得到高层的语义特征。CVPR2015的Cross-scene Crowd Counting via Deep Convolutional Neural Networks[3]提出了一个适用人群计数的深度卷积神经网络模型如下图所示,相比于人工特征对人群有更好的表述能力,交替回归该图像块的人群密度和人群总数来实现人数估计。此外,提出了一种数据驱动的方法从训练数据中选择样本来微调的预训练好的CNN模型,以适应未知的应用场景。

    4
    4.图4.人群计数网络结构4.

    上图中,conv1是32 7*7*3filters,conv2是32 7*7*32filters,conv3是64 5*5*32filters。conv1和conv2之后都是一个2*2的最大值pooling。
    想了解更多人群计数的发展状况请具体参考[1]以及阅读相关代表性论文。下面的内容主要是CVPR2016的这篇人群计数论文的阅读笔记。

    Multi-column CNN

    1、Contributions of this paper

    当前阶段人群计数的主要问题有以下几点:
    在大多数现有的工作中,前景分割是必不可少的,但前景分割是项艰巨任务;人群的密度和分布会有显著变化,因此传统的基于目标检测的模型很难work well;需要一种有效的特征来针对图像中人群规模可能有显著变化的情况。
    基于以上问题,作者提出了一个基于CNN的新框架用于任意单幅图像上的人群计数。MCNN包含了三列具有不同滤波器大小的卷积神经网络。所做贡献如下:
    1)多列架构的原因是:三列对应于不同大小的感受野(大,中,小),使每个列卷积神经网络的功能对由于透视或不同的图像分辨率造成的人/头大小变化是自适应的(因此,整体网络是强大的)。
    2)用一个1*1滤波器的卷积层代替了完全连接的层,因此模型的输入图像可以是任意大小的,避免了失真。网络的直接输出是一个人群密度估计图,从中可以得到的整体计数。
    3)收集了一个新的数据集用于人群计数方法的评价。比现有的数据集包含更复杂的情况,能更好地测试方法性能,1198张图,330,165精确标定的人头。数据集分A和B两个部分,A是从互联网上随机找的图,B是上海的闹市截取图,如图5所示为A、B部分图。

    5
    5.Shanghaitech图5. Shanghaitech数据集5.Shanghaitech

    2、Density map based crowd counting

    给定一张图像,用CNNs来估计人数,一般有两种方案:一是输入图像,输出估计的人头数目;二是输出的时人群密度图(每平方米多少人),然后再通过积分求总人数。作者支持第二种,有以下两点原因:
    1)密度图保留更多的信息。与人群的总数相比,密度图给出了在给定图像中人群的空间分布,这样的分布信息在许多应用中是有用的。例如,如果一个小区域的密度比其他区域的密度高得多,它可能表明一些异常发生在那里。
    2)在通过一个CNN模型学习密度图时,学习到的滤波器更适应于不同大小的头,因此更适合于有透视效果显着变化的任意输入。所以这些滤波器具有更多的语义,提高了人群计数的准确性。

    3、Density map via geometry-adaptive kernels

    训练数据中的人群密度的标定质量决定了CNN模型的性能。这里介绍下如何将带有标签的人头图像转换为人群密度图。
    一幅有NNN个头的图像label表示为:
    H(x)=Ni=1δ(xxi)H(x)=sum_{i=1}^Ndelta(x-x_i)H(x)=i=1Nδ(xxi)
    为了使得密度图能够更好地与不同视角(不同人头大小)且人群很密的图像对应起来,作者对传统的基于高斯核的密度图做了改进,提出了基于几何适应高斯核的密度图,由下式表示:
    F(x)=Ni=1δ(xxi)Gσi(x), with σi=βdi¯¯¯F(x)=sum_{i=1}^Ndelta(x-x_i)*G_{sigma_i}(x),space withspacesigma_i=eta ar{d^i}F(x)=i=1Nδ(xxi)Gσi(x), with σi=βdiˉ
    xix_ixi表示人头在图像中的像素位置,δ(xxi)delta(x-x_i)δ(xxi)表示图像中人头位置的冲击函数,NNN为图像中的人头总数,di¯¯¯=1mmj=1dijar{d^i}=frac{1}{m}sum_{j=1}^md_j^idiˉ=m1j=1mdji为距离xix_ixi人头最近mmm个人头与该人头的平均距离(通常情况头部的大小与两个相邻的人在拥挤的场景中的中心之间的距离有关,di¯¯¯ar{d^i}diˉ在人群较密的情况下近似等于人头大小),实验验证β=0.3eta=0.3β=0.3效果最好。这样生成的密度图在人头小/大的位置高斯核的方差小/大(较集中/分散),能够更好地表征人头大小的特征,转化结果如下图。

    6
    6.图6.通过基于几何适应高斯核转换得到的密度图6.

    4、Multi-column CNN for density map estimation

    MCNN主要是受到MDNNs[6] 在图像分类上取得成功的启发而提出来的。MCNN网络的每一列并行的子网络深度相同,但是滤波器的大小不同(大,中,小),因此每一列子网络的感受野不同,能够抓住不同大小人头的特征,最后将三列子网络的特征图做线性加权(由1x1的卷积完成)得到该图像的人群密度图,类似模型融合的思想。采用了2*2的max-pooling和ReLU激活函数。(注意,因为这里用到了两次max-pooling,所以需要先对训练样本也缩小到1/4,再生成对应的密度图ground truth)

    7
    7.MCNN图7.MCNN结构图7.MCNN

    作者采用优化欧式损失的方式让网络输出的密度图回归到标准的密度图,损失函数如下式:
    L(θ)=12NNi=1F(Xi;θ)Fi22L( heta)=frac{1}{2N}sum_{i=1}^N||F(X_i; heta)-F_i||_2^2L(θ)=2N1i=1NF(Xi;θ)Fi22
    这里的θ hetaθ是待优化的网络参数,NNN是训练图片的数目,XiX_iXi表示输入图像,FiF_iFi表示XiX_iXi对应密度图的ground truth,F(Xi;θ)F(X_i; heta)F(Xi;θ)表示由MCNN生成的密度图。

    5、Optimization of MCNN

    由于训练样本有限以及深度神经网路存在梯度弥散问题,会对参数学习造成困扰。作者借鉴RBM预训练的思想,通过直接将第四层卷积层的输出映射成密度图,分别对每一列CNN进行预训练。然后使用这些预训练的参数对MCNN的网络参数进行初始化,同时对所有参数进行微调。

    6、Transfer learning setting
    MCNN的一个优势在于能学习到不同大小人头对应的密度图。因此,如果该模型用一个包含各种大小人头的大数据集来训练,则该模型可以很容易地适应(或迁移)到另一个人头大小是一些特定的尺寸的数据集。如果目标域只包含少量的训练样本,可以简单地将MCNN的每一列前几层固定,只有微调最后的少量卷积层。这样固定前几层使在源域中学习的知识可以被保留,微调后几层很大程度上降低了模型适应目标域的计算复杂度。

    Experiments

    1、Evaluation metric

    平均绝对误差(MAE)和均方误差(MSE)是常用的衡量算法性能的标准,前者表征算法估计的准确性,后者表征算法估计的稳定性,二者的定义如下式:
    MAE=1NN1ziziˆ, MSE=1NN1(ziziˆ)2−−−−−−−−−−−−−√MAE=frac{1}{N}sum_1^N|z_i-hat{z_i}|,space MSE=sqrt{frac{1}{N}sum_1^N(z_i-hat{z_i})^2}MAE=N11Nzizi^, MSE=N11N(zizi^)2
    这里的NNN表示测试图像数目,ziz_izi是第张图片实际人数,ziˆhat{z_i}zi^是算法估计的人数。

    2、Shanghaitech dataset

    8
    1Shanghaitech表1:Shanghaitech 与其他三个现有数据集的比较1Shanghaitech
    3、Single column CNNs vs MCNN
    从下图可以看出,MCNN比Single column CNNs的MAE和MSE都要低,MCNN比没有预训练的MCNN性能有所提高。
    9
    8.SinglecolumnCNNsvsMCNN图8. Single column CNNs vs MCNN8.SinglecolumnCNNsvsMCNN

    4、Comparing performances

    10
    2Shanghaitech表2:Shanghaitech 数据集的比较结果2Shanghaitech

    11
    3UCF_CC_50表3:UCF\_CC\_50数据集的比较结果3UCF_CC_50

    12
    4UCSD表4:UCSD数据集的比较结果4UCSD

    13
    5WorldExpo10表5:WorldExpo’10数据集的比较结果5WorldExpo10

    MCNN方法在除了UCF_CC_50(训练图片数量太少,难以满足深度学习的需求)以外的常用人群计数数据集上均取得最好的性能。

    5、Evaluation on transfer learning

    14
    6表6:迁移学习结果6

    Conclusion

    这篇论文提出了的MCNN模型,能对任意视角的单张图像进行人数估计,并在常用人群计数数据集上均取得最好的性能。同时该模型可以较为容易迁移到针对另一人群目标域进行应用。

    实验仿真

    我支取了MCNN模型中的1个column的CNN结构去回归密度图(生成密度图的code见评论区10楼的链接)。
    在mall_dataset上,取前1200帧作为训练样本,后800帧作为测试样本,得到了初步的结果。
    单张图片测试结果如下(依次为原图像,ground truth, estimated density map):
    原图
    gt
    result

    之后参考MCNN这篇论文,自己搭好网络,三列CNN的结构图如下。
    MCNN
    test demo
    caffe模型的测试代码下载:https://download.csdn.net/download/u011285477/11040999

    因为我在调参的技巧上没啥经验,效果并不是很出众。部分结果如下图所示:
    1
    2
    3
    1
    2
    3
    实际应用

    ADEEPLY-RECURSIVE CONVOLUTIONAL NETWORK FOR CROWD COUNTING 论文简介
    人群计数要实现落地的话,必须要考虑计算资源受限的问题,当前很多模型的参数量过多需要占用较多存储空间,计算量过大计算耗时严重,考虑到实际应用过程中,比如嵌入式应用等,2018年这篇论[10]提出的基于递归结构的残差网络模型,较好地处理了模型性能和参数之间的权衡问题。网络结构如下图所示,残差连接可以减少深度网络的梯度弥散,这样便通过加深网络提高性能,而在高层语义特征层上采用参数复用的方式,可以避免因网络加深带来的参数量增大,同时参数复用使提取的高层语义特征更加稳定。从Table 1中可以看出随着网络卷积层数目从14到26加深,MAE和MSE在逐步下降,DR-ResNet跟ResNet-26一样的深度,但模型参数量仅为ResNet-26的一半,DR-ResNet在人数规模较大的Part_A上MAE略低于ResNet-26,但MSE却更好,表明该网络结构改善了模型的泛化能力。
    网络结构
    递归结构有效
    对比
    从上表Table 2可以看出,DR-ResNet的参数量很小,参数量不到CP-CNN的千分之一,但在数据集上的评测指标却排在第一、二位。在Part_A、Part_B上的密度估计例子如下图所示,人群密度估计的空间分布较为准确、计数准确率高(1159/1303 = 88.9%,293/301 = 97.3%):
    误差小
    论文中还提供了一个如下图所示的实际应用场景数据集(从早到晚时间段跨度大、室外光照阴影变化、局部区域人群拥挤遮挡):https://github.com/XMU-smartdsp/Beijing-BRT-dataset
    Part_A和Part_B的DR-ResNet模型: https://github.com/linzhirui1992/Crowd-Counting
    结果可视化

    博客链接:http://blog.csdn.net/u011285477/article/details/51954989

    参考资料:
    [1]人群计数研究进展:
    http://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650325105&idx=1&sn=939f46fd57a80f86b9eb050dd2cf1652&scene=23&srcid=0719aUJR2CUdt7cmOII0KKol#rd
    [2]Chan A B, Liang Z S J, Vasconcelos N. Privacy preserving crowd monitoring: Counting people without people models or tracking[C]//Computer Vision and Pattern Recognition, 2008. CVPR 2008. IEEE Conference on. IEEE, 2008: 1-7.引用次数:340
    [3]Zhang C, Li H, Wang X, et al. Cross-scene crowd counting via deep convolutional neural networks[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 833-841.引用次数:26
    [4]Zhang Y, Zhou D, Chen S, et al. Single-Image Crowd Counting via Multi-Column Convolutional Neural Network[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 589-597.
    [5]Yang T, Zhang Y, Shao D, et al. Clustering method for counting passengers getting in a bus with single camera[J]. Optical Engineering, 2010, 49(3): 037203-037203-10.引用次数:14
    [6]Ciregan D, Meier U, Schmidhuber J. Multi-column deep neural networks for image classification[C]//Computer Vision and Pattern Recognition (CVPR), 2012 IEEE Conference on. IEEE, 2012: 3642-3649.引用次数:783
    [7]ShanghaiTech数据集百度云下载链接:https://pan.baidu.com/s/1nuAYslz
    [8]Mall dataset: http://personal.ie.cuhk.edu.hk/~ccloy/downloads_mall_dataset.html
    [9]非官方重现MCNN的代码:https://github.com/svishwa/crowdcount-mcnn/blob/master/data_preparation/get_density_map_gaussian.m
    [10]Ding X, Lin Z, He F, et al. A Deeply-Recursive Convolutional Network For Crowd Counting[C]//2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2018: 1942-1946. https://arxiv.org/pdf/1805.05633.pdf
    [11]【资源】人群计数最全资源(含代码、工具、数据集、论文、leaderboard)
    http://bbs.cvmart.net/articles/323/arXiv.org
    https://github.com/gjy3035/Awesome-Crowd-Counting

  • 相关阅读:
    LAMP的搭建
    Apache安装之后,在浏览器输入ip无法访问
    DNS无法区域传送(axfr,ixfr)
    you do not permission to access / no this server
    http虚拟主机的简单配置训练
    搭建一个简单的dns缓存服务器
    Django——User-Profile
    Django——信号
    Django——中间件
    Django——日志
  • 原文地址:https://www.cnblogs.com/yumoye/p/11006275.html
Copyright © 2011-2022 走看看