Open yellowYuga opened 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可能为负数值的话会出错。
赞啊,我也发现原作者写的affinity matrix有问题。实验了一下,确实是你的版本收敛得更好一些
赞啊,我也发现原作者写的affinity matrix有问题。实验了一下,确实是你的版本收敛得更好一些
你是做的depth completion 还是 stereo
作者提供的代码从某种意义上确实有作用,不过我们根据论文重写了代码,效果提升了很多。
我做的是stereo
@dontLoveBugs 您好,
作者提供的代码从某种意义上确实有作用,不过我们根据论文重写了代码,效果提升了很多。
请问您说的效果提升了很多是用的这个repo的版本吗?
@guandog 不好意思问一下,有两个问题 第一个问题是这个 torch.div 会出现除数为0的情况,也就是abs_sum可能有0元素。 第二个问题是Stereo中 有用到max_of_8_tensor() operation吗,并不理解这个起什么作用。
@dontLoveBugs 您好,
作者提供的代码从某种意义上确实有作用,不过我们根据论文重写了代码,效果提升了很多。
请问您说的效果提升了很多是用的这个repo的版本吗?
不是,新版本没有提交
还有一个问题,按照文章中所说,我使用我的cspn,迭代了24次,然后很容易直接梯度爆炸。怎么样才能即迭代够24次又不会梯度爆炸
我把cspn加入到网络中,也遇到了不容易收敛的问题,有哪位大神知道如何解决这个问题吗
楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:
请诸位在百忙之中能帮忙提点一下,感激不尽!
楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:
- 我看他输出的guidance是一个b8h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
- 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
- 文中提到的iteration我本来的理解是从一个local的位置向8个方向扩撒若干次,例如从(3,3)的位置扩散3次,那么这个信息就扩散到了从左上角(0,0)到右下角(6,6)的矩形区域里,但是看代码的for loop他好像在用同样的guidance在原地连续作用了16次,这个是什么意图啊?
请诸位在百忙之中能帮忙提点一下,感激不尽!
我认为,CSPN作者的代码和论文有些出入,8个channel指的是向8个方向传播(和论文中的公式(1)有些出入);16就是扩算16次,每次迭代得到的result_depth是不同的,不是在原地作用。
楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:
- 我看他输出的guidance是一个b_8_h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
- 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
- 文中提到的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的作用,万分感激!
楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:
- 我看他输出的guidance是一个b_8_h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
- 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
- 文中提到的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时考虑了更远的邻域的结果,这两个我觉得不是一回事呀。求指点,万分感谢!
楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:
- 我看他输出的guidance是一个b_8_h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
- 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
- 文中提到的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 yangfengt666@gmail.com
@yellowYuga @yangfengt123 同求交流! 建了一个slack讨论组https://join.slack.com/t/the-github/shared_invite/enQtNTYxNDIzNjU3NzY3LTliNWZiMjg3NDc5ZDRlZmYwMDM1NTJhNzAwMDFkNWUzOThkMmZhZGNlODE4ZjYyMjRhYWUyMTY3YWZmMGFmMzQ
楼上各位大佬 @dontLoveBugs @yellowYuga @guandog @ArcherFMY ,有谁能讲讲这个eight_way_propagation到底是什么原理吗?我看原文中并没有对这部分的描述啊,以下是我疑惑的地方:
- 我看他输出的guidance是一个b_8_h*w的tensor这个8维的channel是什么含义啊,每维代表8领域中的一个吗,还是纯粹就是8个filter?
- 这个eight_way_propagation函数看上去是做了原文中Eq.1的计算,但是为什么他后面要加个max_of_8_tensor把8维最大的那个选出来作为result_depth啊?
- 文中提到的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 不知道现在问题完全理清楚了吗?以下是我对原代码的一点见解和疑惑,还请大佬们指点指点:
@dontLoveBugs 能不能分享和更新一下你修改后的版本呢?
现在还有没有人在用CSPN玩stereo?
现在还有没有人在用CSPN玩stereo?
我也在看这个代码,一起交流?
作者提供的代码从某种意义上确实有作用,不过我们根据论文重写了代码,效果提升了很多。
效果有提升是指用的现在git上这个最新的代码?还是说用的另外的版本呀
现在还有没有人在用CSPN玩stereo?
我也在看这个代码,一起交流?
我的邮箱yanyq1990@foxmail.com,我用CSPN尝试Stereo多次,一直没有好的效果,最后的视差图基本上都比原本的更模糊
现在还有没有人在用CSPN玩stereo?
我也在看这个代码,一起交流?
我的邮箱yanyq1990@foxmail.com,我用CSPN尝试Stereo多次,一直没有好的效果,最后的视差图基本上都比原本的更模糊
好的。写了个邮件给你
你也是用CSPN做Stereo吗?现在关于CSPN的代码都是做深度补全的,我觉得起作用的应该是这句代码:
result_depth = (1 - sparse_mask) result_depth.clone() + sparse_mask sparse_depth
但是在stereo中,我发现不同的guidance对最后的结果影响很大,并不像原作者所说的,简单的卷积就可以,而且CSPN的作用都是模糊视差图。 我试过原作者之前的选择八个方向中的max_tensor,效果不仅是模糊视差,同时也会突出边缘(高亮),也试过现在刚更新的那个版本,没有突出边缘的效果了,但是模糊的情况还是在。
你也是用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只用到了八个...
你也是用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的权重也计算出来,计算九个位置的累加值
@sunlibocs
@sunlibocs 我理解的是代码里面最后的到的结果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)的值由它周围八个相邻的位置加上自身加权得到,所以存在出入。不知道理解的对不对?
我理解的是代码里面最后的到的结果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的
我理解的是代码里面最后的到的结果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的
仔细看了一下,是我看漏了,新代码确实是你说的这样加了偏移。因为没有训练代码,想知道你用这个新的代码训练出作者的效果了吗?
我理解的是代码里面最后的到的结果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优化视差部分,但是效果非常差
我理解的是代码里面最后的到的结果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了
您好: 如同您在cspn里的issues所说,eight_way_propagation函数的实现与文章不符。最后您的实现是按照文章来的还是按照原来的代码来的,最后达到文章中的效果了吗?