dontLoveBugs / CSPN_monodepth

Unofficial Faster PyTorch implementation of Convolutional Spatial Propagation Network
67 stars 16 forks source link

关于eight_way_propagation的一些问题 #2

Open yellowYuga opened 5 years ago

yellowYuga commented 5 years ago

您好: 如同您在cspn里的issues所说,eight_way_propagation函数的实现与文章不符。最后您的实现是按照文章来的还是按照原来的代码来的,最后达到文章中的效果了吗?

yellowYuga commented 5 years ago

您好: 这是我跟据原文写的2d cspn:

    def eight_way_propagation_v3(self, weight_matrix, blur_matrix, kernel):
        [batch_size, channels, height, width] = weight_matrix.size()
        weight_abs = torch.abs(weight_matrix)
        self.avg_conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=kernel, stride=1,
                                  padding=(kernel - 1) // 2, bias=False)
        weight = torch.ones(1, 1, kernel, kernel).cuda()
        weight[0, 0, (kernel - 1) // 2, (kernel - 1) // 2] = 0 
        self.avg_conv.weight = nn.Parameter(weight)  
        for param in self.avg_conv.parameters():  
            param.requires_grad = False

        weight_sum = self.avg_conv(weight_matrix)
        abs_sum=self.avg_conv(weight_abs)
        out=torch.div((abs_sum-weight_sum)*blur_matrix+self.avg_conv(weight_matrix*blur_matrix),abs_sum)

        return out

根据设计的一些简单的手动的计算验证了是正确的(囧)。 其中weight_matrix可以是负数值,原来代码中的若weight_matrix可能为负数值的话会出错。

guandog commented 5 years ago

赞啊,我也发现原作者写的affinity matrix有问题。实验了一下,确实是你的版本收敛得更好一些

yellowYuga commented 5 years ago

赞啊,我也发现原作者写的affinity matrix有问题。实验了一下,确实是你的版本收敛得更好一些

你是做的depth completion 还是 stereo

dontLoveBugs commented 5 years ago

作者提供的代码从某种意义上确实有作用,不过我们根据论文重写了代码,效果提升了很多。

guandog commented 5 years ago

我做的是stereo

ArcherFMY commented 5 years ago

@dontLoveBugs 您好,

作者提供的代码从某种意义上确实有作用,不过我们根据论文重写了代码,效果提升了很多。

请问您说的效果提升了很多是用的这个repo的版本吗?

yellowYuga commented 5 years ago

@guandog 不好意思问一下,有两个问题 第一个问题是这个 torch.div 会出现除数为0的情况,也就是abs_sum可能有0元素。 第二个问题是Stereo中 有用到max_of_8_tensor() operation吗,并不理解这个起什么作用。

dontLoveBugs commented 5 years ago

@dontLoveBugs 您好,

作者提供的代码从某种意义上确实有作用,不过我们根据论文重写了代码,效果提升了很多。

请问您说的效果提升了很多是用的这个repo的版本吗?

不是,新版本没有提交

yellowYuga commented 5 years ago

还有一个问题,按照文章中所说,我使用我的cspn,迭代了24次,然后很容易直接梯度爆炸。怎么样才能即迭代够24次又不会梯度爆炸

guandog commented 5 years ago

我把cspn加入到网络中,也遇到了不容易收敛的问题,有哪位大神知道如何解决这个问题吗

ghost commented 5 years ago

楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:

  1. 我看他输出的guidance是一个b*8*h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
  2. 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
  3. 文中提到的iteration我本来的理解是从一个local的位置向8个方向扩撒若干次,例如从(3,3)的位置扩散3次,那么这个信息就扩散到了从左上角(0,0)到右下角(6,6)的矩形区域里,但是看代码的for loop他好像在用同样的guidance在原地连续作用了16次,这个是什么意图啊?

请诸位在百忙之中能帮忙提点一下,感激不尽!

dontLoveBugs commented 5 years ago

楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:

  1. 我看他输出的guidance是一个b8h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
  2. 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
  3. 文中提到的iteration我本来的理解是从一个local的位置向8个方向扩撒若干次,例如从(3,3)的位置扩散3次,那么这个信息就扩散到了从左上角(0,0)到右下角(6,6)的矩形区域里,但是看代码的for loop他好像在用同样的guidance在原地连续作用了16次,这个是什么意图啊?

请诸位在百忙之中能帮忙提点一下,感激不尽!

我认为,CSPN作者的代码和论文有些出入,8个channel指的是向8个方向传播(和论文中的公式(1)有些出入);16就是扩算16次,每次迭代得到的result_depth是不同的,不是在原地作用。

yellowYuga commented 5 years ago

楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:

  1. 我看他输出的guidance是一个b_8_h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
  2. 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
  3. 文中提到的iteration我本来的理解是从一个local的位置向8个方向扩撒若干次,例如从(3,3)的位置扩散3次,那么这个信息就扩散到了从左上角(0,0)到右下角(6,6)的矩形区域里,但是看代码的for loop他好像在用同样的guidance在原地连续作用了16次,这个是什么意图啊?

请诸位在百忙之中能帮忙提点一下,感激不尽!

我认为,CSPN作者的代码和论文有些出入,8个channel指的是向8个方向传播(和论文中的公式(1)有些出入);16就是扩算16次,每次迭代得到的result_depth是不同的,不是在原地作用。

首先我是做Stereo立体匹配的,没有做出好的效果。 我之前不是这么认为的,但我一直没看懂那8个channel的意思,所以弃用了那部分,只用了如开始我自己改的那个eight_way_propagation,至于三维的26_way_propagation也是一样按照自己写的的,只是把二维卷积换成了三维卷积。 还请具体解释下这8个gate,和max_of_8_tensor的作用,万分感激!

ghost commented 5 years ago

楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:

  1. 我看他输出的guidance是一个b_8_h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
  2. 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
  3. 文中提到的iteration我本来的理解是从一个local的位置向8个方向扩撒若干次,例如从(3,3)的位置扩散3次,那么这个信息就扩散到了从左上角(0,0)到右下角(6,6)的矩形区域里,但是看代码的for loop他好像在用同样的guidance在原地连续作用了16次,这个是什么意图啊?

请诸位在百忙之中能帮忙提点一下,感激不尽!

我认为,CSPN作者的代码和论文有些出入,8个channel指的是向8个方向传播(和论文中的公式(1)有些出入);16就是扩算16次,每次迭代得到的result_depth是不同的,不是在原地作用。

同问,这个8如果是8个方向的话,确实更符合逻辑一点, 但是我还是理解不了这个max_of_8_tensor的意图是什么。 另外,从卷积的角度来看,确实如果16次卷积的话,他的接收域会扩大,(相当于做了16层3*3的卷积)但是他每次只取8个方向中所得结果最大的一个放入下一层,我还是不能理解。而且虽然接收域扩大了,但是这个结果感觉并没有扩散到外面去啊,只是在计算当前位置的depth时考虑了更远的邻域的结果,这两个我觉得不是一回事呀。求指点,万分感谢!

yellowYuga commented 5 years ago

楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:

  1. 我看他输出的guidance是一个b_8_h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
  2. 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
  3. 文中提到的iteration我本来的理解是从一个local的位置向8个方向扩撒若干次,例如从(3,3)的位置扩散3次,那么这个信息就扩散到了从左上角(0,0)到右下角(6,6)的矩形区域里,但是看代码的for loop他好像在用同样的guidance在原地连续作用了16次,这个是什么意图啊?

请诸位在百忙之中能帮忙提点一下,感激不尽!

我认为,CSPN作者的代码和论文有些出入,8个channel指的是向8个方向传播(和论文中的公式(1)有些出入);16就是扩算16次,每次迭代得到的result_depth是不同的,不是在原地作用。

同问,这个8如果是8个方向的话,确实更符合逻辑一点, 但是我还是理解不了这个max_of_8_tensor的意图是什么。 另外,从卷积的角度来看,确实如果16次卷积的话,他的接收域会扩大,(相当于做了16层3*3的卷积)但是他每次只取8个方向中所得结果最大的一个放入下一层,我还是不能理解。而且虽然接收域扩大了,但是这个结果感觉并没有扩散到外面去啊,只是在计算当前位置的depth时考虑了更远的邻域的结果,这两个我觉得不是一回事呀。求指点,万分感谢!

方便的话可以留个邮箱交流吗?

ghost commented 5 years ago

@yellowYuga yangfengt666@gmail.com

Sarah20187 commented 5 years ago

@yellowYuga @yangfengt123 同求交流! 建了一个slack讨论组https://join.slack.com/t/the-github/shared_invite/enQtNTYxNDIzNjU3NzY3LTliNWZiMjg3NDc5ZDRlZmYwMDM1NTJhNzAwMDFkNWUzOThkMmZhZGNlODE4ZjYyMjRhYWUyMTY3YWZmMGFmMzQ

longyangqi commented 5 years ago

楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:

  1. 我看他输出的guidance是一个b_8_h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
  2. 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
  3. 文中提到的iteration我本来的理解是从一个local的位置向8个方向扩撒若干次,例如从(3,3)的位置扩散3次,那么这个信息就扩散到了从左上角(0,0)到右下角(6,6)的矩形区域里,但是看代码的for loop他好像在用同样的guidance在原地连续作用了16次,这个是什么意图啊?

请诸位在百忙之中能帮忙提点一下,感激不尽!

我认为,CSPN作者的代码和论文有些出入,8个channel指的是向8个方向传播(和论文中的公式(1)有些出入);16就是扩算16次,每次迭代得到的result_depth是不同的,不是在原地作用。

首先我是做Stereo立体匹配的,没有做出好的效果。 我之前不是这么认为的,但我一直没看懂那8个channel的意思,所以弃用了那部分,只用了如开始我自己改的那个eight_way_propagation,至于三维的26_way_propagation也是一样按照自己写的的,只是把二维卷积换成了三维卷积。 还请具体解释下这8个gate,和max_of_8_tensor的作用,万分感激!

感谢大佬们的讨论,@yellowYuga @guandog @dontLoveBugs @yangfengt123 @ArcherFMY 不知道现在问题完全理清楚了吗?以下是我对原代码的一点见解和疑惑,还请大佬们指点指点:

  1. 论文中公式(1)的diffuse过程,应该跟代码的实现不太一样吧?论文应该是每个点(i,j)要对应一个8路的权重矩阵k_i,j,具体来说比如点(3,3),进行一次传播,对于(2,2)点和(4,4)点的权重大小应该是不一样的,但是按照代码的写法,整个weight_metrics作用于全图,也就是忽视了这种不同的权重,不知道这种理解对不对;
  2. 针对1.中提到的问题,我猜测或许用8路(或者9路?)可以改善?因为一个点其实要被周围的点利用9次,因此需要9个不同的权重?这是我的疑惑(其实也可以理解为8个方向,8种扩散方式)
  3. 最后一个max_of_8_tensor的问题,直接取最大的深度值完全不能理解…… 如果说立体匹配里头取最大的为了最终输出的概率高?(参考GANet,其实也不太理解……),,深度估计/深度补全 怎么说也得加一路置信度吧,选传播之后置信度最高的,我觉得还能说得过去。 不知道大佬们怎么看,感谢~
bolimath commented 5 years ago

@dontLoveBugs 能不能分享和更新一下你修改后的版本呢?

yanyq1990 commented 5 years ago

现在还有没有人在用CSPN玩stereo?

sunlibocs commented 5 years ago

现在还有没有人在用CSPN玩stereo?

我也在看这个代码,一起交流?

sunlibocs commented 5 years ago

作者提供的代码从某种意义上确实有作用,不过我们根据论文重写了代码,效果提升了很多。

效果有提升是指用的现在git上这个最新的代码?还是说用的另外的版本呀

yanyq1990 commented 5 years ago

现在还有没有人在用CSPN玩stereo?

我也在看这个代码,一起交流?

我的邮箱yanyq1990@foxmail.com,我用CSPN尝试Stereo多次,一直没有好的效果,最后的视差图基本上都比原本的更模糊

sunlibocs commented 5 years ago

现在还有没有人在用CSPN玩stereo?

我也在看这个代码,一起交流?

我的邮箱yanyq1990@foxmail.com,我用CSPN尝试Stereo多次,一直没有好的效果,最后的视差图基本上都比原本的更模糊

好的。写了个邮件给你

yanyq1990 commented 5 years ago

你也是用CSPN做Stereo吗?现在关于CSPN的代码都是做深​度补全的,我觉得起作用的应该是这句代码:

result_depth = (1 - sparse_mask) result_depth.clone() + sparse_mask sparse_depth

但是在stereo中,我发现不同的guidance对最后的结果影响很大,并不像原作者所说的,简单的卷积就可以,而且CSPN的作用都是模糊视差图。 我试过原作者之前的选择八个方向中的max_tensor,效果不仅是模糊视差,同时也会突出边缘(高亮),也试过现在刚更新的那个版本,没有突出边缘的效果了,但是模糊的情况还是在。


sunlibocs commented 5 years ago

你也是用CSPN做Stereo吗?现在关于CSPN的代码都是做深​度补全的,我觉得起作用的应该是这句代码: result_depth = (1 - sparse_mask) result_depth.clone() + sparse_mask sparse_depth 但是在stereo中,我发现不同的guidance对最后的结果影响很大,并不像原作者所说的,简单的卷积就可以,而且CSPN的作用都是模糊视差图。 我试过原作者之前的选择八个方向中的max_tensor,效果不仅是模糊视差,同时也会突出边缘(高亮),也试过现在刚更新的那个版本,没有突出边缘的效果了,但是模糊的情况还是在。

作者更新了代码,eight_way_propagation中将原来的2D卷积换成了Conv3d,有没有人能解释一下这个变换?而且前面代码guidance中得到了12个通道,最后eight_way_propagation只用到了八个...

yanyq1990 commented 5 years ago

你也是用CSPN做Stereo吗?现在关于CSPN的代码都是做深​度补全的,我觉得起作用的应该是这句代码: result_depth = (1 - sparse_mask) result_depth.clone() + sparse_mask sparse_depth 但是在stereo中,我发现不同的guidance对最后的结果影响很大,并不像原作者所说的,简单的卷积就可以,而且CSPN的作用都是模糊视差图。 我试过原作者之前的选择八个方向中的max_tensor,效果不仅是模糊视差,同时也会突出边缘(高亮),也试过现在刚更新的那个版本,没有突出边缘的效果了,但是模糊的情况还是在。

作者更新了代码,eight_way_propagation中将原来的2D卷积换成了Conv3d,有没有人能解释一下这个变换?而且前面代码guidance中得到了12个通道,最后eight_way_propagation只用到了八个...

Conv3d的kernel_size=1,其实是相当于把八个方向的累加起来了,我觉得作者应该是想根据文章的那个公式修改代码的,但是我觉得按照文章,应该先对八个方向的权重做L1正则化,再把中间的a,b=0的权重也计算出来,计算九个位置的累加值

yanyq1990 commented 5 years ago

@sunlibocs Selection_048

sunlibocs commented 5 years ago

@sunlibocs Selection_048 我理解的是代码里面最后的到的结果H(i,j) = ( w1H(i,j) + w2H(i,j) + w3H(i,j) + w4H(i,j) + w5H(i,j) + w6H(i,j) + w7H(i,j) + w8H(i,j) ) 除以 (w1+w2+w3+w4+w5+w6+w7+w8),说白了只是H(i,j)本身和八个权重在做运算,但是你贴的那个论文里面的公式1意思是个卷积,也就是H(i,j)的值由它周围八个相邻的位置加上自身加权得到,所以存在出入。不知道理解的对不对?

yanyq1990 commented 5 years ago

我理解的是代码里面最后的到的结果H(i,j) = ( w1_H(i,j) + w2_H(i,j) + w3_H(i,j) + w4_H(i,j) + w5_H(i,j) + w6_H(i,j) + w7_H(i,j) + w8_H(i,j) ) 除以 (w1+w2+w3+w4+w5+w6+w7+w8),说白了只是H(i,j)本身和八个权重在做运算,但是你贴的那个论文里面的公式1意思是个卷积,也就是H(i,j)的值由它周围八个相邻的位置加上自身加权得到,所以存在出入。不知道理解的对不对?

不是的,你注意代码里面的nn.ZeroPad2d,这是在给weight和H做偏移,往八个不同方向偏移了,所以作者最新的代码,是八个方向的卷积操作,唯独少了a,b=0的

sunlibocs commented 5 years ago

我理解的是代码里面最后的到的结果H(i,j) = ( w1_H(i,j) + w2_H(i,j) + w3_H(i,j) + w4_H(i,j) + w5_H(i,j) + w6_H(i,j) + w7_H(i,j) + w8_H(i,j) ) 除以 (w1+w2+w3+w4+w5+w6+w7+w8),说白了只是H(i,j)本身和八个权重在做运算,但是你贴的那个论文里面的公式1意思是个卷积,也就是H(i,j)的值由它周围八个相邻的位置加上自身加权得到,所以存在出入。不知道理解的对不对?

不是的,你注意代码里面的nn.ZeroPad2d,这是在给weight和H做偏移,往八个不同方向偏移了,所以作者最新的代码,是八个方向的卷积操作,唯独少了a,b=0的

仔细看了一下,是我看漏了,新代码确实是你说的这样加了偏移。因为没有训练代码,想知道你用这个新的代码训练出作者的效果了吗?

yanyq1990 commented 5 years ago

我理解的是代码里面最后的到的结果H(i,j) = ( w1_H(i,j) + w2_H(i,j) + w3_H(i,j) + w4_H(i,j) + w5_H(i,j) + w6_H(i,j) + w7_H(i,j) + w8_H(i,j) ) 除以 (w1+w2+w3+w4+w5+w6+w7+w8),说白了只是H(i,j)本身和八个权重在做运算,但是你贴的那个论文里面的公式1意思是个卷积,也就是H(i,j)的值由它周围八个相邻的位置加上自身加权得到,所以存在出入。不知道理解的对不对?

不是的,你注意代码里面的nn.ZeroPad2d,这是在给weight和H做偏移,往八个不同方向偏移了,所以作者最新的代码,是八个方向的卷积操作,唯独少了a,b=0的

仔细看了一下,是我看漏了,新代码确实是你说的这样加了偏移。因为没有训练代码,想知道你用这个新的代码训练出作者的效果了吗?

我没训练这个代码,我用CSPN做stereo,之前想尝试作者说的那个PSMNet的,但是那个输入3D CSPN的张量太大,而且要做26个方向的卷积,参数太多,GPU跑不起来,现在用StereoNet模型修改,把CSPN替换StereoNet优化视差部分,但是效果非常差

sunlibocs commented 5 years ago

我理解的是代码里面最后的到的结果H(i,j) = ( w1_H(i,j) + w2_H(i,j) + w3_H(i,j) + w4_H(i,j) + w5_H(i,j) + w6_H(i,j) + w7_H(i,j) + w8_H(i,j) ) 除以 (w1+w2+w3+w4+w5+w6+w7+w8),说白了只是H(i,j)本身和八个权重在做运算,但是你贴的那个论文里面的公式1意思是个卷积,也就是H(i,j)的值由它周围八个相邻的位置加上自身加权得到,所以存在出入。不知道理解的对不对?

不是的,你注意代码里面的nn.ZeroPad2d,这是在给weight和H做偏移,往八个不同方向偏移了,所以作者最新的代码,是八个方向的卷积操作,唯独少了a,b=0的

仔细看了一下,是我看漏了,新代码确实是你说的这样加了偏移。因为没有训练代码,想知道你用这个新的代码训练出作者的效果了吗?

我没训练这个代码,我用CSPN做stereo,之前想尝试作者说的那个PSMNet的,但是那个输入3D CSPN的张量太大,而且要做26个方向的卷积,参数太多,GPU跑不起来,现在用StereoNet模型修改,把CSPN替换StereoNet优化视差部分,但是效果非常差 另一个疑惑是作者代码中guidance下面这个输出是12个通道的,但是后面好像只用到了8个,不是太明白这是个什么原因? self.gud_up_proj_layer6 = self._make_gud_up_conv_layer(Simple_Gudi_UpConv_Block_Last_Layer, 64, 12, 228, 304)

以及作者应该会出一个CSPN stereo吧,好像拓展投PAMI了