Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于ACSCP算法实现的几个疑问,还请指教…… #4

Open
kongjibai opened this issue Oct 23, 2018 · 7 comments
Open

关于ACSCP算法实现的几个疑问,还请指教…… #4

kongjibai opened this issue Oct 23, 2018 · 7 comments

Comments

@kongjibai
Copy link

kongjibai commented Oct 23, 2018

您好!很高兴您能够分享关于ACSCP算法的实现,关于您的实现我有几个疑问还请指教:
1)论文中说,生成网络的最后一层后面应该是tanh激活函数,但是看您用的是先Sigmoid后ReLU?
2)生成网络是一个U-Net的结构,在镜像对称的卷积和反卷积层中间添加了skip connections,不应该是e1连接d8、e2连接d7吗?看您是e1连接d7、e2连接d6呢?
3)训练方面,作者训练了300个epoch,前100个epoch,λc=0;后200个epoch λc=10,不知您是否是这样训练的?
4)另外您给出的结果示例,应该是IMG_173_A的图吧,可是原测试数据集中给的ground truth是483个人,而您给出的结果中ground truth人数是707人呢?
5)我用您的代码和数据集训练,在product时生成的密度图咋有很多竖条纹?
6)由密度图得出人数,直接round(sum(sum(mp)))就可以了,这是什么原理?
希望您能够在百忙之中抽出时间予以解答,不生感激,谢谢!

@Ling-Bao
Copy link
Owner

Ling-Bao commented Oct 24, 2018

在实现过程中,并非完全参照论文进行实现,增加了一些技巧。
(1)针对问题1,在进行模型训练过程中,采用relu(sigmoid(x))可以将输出的密度值限制在(0, 1)之间,能加速模型训练收敛;见Readme的Details小节
(2)此部分的U-Net可能没有完全参照论文进行实现;
(3)训练时的超参数设置与论文相同;
(4)IMG_173_A gt值可能我还需要确认下;
(5)因为我将网络设计成了全卷积模型,可以适应任意图像大小的输入,但目前代码不是特别完善,需要人为设定输入图像大小;具体请参考https://github.com/Ling-Bao/ACSCP_cGAN/tree/master/release
(6)对密度图的值进行加总即为估计的人数。

@kongjibai
Copy link
Author

非常感谢您的指教!不过还是有几点不明之处:
1)问题1中,您使用sigmoid(relu(x))虽然可以加速模型收敛,将输出密度限制在(0,1),但是原作中使用的是tanh(x),其范围在(-1,1),这会不会影响最终的人群计数结果?
2)关于问题2,我后来仔细看了下,您做的没错,skip connections需要前后的shape是相同的,而e1和d8的shape并不相同;
3)问题5中提到的,我完全使用您的代码和数据重新训练的模型,生成的密度图会有竖条纹,不知您是否遇到过?或者在训练过程中有什么参数需要调整,有哪些训练的技巧?
4)在训练过程中,large生成器的前3个deConv中使用了dropout,在测试或实际使用中(product部分)不应该使用dropout了吧?否则会导致这些层某些单元随机失活,导致计算结果不稳定。
5)在使用large判别器计算对抗损失时,您的输入数据是self.d_l_x、self.d_l_x_,但是在self.discriminator_large()中他们却不是经过tanh()的那个,却经过了一个随机线性变换,我不太明白您这样做的目的是什么?另外,这样会不会对最后的损失函数有影响?

@Ling-Bao
Copy link
Owner

Ling-Bao commented Oct 24, 2018

(1)其实密度图的每个像素值只能从(0,1)取值(由高斯核性质决定f(x, y)大于等于0);如果密度图输出有值取到负值,将不合理。感觉这是论文没有考虑到的,我在另一个项目MSCNN(https://github.com/Ling-Bao/mscnn) 中也使用了相同的技巧,效果提升明显;
(2)同第一次回答,在复现过程中,模型结构可能有细微差别;同时,在实现Cross-Scale Consistency Pursuit Loss的时候难度比较大,需要concat四个小块的密度估计值与整图估计值进行loss计算,这也是论文实现最难的地方,有多种实现方案,我选了一种我认为好实现的方法;
(3)条纹其实是cancat的结果,在训练时,需要将图像分割为四个部分,那么每个部分均需要进行密度估计;第一版的时候我将四个块直接concat,这样切割线上会不平滑出现条纹;第二版我将其输入改为了700x700(图像需要resize为700x700,其实也可以自适应图像大小,但需要修改网络);这里有一个优化点你可以进行尝试,目前作者在分割时是硬分割,因此分割线附近的人群密度可能估计不好,我的想法是将分割线做成叠合的分割方法,这样效果应该会好一些,限于时间有限没有进行实验;
(4)实际使用时,需要加上dropout,不然估计值将偏大,实验结果显示,加dropout效果要好一些;结果不稳定是没有问题的,本来一张图像的人数就是进行估计,你可以多计算几次取平均(模型运行效率非常高,甚至在cpu上也能很快计算出结果),或者直接将输出作为估计值(实验表明同一张图多次估计偏差不会太大);
(5)对抗损失的实现方法你可以参考WassersteinGAN(https://github.com/shekkizh/WassersteinGAN.tensorflow/blob/master/models/GAN_models.py) 或其它GAN、cGAN实现代码。

@kongjibai
Copy link
Author

非常感谢您的解答,受益匪浅!
问下您有没有验证过测试集中其他图像的准确度?
比如,我用您的模型,data\data_im\test_im\IMG_1_B.jpg,出来的结果是400+,实际只有23,相差巨大。我看了下密度图,发现下边是地板的部分高亮,很不可思议!

@Ling-Bao
Copy link
Owner

时间有限并没有在验证集上做与论文相同实验条件下的评估, 目前提供的模型仅针对A部分数据集进行训练, 对人群稀疏的B部分数据集需要重新训练模型

@kongjibai
Copy link
Author

多谢啦!

@RQuispeC
Copy link

RQuispeC commented Apr 6, 2019

Hi, you may be interested in my implementation in pytorch. It includes the density map generation.
https://github.com/RQuispeC/pytorch-ACSCP

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants