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

密度图问题 #5

Open
Ethanwl opened this issue Nov 20, 2018 · 7 comments
Open

密度图问题 #5

Ethanwl opened this issue Nov 20, 2018 · 7 comments

Comments

@Ethanwl
Copy link

Ethanwl commented Nov 20, 2018

为什么ground truth里面标记的头的坐标不是整数?

@kongjibai
Copy link

ShanghaiTech数据集的人头坐标是整数的,其他数据集不太清楚

@Ethanwl
Copy link
Author

Ethanwl commented Nov 30, 2018

@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)}

@Ethanwl
Copy link
Author

Ethanwl commented Dec 3, 2018

@Ling-Bao 另外,我还有几个问题想要请教下:

  1. model.py的551行和552行为什么都是self.g_L_bn_e2,而self.g_L_bn_e1却没有被使用过?
  2. 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. 论文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对应的密度图不就可以知道真实的人数了吗?原文是什么意思?
  4. 我用你提供的模型,发现与论文的所宣称的效果差距很大,ShanghaiTech的A部分的MAE和MSE是论文的两倍多,B部分相差更大。请问下有什么可以改进的地方?你与论文的优化器使用不一致,是否有影响?

@Ling-Bao
Copy link
Owner

Ling-Bao commented Dec 3, 2018

(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的一致性损失时,可以多与论文原作者进行请教,确定具体实现的方案。

@Ethanwl
Copy link
Author

Ethanwl commented Dec 3, 2018

@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里的数据集的坐标是小数,为什么会这样呢?

@Ling-Bao
Copy link
Owner

Ling-Bao commented Dec 3, 2018

(1)点赞哈,我这里的写法确实有问题,只是凑巧图像长宽相等,在调试的时候没有发现。
(2)这个数据集由mcnn作者提供,怀疑是他的matlab标注工具有点问题。

@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

4 participants