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

关于eight_way_propagation的一些问题 #2

Open
yellowYuga opened this issue Jan 9, 2019 · 33 comments
Open

关于eight_way_propagation的一些问题 #2

yellowYuga opened this issue Jan 9, 2019 · 33 comments

Comments

@yellowYuga
Copy link

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

@yellowYuga
Copy link
Author

您好:
这是我跟据原文写的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
Copy link

guandog commented Jan 11, 2019

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

@yellowYuga
Copy link
Author

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

你是做的depth completion 还是 stereo

@dontLoveBugs
Copy link
Owner

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

@guandog
Copy link

guandog commented Jan 15, 2019

我做的是stereo

@ArcherFMY
Copy link

@dontLoveBugs 您好,

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

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

@yellowYuga
Copy link
Author

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

@dontLoveBugs
Copy link
Owner

@dontLoveBugs 您好,

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

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

不是,新版本没有提交

@yellowYuga
Copy link
Author

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

@guandog
Copy link

guandog commented Jan 24, 2019

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

@ghost
Copy link

ghost commented Feb 23, 2019

楼上各位大佬 @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
Copy link
Owner

楼上各位大佬 @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
Copy link
Author

楼上各位大佬 @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
Copy link

ghost commented Feb 23, 2019

楼上各位大佬 @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
Copy link
Author

楼上各位大佬 @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
Copy link

ghost commented Feb 25, 2019

@Sarah20187
Copy link

Sarah20187 commented Feb 25, 2019

@longyangqi
Copy link

楼上各位大佬 @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
Copy link

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

@yanyq1990
Copy link

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

@sunlibocs
Copy link

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

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

@sunlibocs
Copy link

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

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

@yanyq1990
Copy link

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

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

我的邮箱[email protected],我用CSPN尝试Stereo多次,一直没有好的效果,最后的视差图基本上都比原本的更模糊

@sunlibocs
Copy link

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

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

我的邮箱[email protected],我用CSPN尝试Stereo多次,一直没有好的效果,最后的视差图基本上都比原本的更模糊

好的。写了个邮件给你

@yanyq1990
Copy link

yanyq1990 commented Jun 19, 2019 via email

@sunlibocs
Copy link

你也是用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
Copy link

你也是用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
Copy link

@sunlibocs
Selection_048

@sunlibocs
Copy link

@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
Copy link

我理解的是代码里面最后的到的结果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
Copy link

我理解的是代码里面最后的到的结果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
Copy link

我理解的是代码里面最后的到的结果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
Copy link

我理解的是代码里面最后的到的结果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了

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

9 participants