ACSCP_cGAN
ACSCP_cGAN copied to clipboard
密度图问题
为什么ground truth里面标记的头的坐标不是整数?
ShanghaiTech数据集的人头坐标是整数的,其他数据集不太清楚
@kongjibai 我的结果确实是小数,实验过程和结果如下: PS E:\BaiduYunDownload\ShanghaiTech_Crowd_Counting_Dataset\part_A_final\test_data\ground_truth> python Python 3.6.7 |Anaconda custom (64-bit)| (default, Oct 28 2018, 19:44:12) [MSC v.1915 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information.
import scipy.io as sio sio.loadmat('./GT_IMG_99.mat') {'header': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Fri Oct 23 13:25:05 2015', 'version': '1.0', 'globals': [], 'image_info': array([[array([[(array([[577.09259259, 384.2037037 ], [411.16666667, 329.09259259], [430.72222222, 394.27777778], [481.68518519, 381.24074074], .........(省略)
[456.68381618, 147.15334665], [515.504995 , 145.87462537], [248.89160839, 152.90759241]]), array([[242]], dtype=uint8))]], dtype=[('location', 'O'), ('number', 'O')])]], dtype=object)}
@Ling-Bao 另外,我还有几个问题想要请教下:
- model.py的551行和552行为什么都是self.g_L_bn_e2,而self.g_L_bn_e1却没有被使用过?
- model.py的172-183行的图像分割为什么是这样,举个例子:当w_small = 8,不等于h_small = 5时, small_im_4 = self.real_im[:, w_small:w_small + h_small, h_small:h_small + w_small, :] = self.real_im[:,8:13,5:13,:], 而13超过了h = 2 * h_small = 10。当然,项目中长宽相等,不会出现这样的问题。
- 论文3.4中有这样的论述:It is worth nothing that if we know the ground-truth human counts for child patches, we might also define ℓ2 losses for each Pchild. 但是整个图片的密度图本来就是需要且已知的,那截取Pchild对应的密度图不就可以知道真实的人数了吗?原文是什么意思?
- 我用你提供的模型,发现与论文的所宣称的效果差距很大,ShanghaiTech的A部分的MAE和MSE是论文的两倍多,B部分相差更大。请问下有什么可以改进的地方?你与论文的优化器使用不一致,是否有影响?
(1)这里的代码实现比较尴尬,在我训练完tf模型后才发现调用了两次self.g_L_bn_e2(),但name='g_L_e1_con'/'g_L_e2_con',阴差让错的不统一但结果是对的;后面没有时间训练新的模型就没有将代码统一起来。
self.g_L_bn_e1 = batch_norm(name='g_L_bn_e1')
self.g_L_bn_e2 = batch_norm(name='g_L_bn_e2')
......
e1 = self.g_L_bn_e2(conv2d(image, output_dim=64, k_h=6, k_w=6, d_h=2, d_w=2, name='g_L_e1_con'))
e2 = self.g_L_bn_e2(conv2d(lrelu(e1), output_dim=64, k_h=4, k_w=4, d_h=2, d_w=2, name='g_L_e2_con'))
建议:如果需要新训练模型又想统一代码风格,可以将第一个self.g_L_bn_e2()改为self.g_L_bn_e1()。
(2)没太明天你的问题。这里实现的功能是将图像沿长、宽中线分为4个等大小块(同理也需要将密度图分为4个等大小块),然后一次性送入self.generator_small()模型获取估计密度图。
# 0.1 small判别器与生成器输入尺寸
w_small = int(self.image_size / 2)
h_small = int(self.image_size / 2)
说明:这里的实现是该模型实现的难点,对应论文中的一致性损失,包括几种可能的方案。(1)将图像分为4块,然后一次性送入self.generator_small()模型,这是我项目中的做法;(2)分为4块后,分别送入self.generator_small()模型,等4块都计算好后再计算一致性损失;(3)构建4个self.generator_small()模型,然后分别将不同的块送入对应的self.generator_small()模型,这种做法感觉不太符合论文中的描述,论文中使用的是共享权重。
(3)由整图的密度图确实不知道准确的4个子块的密度图;因为直接分割密度图获取的子密度图,在分割线上的人头数量是不准确的。这个问题也是该论文的创新所在,作者基于分块的密度图应恒等于全图的密度图(或人数恒等)这一事实,构造了一致性损失函数来解决这个问题。
(4)由于时间有限,我所做的训练并没有严格按照论文的参数来做。其次是训练数据集的质量不好,首先是数据集图像的尺寸(720*720,直接resize或填补或在原图中截取的选择,可能导致结果有细微差别);其次是人头密度的高斯核半径不完全符合真实的人头半径。
最后,非常感谢你对项目的提问,本项目ACSCP_cGAN和mscnn均有许多不严谨的地方,都并没有完全按照论文的设计来进行实现。如果你需要在本项目的基础上复现论文,是可以很容易做到的。主要给你两个意见:一是获取更好的训练标注数据集对模型进行训练;二是在实现ACSCP_cGAN的一致性损失时,可以多与论文原作者进行请教,确定具体实现的方案。
@Ling-Bao 感谢您的回复! (1)针对问题2,我的疑惑是这样的: small_im_4 = self.real_im[:, w_small:w_small + h_small, h_small:h_small + w_small, :]相当于是图片右下角的那个四分之一。那按照我的理解右下角的四分之一应该是这样写: small_im_4 = self.real_im[:, w_small:, h_small:, :]。 w_small是长的二分之一,h_small是宽的二分之一,那么w_small + h_small这样的表达式是什么意思? (2)再请问下ShanghaiTech里的数据集的坐标是小数,为什么会这样呢?
(1)点赞哈,我这里的写法确实有问题,只是凑巧图像长宽相等,在调试的时候没有发现。 (2)这个数据集由mcnn作者提供,怀疑是他的matlab标注工具有点问题。
Hi, you may be interested in my implementation in pytorch. It includes the density map generation. https://github.com/RQuispeC/pytorch-ACSCP