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相关推荐

  1. crowd counting_[crowd_counting]-MANet_arxiv1901

    1.Contribution 主要是研究了segmentation的mask如何作用于counting,会获得更好的效果 2.Model (1)backbone Part1: C(1, 64, 3)- ...

  2. crowd counting_[crowd_counting]-SFCN-CVPR2019amp;amp;GCC dataset

    1.Contribution (1)主要是提出了基于GTA5的GCC数据集 数据集下载地址: https://gjy3035.github.io/GCC-CL/​gjy3035.github.io ( ...

  3. crowd counting_[crowd_counting]-SFANet-arxiv1902

    1.Network 图1 模型结构总览 (1)backbone用了VGG16,用了BN (2)整个结构跟UNet很像,上采样没说用的什么 (3)T和H的结构如下: 通过1x1的卷积来减少参数量 图2 ...

  4. 深度学习自学(二十六):ICCV2019

    简单整理下人脸方向ICCV2019相关的论文. Oral 论文 11.Photo-Realistic Facial Details Synthesis from Single Image 作者:Anp ...

  5. 135套代码,图片人群计数模型crowd count model code repositoty

    2017_Switch-CNN 2017_cite=848_CVPR_Switching convolutional neural network for crowd counting val-iis ...

  6. ICCV2019 全部论文分类汇总(含目标检测 / 图像分割等,1008 更新中)

    作为计算机视觉领域三大顶会之一,ICCV2019目前已公布了所有接收论文ID(会议接收论文1077篇,总提交4303篇,25%的接收率),相关报道:1077篇!ICCV2019接收结果公布,你中了吗? ...

  7. 【ICCV2019】完整论文列表

    ICCV2019完整论文清单,共1075篇. FaceForensics++: Learning to Detect Manipulated Facial Images Authors:Andreas ...

  8. 【ICCV2019 论文列表】出炉论文持续更新

    ICCV2019 将于10月27号在召开共接收论文1077篇,目前已经有多篇论文公开,本帖将持续更新ICCV已放出的论文. 更新完整论文列表 ✈ ICCV2019 ?Log:v0.1: 424 pap ...

  9. 在caffe 中添加Crowd counting 数据层

    #目录 [TOC] 一.简介 Crowd counting一般以人群图像作为输入,网络回归该图像对应的密度图.以往做法是先在matlab中根据图像的label(人头位置)生成密度图,然后将输入图像及密 ...

最新文章

  1. 带有生命的电子器件模型
  2. 【 FPGA 】FIR 滤波器之半带抽取器(Half-band Decimator)
  3. 编程方法学16:数组
  4. plsql 无法解析指定的连接标识符_Java方法加载、解析、存储、调用
  5. 迷宫寻路系列常用算法逻辑探究
  6. 删除了几个月的照片能找回么_手机删除的照片还能恢复?打开这里,一年前的也可以找回...
  7. 开放app开放login_开放值得付出努力吗?
  8. 小米11系列最新曝光:国内首发骁龙875 还有独占期
  9. Git flow常用命令
  10. MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
  11. 服务器部署_nginx报错: [warn] conflicting server name www.test.com on 0.0.0.0:80, ignored
  12. java tostring 库_JavaBean toString() – 将bean对象打印成字符串
  13. c语言小学生入门自学,啊哈C语言:小学生坐在马桶上都可以读懂的C语言编程入门书 PDF 扫描版[20M]...
  14. python调用bing翻译API V2
  15. 万年历,java如何实现日历查询
  16. Airbnb房源信息爬取(二)——获取房源信息
  17. AV1代码学习:解码端aomdec.c的main函数
  18. 计算机一级插入页码,同一篇文档中插入相同页码的小技巧
  19. Android监听消息(一)——应用消息捕获
  20. getElementsByName、getElementById的简单用法

热门文章

  1. 如何更改应用在app store的名称
  2. 根据GPS经纬度查找指定范围内的对象
  3. ADO.NET Entity Framework 学习(1) [ZT]
  4. 基于Springboot实现园区招商管理系统
  5. python正态分布相关函数
  6. 默认参数,不固定参数 *args,**kwargs
  7. print、println的区别
  8. 服务端关闭session的重要性
  9. Oracle 查询今天、昨日、本周、本月和本季度的所有记录
  10. Ubuntu下使用Evernote