crowd counting_[Crowd_Counting]-PGCNet-ICCV2019
1.contribution
本文主要的idea是对于不同人头scale的地方,实际上是需要用不同感受野的卷积核去感知人头的,人头小的地方,感受野小一点就能看到整个人头了,人头大的地方,感受野需要大一点,才能看到人头全貌,要小的感受野很简单,用小的卷积核就行了,但是大的感受野呢,可以用大的卷积核,或者多层小的卷积核,配合pooling,或者用dilated convolution,都是可以的,但是关键是,也就是本文的出发点,每张人群图片,可能是近大远小的分布,我希望同一张图,不同的区域用上不同感受野的卷积,这在操作上是很不方便的,也就是说,通常我们定义一个卷积层,就是定义一个固定kernel-size的卷积层,要实现不同地方不同kernel-size,在编程上就很难处理,因此本文采用了一种绕远路的办法,既然变scale的卷积很难实现,那就用变scale的gaussian blur+fix kernel conv去实现,这个变kernel的gaussian blur是基于perspective map来确定的,由于本文思路比较清晰,以上就先总结一下它的motivation,具体的contribution总结如下:
(1)用kernel varient gaussian+fix-kernel conv去实现kernel varient conv,反应到模型结构上就是一个PGC block
(2)贡献了一个新的数据集,叫crowd-survalience dataset,图片数为13945张,人数不多,基本上是300人以内,跟SHB差不多,但是图片数量很大,算是提供了一个大数据集
数据集下载链接地址: https://ai.baidu.com/broad/introduction
2.Method
(1)overview
本文的方法属于给现成的模型锦上添花的,就是说拿CSRNet作为backbone,然后后面跟几个PGC block,对CSRNet的输出进行修正,而下面一行的PENet就是用一个encoder-decoder去预测一张perspective map,用于PGC block的
(2)PGC block
本文称为perspective-guided convolution,就是gaussian blur+conv的模块,也是本文的核心,内容如下:
为什么不直接用变化kernel的卷积的原因主要是编程上难以实现,其次本文说了是卷积核的尺寸是量化的,1,3,5,7….可能不适合连续变化的人头scale,会造成一些量化的误差。
对于每张图片,先用PENet模块,去预测一张perspective map,用p表示,然后先对p进行归一化:
然后每个点确定该点处进行gaussian blur时,的参数σ的大小,σ越大,对应越大的人头,越大的感受野,计算如下:
上面的α,β,po都是可以训练的参数,基本上σ跟p是线性关系的,p越大,σ越大,σ确定后,二维的gaussian kernel就确定了:
然后对于backbone最后输出的C*H*W的feature,进行gaussian blur,获得blur的feature map
然后对于这个blur的feature map,进行一次fix-kernel的卷积:
(3)对gaussian blur这一步进行加速
本文说上面对feature map进行gaussian blur这一步很耗时,直接这样做,对于C*H*W的feature map,要进行C*H*W次pixel-wise的矩阵乘法,然后本文就事先预定义N个固定σ的guassian kernel,然后用PCA去选出C个eigenvector Gq,C<N, 然后上面的算出来的Gσij与C个Gq求内积,获得一个weight map,uq(i,j):
这个uq应该是H*W*C,这里的C指的是Gq的数量,然后对feature map进行gaussian blur就改成了下面的形式:
就是说对C*H*W的feature map,分别用固定kernel的Gq进行gaussian blur,获得C个blur的map,然后用C通道的Uq进行加权平均,因为每个Gq是固定kernel的,所以C*H*W的feature map对于每个Gq只要进行C次的矩阵乘法,然后C个Gq,就乘上C,也就是C1*C2次,注意2个C的含义不一样,然后相比于C*H*W,要快10左右
也就是说他们用几个固定kernel的Gaussian blur的加权求和,代替了变kernel的gaussian blur,下面这个PGC内部图就是这个意思
(4)PENet
本文PGC block需要基于perspective map来计算gaussian kernel的,因此需要预测perspective map,本文用了autoencoder,具体结构没说,然后用了3个阶段去训练,
Step1:在有perspective map ground truth的WorldExpo上进行perspective map->perspective map的重建的训练,用了L2的reconstruction loss:
E代表encoder,D表示decoder
Step2:在worldExpo上进行image->perspective的预测perspective的训练,此时只训练encoder,decoder保持不变,loss用的仍旧是L2 loss
Step3:拿PENet跟预测density map的主模型一起训练,如果遇到有perspective map ground truth的数据集,就counting的loss和perspective 的loss一起用,如果没有,就只基于density map训练
3.Crowd Surveillance Dataset
训练集10880张图片,测试集3065张图片,包含了各种生活场景,偏向于实际生活场景的大数据集,因此基本上人数很密集的图不多,分辨率也不固定,本文也对一些看上去是人,却没有标注的部分提供了一个遮挡的mask,用来避免模棱两可的情况。
4.Experiment
(1)实验细节
对于N个KxK的固定kernel的gaussian kernel,其σ采集自[1/4,K/4]的区间,K=7,然后以s=0.05的跨度采样,获得(k-1)/4/s个gaussian kernel,通过PCA选出4个Gq
(2)与SOTA的比较
Ours A表示PENet不跟counting模型联合训练,perspective map直接用PENet产生的,且不随这counting模型的训练而改变,Ours B表示PENet跟counting模型联合训练,perspective map会随训练改变,下面是density map跟perspective map的可视化
(3)ablation study
K的影响:
PGC模块数量的影响:
backbone的影响:
意思是换了ResNet101,效果是不如CSRNet的,但是加了PGC之后,效果是有提高的
PENet是否pre-train的影响
5.Conclusion
本文的motivation是好的,也用了巧妙地方法进行实现,但是是否合理尚且不能下结论,首先他们没能证明,是不是带来的效果增益是不是由于模型加深了的结果,同时是不是对过程中的feature map经过一个PGC,而不是最后的feature,效果会更好呢?总之我觉得从这个出发点,可以还有别的可玩的
crowd counting_[Crowd_Counting]-PGCNet-ICCV2019相关推荐
- crowd counting_[crowd_counting]-MANet_arxiv1901
1.Contribution 主要是研究了segmentation的mask如何作用于counting,会获得更好的效果 2.Model (1)backbone Part1: C(1, 64, 3)- ...
- crowd counting_[crowd_counting]-SFCN-CVPR2019amp;amp;GCC dataset
1.Contribution (1)主要是提出了基于GTA5的GCC数据集 数据集下载地址: https://gjy3035.github.io/GCC-CL/gjy3035.github.io ( ...
- crowd counting_[crowd_counting]-SFANet-arxiv1902
1.Network 图1 模型结构总览 (1)backbone用了VGG16,用了BN (2)整个结构跟UNet很像,上采样没说用的什么 (3)T和H的结构如下: 通过1x1的卷积来减少参数量 图2 ...
- 深度学习自学(二十六):ICCV2019
简单整理下人脸方向ICCV2019相关的论文. Oral 论文 11.Photo-Realistic Facial Details Synthesis from Single Image 作者:Anp ...
- 135套代码,图片人群计数模型crowd count model code repositoty
2017_Switch-CNN 2017_cite=848_CVPR_Switching convolutional neural network for crowd counting val-iis ...
- ICCV2019 全部论文分类汇总(含目标检测 / 图像分割等,1008 更新中)
作为计算机视觉领域三大顶会之一,ICCV2019目前已公布了所有接收论文ID(会议接收论文1077篇,总提交4303篇,25%的接收率),相关报道:1077篇!ICCV2019接收结果公布,你中了吗? ...
- 【ICCV2019】完整论文列表
ICCV2019完整论文清单,共1075篇. FaceForensics++: Learning to Detect Manipulated Facial Images Authors:Andreas ...
- 【ICCV2019 论文列表】出炉论文持续更新
ICCV2019 将于10月27号在召开共接收论文1077篇,目前已经有多篇论文公开,本帖将持续更新ICCV已放出的论文. 更新完整论文列表 ✈ ICCV2019 ?Log:v0.1: 424 pap ...
- 在caffe 中添加Crowd counting 数据层
#目录 [TOC] 一.简介 Crowd counting一般以人群图像作为输入,网络回归该图像对应的密度图.以往做法是先在matlab中根据图像的label(人头位置)生成密度图,然后将输入图像及密 ...
最新文章
- 带有生命的电子器件模型
- 【 FPGA 】FIR 滤波器之半带抽取器(Half-band Decimator)
- 编程方法学16:数组
- plsql 无法解析指定的连接标识符_Java方法加载、解析、存储、调用
- 迷宫寻路系列常用算法逻辑探究
- 删除了几个月的照片能找回么_手机删除的照片还能恢复?打开这里,一年前的也可以找回...
- 开放app开放login_开放值得付出努力吗?
- 小米11系列最新曝光:国内首发骁龙875 还有独占期
- Git flow常用命令
- MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
- 服务器部署_nginx报错: [warn] conflicting server name www.test.com on 0.0.0.0:80, ignored
- java tostring 库_JavaBean toString() – 将bean对象打印成字符串
- c语言小学生入门自学,啊哈C语言:小学生坐在马桶上都可以读懂的C语言编程入门书 PDF 扫描版[20M]...
- python调用bing翻译API V2
- 万年历,java如何实现日历查询
- Airbnb房源信息爬取(二)——获取房源信息
- AV1代码学习:解码端aomdec.c的main函数
- 计算机一级插入页码,同一篇文档中插入相同页码的小技巧
- Android监听消息(一)——应用消息捕获
- getElementsByName、getElementById的简单用法