新版本请访问简书链接:https://www.jianshu.com/p/a1006c4b6fdc
人群计数: 目的在于统计场景中的人群数目。人群计数在视频监控、交通监测、公共安全、城市规划以及建设智能商超等方面有着广泛应用,如监控某个人群易聚集区域的人群数目,防止由于人群密度过大,导致人群失控发生踩踏等事件。
Multi-column Convolutional Neural Network:本文章是使用深度学习中的卷积神经网络实现人群计数。上海科技大学Yingying Zhang等人将多列卷积神经网络应用于单张图像人群计数问题上(Single-Image Crowd Counting via Multi-Column Convolutional Neural Network)。
论文与代码:
http://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Zhang_Single-Image_Crowd_Counting_CVPR_2016_paper.pdf
https://github.com/svishwa/crowdcount-mcnn 。
(由于笔者接触这个人群计数任务时的第一篇论文就是MCNN的,因此在这里选择这篇文章来讲述。而关于这个任务,在此之前也有不少论文,在此之后也是刷得很厉害,有很多更好的模型)
笔者复现的MCNN(Tensorflow版本):
到下列链接:https://www.jianshu.com/p/a1006c4b6fdc
一、人群计数方法分类
(1) 基于目标检测的方法: 这类方法就是通过对图像上每个行人或这人头进行定位与识别,再根绝结果统计人数。优点在于可以做到准确的行人或者人头位置,但缺点在于对高密度的人群图像来说,其检测效果差;
(2)基于回归的方法:这类方法可以叫做人群数目估计,没有精确定位行人位置,而是对大概的人群数目给出个估计值;优点在于对高密度人群图像来说,其效果是比基于目标检测方法的好,但缺点没有精确的定位。
基于回归的方法又分为两种:
1)直接回归:如在深度学习的卷积神经网络中输入人群图像,直接输出一个人群数目估计值;
2)密度图回归:密度图回归的意思是(已知的数据集是这样的,每一张人群图像中的每个人头所在近似中心位置的坐标作为人工标注),根据已知的每个人头位置,再估计该位置所在人头的大小,这样可以得到该人头的覆盖区域,通过一种方法(MCNN中采用几何自适应高斯核),将该区域转化为该区域内可能为人头的概率,该区域概率和为1(或者表示每个像素可能有多少个人)。最终我们可以得到一张人群密度图。
二、密度图如何表示
密度图表示经过两个步骤:人群图像标注表示,人群图像标注转换为人群密度图(这里的描述语言是自己编的,为了更易于理解)
1. 人群图像标注表示: 如图1所示19*19大小方格表示人群图像(绿色外层方格表示坐标),该图像包含3个人,以左上角为坐标原点,坐标(3,6), (12,9), (17,15)表示标注的人头中心点位置(在图中表示方格对应坐标的值为1)
图1 人群图像标注表示
2. 人群密度图转换表示(人群图像标注转换为人群密度图)
假设在图像中每个人头大小都是3*3像素(当然这只是示例假设,MCNN中用几何自适应高斯核来估计图像中每个人头的大小并转换为密度图,这是后话了,这里我们想讲述的是什么是密度图,以及转换为密度图的方法之一)
图2 人群密度图表示
图2就是我们作为卷积神经网络进行人群计数的Ground Truth了,各个人头区域的概率之和为1,得到对完整人群图像的密度图后,对其进行积分(求和)就是人群数目了。
图3 二维高斯核
图3 Matlab fspecial('gaussian',[3,3],0.3)函数所得二维高斯核,其中[3,3]表示参数二维高斯核大小,0.3表示参数二维高斯核标准差sigma
图4 人群密度图示例
图4是人群图像及其密度图的示例,用热力图来显示人群密度图就是右侧对应的Ground Truth
三、MCNN
这里我们先来描述MCNN具体的标签密度图生成方法,再来描述MCNN的网络结构和损失函数、训练方式、评价指标。
1. 标签密度图生成方法
步骤a. xi表示人头中心坐标位置,用delta函数表示,对于一张有N个人头标注的人群图像来说可以表示为这个函数H(x):
其实得到的就是如图1的人群图像标注表示
步骤b. 转化为连续密度函数,其中G所表示的就是高斯核,sigma为高斯核标准差,beta是个设定值,论文里取0.3,d为图像中该人头距离其k邻近人头的欧式距离和的平均。
求这个k近邻距离的目的是用于表示的估计人头大小(在图2人群密度图表示的时候,使用高斯核是需要设定高斯核大小的,也表示人头大小)。
人群分布密集的话求得的d值相对准确,人头大小估计误差小;但如果太多稀疏,其k近邻平均距离太远的话,这样值就会非常大,人头估计误差大,因此将d限制在100像素内。
2. MCNN网络结构
网络结构如下图5所示,使用的是全卷积的网络。
MCNN的多列主要体使用了三列卷积神经网络,表示为L列(使用大尺度卷积核: 9*9, 7*7, 7*7,7*7), M(使用中等尺度卷积核: 7*7, 5*5, 5*5, 5*5), S列(使用小尺度卷积核: 5*5, 3*3, 3*3, 3*3)),其目的在于使用多种尺度的卷积核来适应不同尺度的人头大小。最后将L,M,S三列卷积神经网络进行合并,得到网络生成的密度图。
同时MCNN也是比较轻量级的,网络参数少。
从图中可观察到,MCNN实际的下采样系数为4,因此网络输出的密度图也是原图宽高的1/4,在制作其作为训练数据的标签密度图时,除了要制作为原图1/4的密度图外,几何自适应高斯核相关的的限制,也要相应为1/4,将限制在100/4=25个像素之内
图5 MCNN网络结构
3. 损失函数
MCNN采用的如下公式的损失函数,L2范数的平方:
4. 训练方式
在训练方式主要想提的是:
1)MCNN需要先对三个单列神经网络进行预训练,再合并训练才能达到更好的效果其数据处理的方式;
2)MCNN对原始数据集的每张训练集图像随机裁剪9次,得到9张图像子块,每个图像子块为原图的1/4。
(这样的图像子块训练有其优点a. 图像尺寸变小,加快网络训练速度; b. 通过局部图像块的训练完成对完整图像的训练,同样能达到很好的效果)
5. 评价指标
MCNN所采用的评价指标如下,平均绝对误差MAE与均方误差MSE:
关于用于实验的数据集、及实验结果这里暂时不提及。