基于RIFE的光流估计

news2024/11/15 7:51:38

文章目录

  • 概要
  • 权重下载
  • 光流估计
  • 结果预览

概要

RIFE,一种用于视频帧插值(VFI)的实时中间流估计算法。许多最近基于流动的VFI方法首先估计双向光流,然后将它们缩放和反转为近似的中间流,从而导致运动边界和复杂管道上的伪影。RIFE使用一个名为IFNet的神经网络,该神经网络可以直接估计从粗到细的中间流量,速度要快得多。我们设计了一种用于训练 IFNet 的特权蒸馏方案,从而大大提高了性能。RIFE 不依赖于预训练的光流模型,并且可以支持使用时间编码输入进行任意时间步长帧插值。实验表明,RIFE 在几个公共基准测试中实现了最先进的性能。与流行的 SuperSlomo 和 DAIN 方法相比,RIFE 快 4–27 倍,产生更好的结果。该代码可在 https://github.com/hzwer/arXiv2020-RIFE 上找到。

权重下载

https://drive.google.com/file/d/147XVsDXBfJPlyct2jfo9kpbL944mNeZr/view?usp=sharing

光流估计

import torch
from torch.nn import functional as F
from model.RIFE import Model
import warnings
warnings.filterwarnings("ignore")
import argparse
import cv2
from utils.flow_viz import flow_to_image
import matplotlib.pyplot as plt
import os
import glob
import tqdm

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
torch.set_grad_enabled(False)
if torch.cuda.is_available():
    torch.backends.cudnn.enabled = True
    torch.backends.cudnn.benchmark = True


def viz(img1, img2, flo, outPath):
    # img1 = img1[0].permute(1,2,0).cpu().numpy()
    # img2 = img2[0].permute(1,2,0).cpu().numpy()
    flo = flo[0].permute(1,2,0).cpu().numpy()
    
    # map flow to rgb image
    flo = flow_to_image(flo)
    
    fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(20, 4))
    ax1.set_title('input image1')
    ax1.imshow(img1.astype(int))
    ax2.set_title('input image2')
    ax2.imshow(img2.astype(int))
    ax3.set_title('estimated optical flow')
    ax3.imshow(flo)
    # plt.show()
    plt.savefig(outPath, bbox_inches='tight')  # 'optical_flow_comparison.png' 可以替换为您想要的文件名
    plt.close()

if __name__ == "__main__":
    model = Model(arbitrary=True)
    model.load_model('RIFE_m_train_log')
    model.eval()
    model.device()

    images = glob.glob(os.path.join("../dataset", '*.png')) + \
                 glob.glob(os.path.join("../dataset", '*.jpg'))

    images = sorted(images)
    for i, (imfile1, imfile2) in tqdm.tqdm(enumerate(zip(images[:-1], images[1:]))):
        
        img0_ = cv2.imread(imfile1, cv2.IMREAD_UNCHANGED)
        img1_ = cv2.imread(imfile2, cv2.IMREAD_UNCHANGED)
        img0 = torch.from_numpy(img0_.copy()).permute(2, 0, 1) / 255.0
        img1 = torch.from_numpy(img1_.copy()).permute(2, 0, 1) / 255.0

        img = torch.cat((img0, img1), 0).to(torch.float).unsqueeze(0).cuda()

        n, c, h, w = img.shape
        ph = ((h - 1) // 32 + 1) * 32
        pw = ((w - 1) // 32 + 1) * 32
        padding = (0, pw - w, 0, ph - h)
        img = F.pad(img, padding)

        # print(f"img size {img.size()}")
        with torch.no_grad():
            flow = model.flownet(img, timestep=1.0, returnflow=True)[:, :2] # will get flow1->0
            # flow = flow[0].permute(1,2,0).cpu().numpy()
            print(f"flow size : {flow.size()}")

        viz(img0_, img1_, flow, f"{i}_.png")

结果预览

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python之海龟绘图绘制国旗

海龟绘图绘制国旗 步骤: 背景底色大五角星5个小五角星 import turtle#1. draw_rectangle 函数用于绘制矩形,用于国旗的背景。 def draw_rectangle(color, x, y, width, height):turtle.penup()turtle.goto(x, y)turtle.pendown()turtle.color(color)tu…

如何量化管理研发团队的技术债务?

在探讨技术债的成因之前,我们需要澄清一些关于技术债起因和本质的普遍误解。 误解一:技术债务等同于劣质代码 那么,什么构成了所谓的「劣质代码」? 所谓的好代码,可能是指那些整洁、不会在未来限制你决策的代码&…

LearnOpenGL——法线贴图、视差贴图学习笔记

LearnOpenGL——法线贴图、视差贴图学习笔记 法线贴图 Normal Mapping一、基本概念二、切线空间1. TBN矩阵2. 切线空间中的法线贴图 三、复杂模型四、小问题 视差贴图 Parallax Mapping一、基本概念二、实现视差贴图三、陡峭视差映射 Steep Parallax Mapping四、视差遮蔽映射 P…

HexView 刷写文件脚本处理工具-命令行介绍(四)-地址范围缩减(/AR:‘range‘)

地址范围缩减(/AR:‘range’) 此选项可以限制加载到内存中的数据范围。 如果只想在 HexView 中处理数据的缩减范围,这将非常有用。 通过其块开始地址和长度来指定地址范围,地址和长度由逗号分隔。也可以使用开始地址和结束地址来指定范围。 然后,这两个值必须由‘-’分…

继承的多种方式

1. 原型链继承 function Parent() {this.name "xiaohong"; } Parent.prototype.getName function () {console.log(this.name); };function Child() {}Child.prototype new Parent();const child new Child(); child.getName(); console.log(child.name);引用类…

带你速通C语言——指针(10)

指针是C语言中最强大但也最容易引起困惑的概念之一。它们直接关联内存管理,使得程序员可以高效地操作数据和内存。下面我将尽量以简单明了的方式介绍指针的基本概念。 1.指针基础 指针本质上是存储内存地址的变量,这个地址指向一个值。通过指针&#xf…

STM32 PWR电源控制 与 低功耗模式 详解

目录 STM32 PWR电源控制 与 低功耗模式 详解 1. PWR 电源控制 简介 2. PWR 电源控制 框图 3. 上电复位和掉电复位 与 可编程电压检测器(PVD) 3.1 内嵌复位与电源控制模块特性图 3.2 上电复位和掉电复位 3.3 可编程电压检测器(PVD&…

蚁群算法原理与实战(Python、MATLAB、C++)

蚁群算法 1.蚁群算法来源 蚁群算法(Ant Colony Optimization,简称ACO)是一种模拟自然界中蚂蚁寻找食物路径行为的优化算法,主要用于解决组合优化问题。它的灵感来源于意大利学者Marco Dorigo在1992年提出的蚂蚁系统模型。 蚁群算…

脑网络相似性:方法与应用

摘要 图论方法已被证明是理解、表征和量化复杂大脑网络的有效工具。然而,定量比较两个图形的方法却较少受到关注。在一些网络神经科学应用中,比较大脑网络确实是必不可少的。在这里,本研究讨论了近年来用于比较大脑网络的技术现状、挑战以及…

Android常见界面控件(二)

目录 前言 一、 RadioButton控件 设置RadioGroup的监听事件 二、CheckBox控件 三、Toast类 改变Toast窗口的提示位置 前言 在上一篇中,我们讲解了三个常见的控件:TextView控件、Button控件、ImageView控件,那么本篇我们就接着讲剩下的…

Selenium实战:深度解析Python中嵌套Frame与iFrame的定位与切换技巧,解决Selenium定位不到的问题

在Web自动化测试中,处理网页中的Frame和iFrame是常见的挑战之一。这些元素在网页中扮演着承载独立HTML文档的角色,使得直接定位或操作其中的元素变得复杂。Python的Selenium库提供了强大的工具来应对这些挑战,本文将详细介绍如何使用Selenium…

SFP光模块、gt口、PMD、PMA、PCS之间的关系

ZYNQ内部的GT(高速收发器)接口包含了PCS(物理编码子层)与PMA(物理介质接入层)。这两个层在高速数据传输中起着至关重要的作用。 PCS层(物理编码子层) PCS层位于协调子层&#xff0…

Ubuntu虚拟机服务器的搭建

01.VMware安装 略。 02.Ubuntu虚拟机安装 略。 03.配置Ubuntu虚拟机网络 参考视频: Ubutu虚拟机网络配置(桥接)https://www.bilibili.com/video/BV1bG411V72A/?spm_id_from333.999.0.0&vd_sourced1fd4bcc46805ab35cc8bbb5a8bf318f…

win11如何查看串口的名字

1、右击win然后点击设备管理器 2、点击端口然后右击串口点击属性 3、进入窗口后点击Port information即可看见Port name属性就是串口名字

uniapp/vue如何实现一个子表单及子表单作用

子表单是一个辅助表单或一个表,它允许在主表单中添加多个行式项目,以处理与主记录相关联的多个辅助项目或数据。子表单在多种应用场景中发挥着重要作用,特别是在需要处理一对多关系的数据时。 以下是对子表单的详细解析: 定义与特…

苍穹外卖day10

苍穹外卖day10 Spring Task订单状态定时处理WebSocket应用(弹幕,网页聊天,体育实况更新,股票基金实时更新) 来单题型代码实现需求分析 客户催单 Spring Task 链接: 在线生成器 在线生成器 订单状态定时处理 每分钟检…

木舟0基础学习Java的第二十五天(JavaWeb)

XML 概念和体系 XML指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09; XML没有预定义标签 需要自定义标签 <标签></标签> XML特点 XML数据以纯文本格式存储 实现不同应用程序之间的数据通信 实现不同平台的数据通信 实现不同平台的数据共…

Linux------Cortex-A架构的处理器运行模型与其寄存器组

寄存器组分为 外设寄存器组 比如&#xff1a;和总线相连的io寄存器&#xff0c;usart配置寄存器&#xff0c;spi配置寄存器等等 内核寄存器组&#xff1a;R0-R15 CPSR SPSR一共18个寄存器组&#xff0c;内核寄存器组用来记录当前程序地址状态&#xff0c;当前执行指令等&a…

8月来得及|1000/660/880题45天带刷计划!

刷题不在于多&#xff0c;而在于精 你选的这几本题集没有问题&#xff0c;660题专门训练客观题&#xff0c;880题和1000题都是不错的综合性题集&#xff0c;特别适合在强化阶段进行刷题训练&#xff0c;但是问题是你做这么多题&#xff0c;也不一定能起到多好的作用。 刷题的…

Linux | 进程概念详解:冯诺依曼体系结构、进程基本概念、PCB、进程组织、fork()创建子进程、进程运行逻辑

文章目录 进程概念1、冯诺依曼体系结构2、进程2.1基本概念2.2描述进程-PCB2.3组织进程2.4查看进程2.5通过系统调用获取进程标识符2.6通过系统调用创建进程-fork初识头文件与返回值fork函数的调用逻辑和底层逻辑 进程概念 1、冯诺依曼体系结构 目前我们认识的计算机中&#xff…