最近在做video inpainting相关的工作,其中的测试指标需要利用FlowNet2进行计算。为此我花费了很长时间进行环境配置和代码调试,最后发现走了很多弯路,所以记录一下~
首先follow一些最近的video inpainting的开源代码(包括flow-based warping error的计算,下面有不清楚的地方,在这两个代码里面都能找到答案):
Free-Form-Video-Inpainting
fast_blind_video_consistency
还有flownet2的开源代码:
flownet2-pytorch
首先明确flownet2的使用目的——仅仅只是计算流,那么只需要满足这个目的即可。
将上述计算的开源代码中的存放flownet2的文件替换成flownet2的开源代码中master分支下的内容。然后进行小小的改动,也可以直接下载修改好的代码,来自这个博客:
flownet2-cuda11
我们仅需要模型部分,也就是以下两部分:
然后简单修改相互之间的导入路径即可。
接着直接安装环境:
准备工作就结束了!
下面列出相关的一些版本号:
(不建议使用其他分支的代码,需要与之匹配的pytorch,torchvision,cuda,cudnn版本。。哪怕所有的环境都匹配上,也可能跟其他部分的代码不兼容)
首先导入预训练好的模型:
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)