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

some question #11

Open
zhh99 opened this issue Oct 31, 2021 · 10 comments
Open

some question #11

zhh99 opened this issue Oct 31, 2021 · 10 comments

Comments

@zhh99
Copy link

zhh99 commented Oct 31, 2021

1.stage1中的LR与Ref↓大小不应该都是40x40吗,为什么图中画的不一样大
2.后两层索引图Dk的尺寸小于x2,x4参考特征的大小,怎么根据Dk取这些尺寸不一致的参考特征中取特征
3.dilation=1就是patch=3x3吗
4。LR先变成LR_down,再变回LR进行后续处理的意义是什么

@SkyeLu
Copy link
Collaborator

SkyeLu commented Nov 1, 2021

  1. 只是在训练过程中LR和Ref↓大小相同,但测试时并不一定,这么画是为了体现更general的cases。
  2. 具体参考这部分code:
    warp_ref_patches_x1 = self.transfer(ref_patches_x1, index_all, soft_att_all,
    ks=self.psize, pd=self.psize // 2, stride=1) # [N*py*px, C, k_y, k_x]
    warp_ref_patches_x2 = self.transfer(ref_patches_x2, index_all, soft_att_all,
    ks=self.psize * 2, pd=self.psize // 2 * 2, stride=2) # [N*py*px, C, k_y*2, k_x*2]
    warp_ref_patches_x4 = self.transfer(ref_patches_x4, index_all, soft_att_all,
    ks=self.psize * 4, pd=self.psize // 2 * 4, stride=4) # [N*py*px, C, k_y*4, k_x*4]
    针对不同大小的参考特征,会对kernel size,stride做相应调整。例如,若x1的patch大小为3x3,则对于x2的参考特征,我们会将其切为6x6,且stride设为2,这样一来产生的patch数就会与x1的patch数相同。
  3. 是的
  4. 并没有对LR进行downsample。

@zhh99
Copy link
Author

zhh99 commented Nov 9, 2021

  1. 只是在训练过程中LR和Ref↓大小相同,但测试时并不一定,这么画是为了体现更general的cases。
  2. 具体参考这部分code:
    warp_ref_patches_x1 = self.transfer(ref_patches_x1, index_all, soft_att_all,
    ks=self.psize, pd=self.psize // 2, stride=1) # [N*py*px, C, k_y, k_x]
    warp_ref_patches_x2 = self.transfer(ref_patches_x2, index_all, soft_att_all,
    ks=self.psize * 2, pd=self.psize // 2 * 2, stride=2) # [N*py*px, C, k_y*2, k_x*2]
    warp_ref_patches_x4 = self.transfer(ref_patches_x4, index_all, soft_att_all,
    ks=self.psize * 4, pd=self.psize // 2 * 4, stride=4) # [N*py*px, C, k_y*4, k_x*4]

    针对不同大小的参考特征,会对kernel size,stride做相应调整。例如,若x1的patch大小为3x3,则对于x2的参考特征,我们会将其切为6x6,且stride设为2,这样一来产生的patch数就会与x1的patch数相同。
  3. 是的
  4. 并没有对LR进行downsample。

Thank you very much for your reply.
我还有个疑惑:
self.ref_down_block_size = 1.5与
image
我理解的是12x12,这两个对应不上;
另外,Ref↓ block的大小不应该和LR Block的大小(8x8)一样吗,不然patch怎么一一对应

@SkyeLu
Copy link
Collaborator

SkyeLu commented Nov 11, 2021

Hi,文中的block和patch是两个不一样的概念,patch是从block中取的。Ref↓ block的大小可以与LR Block的大小不一样,但Ref↓ patch的大小是需要与LR patch的大小一样的(比如都是3x3)。具体见正文的Fig.3,淡蓝色实线框为block(当然文中LR block可能跟Ref↓ block画成一样大小了,但实际可以不一样大小),其他颜色虚线框为patch,计算correlation是patch之间相互计算,只需要保持patch大小一样就可以。

@zhh99
Copy link
Author

zhh99 commented Nov 11, 2021

谢谢!可是Ref↓的3x3patch是从Ref↓ Block中取得,ref_down_block_size = 1.5,怎么从1.5x1.5中取3x3?我看代码中的reflr_patches大小为15x15,是1.5变换来的,为什么不直接设置ref_down_block_size=15,这个地方不太明白。

@SkyeLu
Copy link
Collaborator

SkyeLu commented Nov 11, 2021

首先我们设置了lr_block_size=8,ref_down_block_size = 1.5(这里的1.5并不是表示实际block大小,而是表示成了比例的形式,代码可能写得没有太简洁直观以至于造成了你的误解)。
那么这里

px = w // self.lr_block_size

的计算结果是px=w_lr / 8。
再通过这一行
diameter_x = 2 * int(w // (2 * px) * self.ref_down_block_size) + 1

的计算,代入px=w_lr / 8,我们可以得到diameter_x=1.5*w_ref_down/px+1,即diameter_x=12*w_lr/w_ref_down+1(加1是为了让它为奇数,方便后续取中心patch)。

@zhh99
Copy link
Author

zhh99 commented Nov 11, 2021

好的,还想请教下,如果LR patch对应到的Ref↓ patch在边界,比如在左上角的3x3,那这时以这个patch为中心进行裁剪ref_down_block,会超出图像范围,这个问题怎么处理的,对应代码中哪一部分

@SkyeLu
Copy link
Collaborator

SkyeLu commented Nov 11, 2021

我们在crop patch之前先对block进行了padding(unfold函数中的padding参数),以保证不会出现这种情况。

reflr_patches = F.unfold(reflr, kernel_size=(ks, ks), padding=dilation, stride=stride, dilation=dilation) # [N, C*ks*ks, Hr*Wr]

@zhh99
Copy link
Author

zhh99 commented Nov 11, 2021

我们在crop patch之前先对block进行了padding(unfold函数中的padding参数),以保证不会出现这种情况。

reflr_patches = F.unfold(reflr, kernel_size=(ks, ks), padding=dilation, stride=stride, dilation=dilation) # [N, C*ks*ks, Hr*Wr]

可是padding后的大小是42x42,若以左上角3x3patch为中心取13x13的block,还是不够大,这里提到的以patch为中心裁剪block,不是这么理解的吗

@SkyeLu
Copy link
Collaborator

SkyeLu commented Nov 11, 2021

不好意思,上面的回答理解错你的意思了。超出图像边界的话,我们就只裁到图像边界:

mask = (idx_x1 < 0).long()
idx_x1 = idx_x1 * (1 - mask)
idx_x2 = idx_x2 * (1 - mask) + (diameter_x + 1) * mask
mask = (idx_x2 > Wr - 1).long()
idx_x2 = idx_x2 * (1 - mask) + (Wr - 1) * mask
idx_x1 = idx_x1 * (1 - mask) + (idx_x2 - (diameter_x + 1)) * mask
mask = (idx_y1 < 0).long()
idx_y1 = idx_y1 * (1 - mask)
idx_y2 = idx_y2 * (1 - mask) + (diameter_y + 1) * mask
mask = (idx_y2 > Hr - 1).long()
idx_y2 = idx_y2 * (1 - mask) + (Hr - 1) * mask
idx_y1 = idx_y1 * (1 - mask) + (idx_y2 - (diameter_y + 1)) * mask

比如这里的mask会把超出图像左边界的坐标置为0,右/上/下边界情况同理。不知道这是否回答了你的问题?

@zhh99
Copy link
Author

zhh99 commented Nov 11, 2021

非常感谢,明白了!

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

2 participants