ACSCP_cGAN icon indicating copy to clipboard operation
ACSCP_cGAN copied to clipboard

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

Open kongjibai opened this issue 6 years ago • 7 comments

您好!很高兴您能够分享关于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)))就可以了,这是什么原理? 希望您能够在百忙之中抽出时间予以解答,不生感激,谢谢!

kongjibai avatar Oct 23 '18 03:10 kongjibai

在实现过程中,并非完全参照论文进行实现,增加了一些技巧。 (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)对密度图的值进行加总即为估计的人数。

Ling-Bao avatar Oct 24 '18 06:10 Ling-Bao

非常感谢您的指教!不过还是有几点不明之处: 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()的那个,却经过了一个随机线性变换,我不太明白您这样做的目的是什么?另外,这样会不会对最后的损失函数有影响?

kongjibai avatar Oct 24 '18 09:10 kongjibai

(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实现代码。

Ling-Bao avatar Oct 24 '18 12:10 Ling-Bao

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

kongjibai avatar Oct 26 '18 06:10 kongjibai

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

Ling-Bao avatar Oct 27 '18 02:10 Ling-Bao

多谢啦!

kongjibai avatar Oct 30 '18 07:10 kongjibai

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

RQuispeC avatar Apr 06 '19 21:04 RQuispeC