使用flownet2进行flow warping error的计算

最近在做video inpainting相关的工作,其中的测试指标E_{warp}需要利用FlowNet2进行计算。为此我花费了很长时间进行环境配置和代码调试,最后发现走了很多弯路,所以记录一下~

首先follow一些最近的video inpainting的开源代码(包括flow-based warping error的计算,下面有不清楚的地方,在这两个代码里面都能找到答案):

Free-Form-Video-Inpainting

fast_blind_video_consistency

还有flownet2的开源代码:

flownet2-pytorch

环境配置

首先明确flownet2的使用目的——仅仅只是计算流,那么只需要满足这个目的即可。

将上述计算E_{warp}的开源代码中的存放flownet2的文件替换成flownet2的开源代码中master分支下的内容。然后进行小小的改动,也可以直接下载修改好的代码,来自这个博客:

flownet2-cuda11


我们仅需要模型部分,也就是以下两部分:

然后简单修改相互之间的导入路径即可。


接着直接安装环境:

 准备工作就结束了!


下面列出相关的一些版本号:

使用flownet2进行flow warping error的计算_第1张图片  

(不建议使用其他分支的代码,需要与之匹配的pytorch,torchvision,cuda,cudnn版本。。哪怕所有的环境都匹配上,也可能跟其他部分的代码不兼容)

使用flownet2进行flow warping error的计算_第2张图片

 损失计算

首先导入预训练好的模型:

from networks.models import FlowNet2 as FlowNetWrapper
self.flownet = FlowNetWrapper(self.args).to(device)
checkpoint = torch.load(self.flownet_checkpoint_path)
self.flownet.load_state_dict(checkpoint['state_dict'])

计算视频前后帧之间的流信息:

flows = self.flownet(input).to(device)
warped_targets = warp_optical_flow(targets[:, :-1], -flows).detach()
warped_outputs = warp_optical_flow(outputs[:, :-1], -flows).detach()
non_occlusion_masks = self._get_non_occlusion_mask(targets, warped_targets)

 最后通过L2-loss计算损失:

class L2LossMaskedMean(nn.Module):
    def __init__(self, reduction='sum'):
        super().__init__()
        self.l2 = nn.MSELoss(reduction=reduction)

    def forward(self, x, y, mask):
        masked = 1 - mask
        l2_sum = self.l2(x * masked, y * masked)
        return l2_sum / torch.sum(masked)

你可能感兴趣的:(pytorch,flownet2,pytorch,深度学习)