GA、CNN在人流密度中检测的运用
一、高斯密度图构建
1、数学模型的构建
在真实图片中,每个人头是具有一定大小的,对应图片中的一小片区域,而在标注文件中我们将一个像素点的值置为1来表示这个人头,这显然是十分不合理的。所以我们使用高斯核函数将这个中心点的像素值用它周围点的像素值的加权平均代替,周围像素点的权值相加起来等于1;这样既不影响生成的密度图中总人头数,又能够比较真实的反应每个人头在空间里面的位置特征。高斯核的函数图像如下所示。
另一方面,我们需要考虑到透视畸变对人头大小的影响。简单地说,就是在拍摄照片时,距离镜头越远的物体在照片上显得越小。如下图所示,距离镜头近的人头较大,占用的空间像素点较多,而距离镜头远的人头较小,占用的空间像素点较少。所以在使用高斯核函数时需要根据不同人头大小设置不同的模糊半径,即根据图像中每个人头部大小来确定参数σ。 但是在实际情况下,我们不可能准确的获得每个头部的尺寸大小,而且很难找到头部尺寸和密度图之间的关系。接下来我们继续研究上面的图片,通过观察图片我们可以发现每个头部大小通常与相邻人头中心点的距离有关。
经过分析,在拥挤场景中,我们可以使用相邻k个人头与该人头的平均距离来作为高斯核函数的参数σ,即自适应高斯核。
2.编程思路
(1)pts有标注的坐标点置为1,否则置0;
(2)使用python中scipy包中封装好的函数构造KDTree来寻找相邻的人头位置;
tree = scipy.spatial.KDTree(pts.copy(), leafsize=2048)
distances, locations = tree.query(pts, k=4)
(3)参数σ 的大小按下述方程确定:
σ = (distances[i][1] + distances[i][2] + distances[i][3]) * 0.1
(4)根据σ 值确定的高斯核构建相应的密度图;
(5)对密度图上所有值求和即为预测人数。
3.实际效果
通过实验分别得出低、中、高人流密度图片所对应的密度图如下:
观察实验结果可知经过该高斯核处理得到的密度图具有良好的反映实际人流密度的效果。
二、CSRNet、MCNN、CrowdNet
1、CSRNet
(1)网络框图
(2)创新点
a.网络的前端采用VGG-16 卷积部分,三次池化使宽高各为原来八分之一,并在其中加入了批归一化操作以防止梯度消失;
b.网络的后端中空洞卷积的引入增大了感受野,参考文献[1]的工作,选用Dilation rate=2。
2、MCNN
(1)网络框图
(2)创新点
a.MCNN使用了三列卷积神经网络,表示为L列(使用大尺度卷积核: 99, 77, 77,77), M(使用中等尺度卷积核: 77, 55, 55, 55), S列(使用小尺度卷积核: 55, 33, 33, 33)),其目的在于使用多种尺度的卷积核来适应不同尺度的人头大小;
b.网络用了一个的卷积层来把多通道的张量变成平面,取代了原来的全连接,使得输入图片的尺寸可以任意,使得该网络模型的应用范围更加广泛;c.MCNN需要先对三个单列神经网络进行预训练,再合并训练才能达到更好的效果其数据处理的方式;
d.MCNN对原始数据集的每张训练集图像随机裁剪9次,得到9张图像子块,每个图像子块为原图的1/4,这样的图像子块训练有其优点:(a)、图像尺寸变小,加快网络训练速度; (b)、通过局部图像块的训练完成对完整图像的训练,同样能达到很好的效果。
2、CrowdNet
(1)网络框图
(2)创新点
a.Deep Network 深层网络结构用来捕获高级的语义信息,网络结构类似于VGG-16。由于人群密度估计需要预测图片中每个像素点的值所以不同于分类网络结构,需要进行改进。为了获取像素级的预测,则需要去除VGG中的全连接层,因此网络就变成了全卷机网络结构模型。
b.Shallow Network浅层网络用来识别离相机比较远的的人头。由于人头检测不需要要高层的语义信息,所以只设计了三个卷积层,每层24个55大小的卷积核。浅层网络主要用检测小的人头。
c.Combination of Deep and Shallow Networks最后把深层网络和浅层网络的输出进行级联操作,因为深层和浅层网络的下采样率都是八分之一。进行通道级联后利用11的卷积进行处理,然后把输出图利用双线性插值上采样到原始输入尺寸图大小来获取最终的人群密度图预测。
三、GA与CNN
不过,由于神经网络属于“黑箱模型”,现阶段对于参数的优化、性能的提升无明确的指导标准,实验者只能依据经验,通过超参数的修改、不断地训练来取得更好的效果,然而这在实际应用中是相当繁琐的,如何训练才能更快地得到更优的人流密度估计网络图呢?
1、遗传算法(GA)
它是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。那么遗传算法中优胜劣汰是怎么体现的呢?在这里,我觉得概率是一个很好的东西,因为优化问题最终都可以转化为求极值的问题,每一个个体在经过遗传之后,从性状上都会通过一个效能函数反应出来,即适应度,适应度函数值越大,遗传到下一代的概率也就越大;经过遗传,问题就会得到不断的优化。
2、GANN
利用GA训练CNN的挑战在于如何将网络映射到染色体上。传统的编码模式将每个网络参数作为染色体的一个元素,而在大规模网络中,这种编码模式将使得染色体结构过于庞大,导致遗传算子失效等问题。一个解决方法是将每个卷积层与全连接层看作一个整体作为染色体的一个元素,即每个染色体元素要么包含一个层的所有连接权重,要么包含一个过滤器的所有值。这种编码模式大大缩减了染色体结构,使其具有更快的运算时间,更快的收敛速度以及更高的正确率。过程如下图所示。
下图展示的是文献[4]所做的工作,其将遗传算法(GA)迭代寻优的思想整合到CNN中,以提升CNN提取图像特征的能力。
2、GA在人流密度检测中的应用
运用GANN的思想,我们可以将每个卷积层看作一个整体作为染色体的一个元素,即每个染色体元素包含一个层的所有连接权重;适应度函数值选用每一次训练得到的MAE和MSE;迭代思路如下:
a初始化:初始化一定数量的种群,每个网络的过滤器与连接权重从均值为0的截尾正态分 布中随机产生。
b.适应度赋值:人流密度我们使用网络的每一代的评判指标MAE和MSE作为适应度。
c.选择:使用最有名的选择策略:适应度比率选择,也被称为轮盘赌选择,即一个网络的适应 度越高,其被选择的可能性就更大。
d.交叉:对卷积层,该过程随机选择双亲的其中一个,并将对应的过滤器拷贝到子代,如下图。
e.变异:对卷积层,其中的每一个值由均值为该值,标准差为0.5的高斯噪音代替,如下图。
f.代替:新产生的子代将取代最不适应的个体。
参考文献
[1]CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes
[2]Single-Image Crowd Counting via Multi-Column Convolutional Neural Network
[3]CrowdNet: A Deep Convolutional Network for Dense Crowd Counting
[4] GACNN: TRAINING DEEP CONVOLUTIONAL NEURAL NETWORKS WITH GENETIC ALGORITHM