深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR)解读

时间:2024-04-03 17:15:42

最近看了一篇新的CVPR2019论文,全名是《Residual Regression with Semantic Prior for Crowd Counting》,这篇paper基于时下表现最优秀的两个网络MCNN和CSRNet之上提出了几个能够进一步提升准确率的trick。

摘要

论文中提到了,之前的网络都仅专注于基于一张图片来生成它的密度图,而忽略了不同图片之间的联系,这些联系是值得网络学习,并且能够有效提升准确率的。同时,时下网络几乎都有一个共同的缺点,就是容易把不是人的物体辨别成人,如树木,云朵等,因此,作者提出了Semantic Prior的方法,使用一个已经pre_trained的二分器网络来辨别大概率没有行人的区域,并降低这些区域在生成密度图时的权重。
这篇论文最大的亮点就是这两个方法,下面,我们对论文做一个详细的解读。

论文解读

模型结构

深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
这里是论文采用的模型的结构,可见,这里模型的开始不仅只有输入图片一张了,同时还包括了k张support image,用来学习不同图片之间的联系。首先,我们先使用一个传统的网络作为基石,来为输入图片生成一张密度图,称这个传统网络为appearance based network,这个传统网络可以是MCNN或CSRNet,我们称由输入图片生成的这张密度图为appearance based prediction map

下面每一张support image都会被送进apperance based network,生成它们对应的密度图,然后生成的每一张密度图都会分别和上面的appearance based prediction一起被送进一个用于学习图片间联系的网络,这张网络称为residual predict network,由此生成k张图片,我们称这k张图片为residual maps

我们得到了k张residual map,我们把这k张map一起送进一个融合网络,称这张网络为residual fusion network,由此我们可以得到一张由k个residual map融合而成的map,我们称这张融合图片为residual fusion map

最后,这张residual fusion map还会和appearance map一起被送进一张最终融合网络,final fusion network,以此得到我们最终的密度图,final prediction map

由此可见,这次提出的模型结构是比较复杂的,在不断地堆料,我们有四个子网络结构,分别是:
传统网络appearance based network,
用来生成残差图的网络residual predict network,
融合各个残差图的网络residual fusion map,
用于最终融合的网络final fusion network

我们也有四种密度图,分别是:
由传统网络生成的密度图appearance based prediction map,
残差密度图residual maps,
融合的残差密度图residual fusion map,
最终融合的密度图final prediction map

虽然堆料的数量有一点多,但是我觉得这些结构和图片之间的关系是不复杂的,通过讲解和上面那张结构图,我相信在思考之后,一定是不难理解的。下面我们来分别看一下这几个子网络的结构
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
这里是传统网络也就是appearance based network的结构,一个是MCNN,一个是CSRNet。这两个网络已经分别在CVPR2016和2018中被提出了,如果想要深入理解可以去看一下它们的论文。这里的C代表卷积层,括号里的数字分别是卷积核数量,卷积核大小和空洞率,空洞率默认是1,空洞卷积可以在不牺牲图像分辨率和保持参数数量的前提下扩大感受野,在CSRNet的论文中也有深入的探讨。P代表max-pooling层,让图像大小减半。T代表步长小于1的转置卷积,可以让图像的大小翻倍,由此保持密度图的质量。

下面是其他三个子网络的结构:
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
这里的每一个子网络都参考了MCNN,采取了多分支结构

以上提到的网络中,除了最后一层以外的所有卷积层后都使用了PReLU**函数来**

Semantic Prior方法

我在博客的开头已经提到,我们的时下的网络都容易把图片背景中的物体如树木,云朵等物体识别成行人,这很大程度上降低了网络的准确率,Semantic Prior方法的提出就是为了降低这种干扰的

那么这个方法是如何实现的呢?作者直接使用了一个被pre-trained好的encoder-decoder model,这个模型是一个二分类器,可以把我们的输入图片分成两个部分,一个是确信没有行人的部分,一个是可能有行人的部分,只有当确信度相当高的部分,才会被归到没有行人的那一个部分中。那么我们在最终生成密度图的时候,只要将这些确信没有行人的部分像素的权重降低,就会有效减少误判带来的损失了。作者在文中提到,理想地来看,是应该将这些确信没行人的部分像素权重降低到0的,但是我们采用的encoder-decoder model是被pre-trained的,并且因为数据集中不提供所需标签,无法做fine-tuning,其准确度不是完全可靠,所以这些被认为是无行人的部分的像素权重就被设在了0.5

损失函数

一般来说,损失函数应该是由最终密度图和ground-truth生成的,但是,作者为了提升准确率,将各个部分的密度图都加入到了损失函数的计算当中。损失函数的计算公式如下:
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
可见,损失函数是由四个项构成的,并且在后面的项前都加了权重

S-MSE

我们在计算损失函数的时候,就使用到了Semantic Prior,本应该使用的是MSE损失,我们在引入了Semantic Prior后,作者将损失函数称为Semantic MSE,具体的计算公式如下:
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
第一个参数是我们网络生成出来的密度图,第二个参数是ground-truth密度图,第三个参数就是我们使用Semantic Prior方法得出的像素权重图,密度图和权重图之间的运算是对应位相乘

有了S-MSE的公式,我们就可以计算每一项的值了

La

深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
N为batch中的输入图片个数,从公式里看出,La就是直接用appearance based map与ground truth计算得出的

Lr

深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
这一项是用所有的residual maps和resisual fusion map计算S-MSE并且相加得到的

Lff

深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
Lff也比较简单,只是final fusion map计算S-MSE

Lad

Lad是作者提出的创新点,名字是adversarial loss,是根据一个二分类的判别器结构C(64,3)-C(128,3)-P-C(256,3)-PC(256,3)-C(256,3)-P-C(1,1)-Sigmoid得出的,loss的公式如下:
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读

Support Set的生成

我们在上文中提到了要使用support image来学习图片之间的联系,但是还没有交代怎么生成support set,下面我们来介绍一下怎么选取support image图片
我们用网格把数据集里的每一张图片分成多个部分,每个部分的值就是这个部分的像素值之和,然后将每一张图片里的网格的值拍平,组成向量,使用k-means聚类算法将这些向量分成k组,并选取每一组中最靠近中心的一个向量对应的图片作为support image,一共有k张support image,由此就组成了support set

训练过程

我们先训练appearance based network,然后将训练好的appearance based network与网络的其他部分放在一起训练,单独训练appearance based network时,学习率为1e-4,一起训练时,appearance based network学习率为1e-4,其他部分学习率为1e-5。
损失函数里的三个项前权重分别设为1,1,1e-12。由此可见作者在使用adversarial loss的时候还是相当谨慎的

数据集与对比实验

论文中使用了三个数据集,分别是ShanghaiTech,WorldExpo和UCF 50
使用了两个误差函数进行评估,分别是MAE(平均绝对误差)和RMSE(均方根误差),两者的计算公式如下:
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
K是测试集图片数量,Ci尖号和Ci分别是网络生成结果和ground-truth

下面,作者采用了消融实验对各个trick的有效性做了评估,实验结果如下:
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
这是在ShanghaiTech-A上得出的结果,A代表仅使用appearance based network,RR代表使用了residual regression,SP代表使用了semantic prior,full代表使用了包括adversarial loss在内的所有trick。我们可以看到,RR对准确率的提升是非常显著的,也印证了开头说的,图片之间的联系是值得学习的。CSRNet+full的组合也获得了有史以来最高的准确率。

作者也同样进行了跨场景与跨数据集的测试:
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
深度学习:人群密度估计Residual Regression和Semantic Prior论文(CVPR2019)解读
由此可见,本次提出的网络结构也具有相当强的泛化能力

总结

本篇论文提出了几个相当有效的提升网络在人群计数方面准确率的方法,尤其是residual regression,创新地提出了学习图片之间联系的思想,对准确率提供了非常大的帮助。
目前作者在github放出了论文的一部分pytorch源代码,在读完源代码之后我会尝试对剩下残缺的部分做一些实现,下一篇博客可能是对本篇论文源代码的补充和解读