FlowNet2 torch 代码运行经验

本文档记录了在NVIDIA提供的FlowNet2 PyTorch实现中运行和优化代码的经验。主要内容包括环境配置、权重文件下载、Stintel数据集获取、多GPU运行注意事项、数据集特征提取以及.flow文件可视化方法。适合对深度学习和光流估计感兴趣的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FlowNet2是目前最流行的网络,原文中使用的是CAFFE进行训练的网络。在GITHUB上最火的是NIVDIA官方给出的torch代码。运行的时候需要一些操作技巧,对于linux小白的我,可能不太友好,在这记录一下。

NIVDIA官方代码

https://github.com/NVIDIA/flownet2-pytorch

运行环境要求

由于是NIVDIA官方给出的网络,程序代码都封装的比较好了,主要通过main.py的参数,既可以实现网络的各类调整。
首先操作系统的运行环境最好是Linux,因为其中不少代码写成的.sh。windows需要git

python3
numpy
PyTorch ( == 0.4.1, for <= 0.4.0 see branch python36-PyTorch0.4)
scipy
scikit-image
tensorboardX
colorama, tqdm, setproctitle

代码下载

# get flownet2-pytorch source
git clone https://github.com/NVIDIA/flownet2-pytorch.git
cd flownet2-pytorch

# install custom layers
bash install.sh

下载权重文件

网址上给出了好几个pre-trained网络的weight,大家无法可科学上网下载权重的,从如下百度网盘中下载

链接: https://pan.baidu.com/s/1aiKc80Q-DI4p3MVODcPsyQ 提取码: apz9

主要用到的就是FlowNet2这个文件
在这里插入图片描述

Stintel数据集下载

http://sintel.is.tue.mpg.de/

运行main.py

测试数据(inference)

python main.py --inference --model FlowNet2 --save_flow --inference_dataset ImagesFromFolder --resume ./checkpoints/FlowNet2_checkpoint.pth.tar --save ./output --inference_dataset_root ./MPI-Sintel-complete/test/clean/wall

除了以上的初始化参数外,还有几个参数这里也介绍一下:

number_gpus

之前用单GPU的电脑时没有发现问题,最近用4*GPU时发现输出的.flo会除以4,去issue上看也有人提出问题,但是没有人解答。所以在使用多GPU时记得将其改为1

inference_dataset_iext

这里需要根据输入图像的后缀格式定义,比如png,jpg等

inference_visualize

同步可以输出png格式的可视化图

修改输出.flo图像大小

由于.flo格式的数据相对很大,比如一个[1280, 720]尺寸的.flo图像居然有7+M。而输入到网络中的图像尺寸为[224, 398],因此对utils.frame_util中利用resize模块进行相应修改如下:

import numpy as np
from os.path import *
#from scipy.misc import imread
from imageio import imread
from . import flow_utils 
import cv2

def read_gen(file_name)
### 获取并使用Flownet预训练模型 对于希望利用已有的研究成果快速实现光学流估计的应用场景而言,获取预先训练好的Flownet模型是一种高效的方式。针对不同版本的Flownet及其变体,存在多种途径来获得这些预训练模型。 #### 使用官方提供的预训练权重文件 LiteFlowNet作者提供了经过充分训练后的网络参数,可以直接下载用于测试或进一步微调。具体来说,在论文《LiteFlowNet: A Lightweight Convolutional Neural Network for Optical Flow Estimation》中提到该模型已经在MPI Sintel数据集上进行了训练[^1]。访问原始GitHub仓库可以找到相应的链接以下载所需的.pth格式的权重文件[^2]。 #### 利用第三方重现实现中的资源 除了官方发布的资料外,《A Reimplementation of LiteFlowNet Using PyTorch》一文中描述了一个基于PyTorch框架重新构建的轻量化光流估计算法——PyTorch-LiteFlowNet,并且该项目同样包含了可以在多个公开数据集(如FlyingChairs, FlyingThings3D等)上训练得到的结果保存下来作为初始加载点供其他研究者参考和继续开发之用。通过克隆此项目的Git库即可轻松获取到一系列可用作迁移学习基础的checkpoint文件。 ```bash git clone https://github.com/sniklaus/pytorch-liteflownet.git cd pytorch-liteflownet/networks/ wget http://content.sniklaus.com/github/pytorch-liteflownet/network-default.pytorch ``` 上述命令展示了如何从指定位置拉取整个项目以及特定于默认配置下的预训练模型。 #### 应用预训练模型执行推理过程 一旦获得了合适的预训练模型之后,则可以通过编写简单的Python脚本来读入图像序列并对它们之间发生的运动情况进行分析: ```python import torch from networks import Network '假设这是定义了神经网络结构的一个模块' # 加载预训练模型 model = Network().cuda() state_dict = {str.replace(k,'module.',''):v for k,v in torch.load('network-default.pytorch').items()} model.load_state_dict(state_dict) def estimate_optical_flow(image_pair): tensorFirst = torch.FloatTensor(numpy.array(image_pair[0])[:, :, ::-1].transpose(2, 0, 1).astype(float) / 255.0) tensorSecond = torch.FloatTensor(numpy.array(image_pair[1])[:, :, ::-1].transpose(2, 0, 1).astype(float) / 255.0) intWidth = image_pair[0].shape[1] intHeight = image_pair[0].shape[0] tensorPreprocessedFirst = tensorFirst.cuda().view(1, 3, intHeight, intWidth) tensorPreprocessedSecond = tensorSecond.cuda().view(1, 3, intHeight, intWidth) output_tensor = model(tensorPreprocessedFirst, tensorPreprocessedSecond)[0] return output_tensor.data.cpu().numpy() image_pair = (first_image, second_image) # 假设这里已经准备好了两张连续帧图片 optical_flow_result = estimate_optical_flow(image_pair) print(optical_flow_result.shape) # 输出形状应类似于(height,width,2),表示每个像素处的速度向量场 ``` 这段代码片段说明了怎样实例化一个卷积神经网络对象并将之前下载下来的参数赋给它;接着定义了一个辅助函数`estimate_optical_flow()`用来接收一对输入图像并返回由算法预测出来的稠密光流图谱。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值