一键智能视频编辑与视频修复算法——ProPainter源码解析与部署
前言
视频编辑和修复确实是随着电子产品的普及变得越来越重要的技能。有许多视频编辑工具可以帮助人们轻松完成这些任务如:Adobe Premiere Pro,Final Cut Pro X,Davinci Resolve,HitFilm Express,它们都提供一些视频修复功能,但并不适合没有太多专业技术的用户。
至于视频目标移除、水印移除、掩码补全和视频外扩等高级功能,通常需要使用更专业的图像处理工具,如Adobe After Effects或Adobe Photoshop,这些工具需要一定的学习曲线。
ProPainter是由南洋理工大学的S-Lab团队开发的一款视频智能修复算法,ProPainter完成:视频目标移除、视频水印移除、视频掩码补全、视频外扩等多个实用功能!
一、算法解析
1.项目地址
项目主页:https://shangchenzhou.com/projects/ProPainter/
论文链接:https://arxiv.org/abs/2309.03897
代码链接:https://github.com/sczhou/ProPainter
官方的项目效果:
视频目标移除/视频水印移除/视频掩码补全
如果项目git或者模型下载不下来,可以使用csdn上传好的资源:https://download.csdn.net/download/matt45m/88385370
2.视频修复
视频修复是一项任务,旨在通过填补缺失区域或移除不需要的内容,来修复视频中的损坏或缺失部分。这个领域可以分为两个主要方向:对象移除和对象补全。
- 对象移除(Object Removal):这是视频修复的一个重要方面,通常用于删除视频中的不需要的对象,如水印、不想显示的元素或干扰物体。传统方法可以使用纹理合成技术,而深度学习方法可以通过学习如何填充缺失区域来实现对象移除。
- 对象补全(Object Inpainting):对象补全是填补视频中缺失区域的过程,通常用于修复受损的视频帧或恢复损坏的部分。这对于修复老电影、修复损坏的监控录像或处理不完整的视频流非常有用。
在视频修复中,有两种主要的算法方法:传统方法和深度学习方法。传统方法依赖于纹理合成技术,它们通过从周围的视频帧中复制纹理信息来填补缺失区域。另一方面是深度学习方法,深度学习方法已经在视频修复中取得了显著的进展。生成对抗网络(GANs)、变分自编码器(VAEs)和Transformer等神经网络架构已被广泛应用于视频修复任务。这些方法可以自动学习从输入视频中生成高质量修复结果的映射关系,使修复过程更加智能化。
3.算法简介
流传播和时空Transformer是视频修复任务中的两个主要机制。尽管它们在视频修复中非常有用,但仍然存在一些限制,这些限制对它们的性能产生了影响。传统的基于传播的方法通常在图像或特征域中执行,这可能导致由于不准确的光流而引起的空间不对齐问题。此外,内存和计算资源的限制可能会限制特征传播和视频Transformer的时间范围,从而阻止了对远程帧的对应信息的探索。
为了应对这些限制,ProPainter算法应运而生。该算法包括增强的流传播和高效的Transformer组件,以提高视频修复性能。ProPainter算法包括三个部件:
循环流完成(Cyclic Flow Completion):首先,ProPainter采用高效的循环流完成网络来修复损坏的光流场。这有助于处理光流信息的不准确性,确保在视频修复中有准确的流场信息可用。
双域传播(Bimodal Propagation):接下来,在图像和特征域中执行传播,并且这两个域是联合训练的。这一方法允许算法探索来自全局和局部时间框架的对应关系,从而提供更可靠和有效的传播。这种联合域的传播有助于更好地理解和修复视频中的内容。
掩模引导稀疏变压器(Mask-Guided Sparse Transformer):最后,ProPainter引入了掩模引导稀疏变压器块,以优化特征传播。这些块使用时空注意力来优化传播的特征,并采用仅考虑令牌子集的稀疏策略。这样做旨在提高算法的效率,减少内存消耗,同时保持高性能水平。
从论文中可以知道,这些图形描述了ProPainter算法的关键优点和性能,以下是对每张图的简要解释:
- (a) 图展示了双域传播的优点,因为它具有全局性和可靠性,能够实现更有效的信息传播。这表明ProPainter算法在利用图像和特征域的联合传播方面具有优势。
- (b) 图展示了掩码引导稀疏视频转换器如何通过丢弃不必要和冗余的窗口来提高算法的处理效率。这意味着ProPainter算法在资源利用方面更加高效。
- © 图展示了ProPainter算法在PSNR指标上的高性能,同时还显示了较短的运行时间。这表明ProPainter能够在保持高质量修复的同时,加速修复过程。
- (d-h) 图展示了ProPainter算法与其他方法(FuseFormer、FGT和E2FGVI)进行视觉比较的结果。这些比较显示,ProPainter在填充完整和丰富纹理方面表现出优势,证明了其在视频修复任务中的出色性能。
4.算法处理流程
从论文中,可以看到ProPainter算法的工作流程:
- 循环流补全网络:ProPainter首先使用高效的循环流补全网络来修复损坏的光流场。这有助于确保在视频修复中有准确的流场信息可用,以更好地理解视频帧之间的运动。
- 图像和特征域传播:接下来,ProPainter在图像和特征域中进行传播,这两个域是联合训练的。这一方法允许算法从全局和局部时间帧中探索对应关系,以实现更可靠和有效的信息传播。
- Encoder编码器和局部Feature Prop:通过将经过图像传播操作的输出图像送入Encoder编码器,ProPainter获取局部的Feature Prop。这有助于进一步处理和优化传播的特征。
- 掩码引导的稀疏Transformer块:最后,ProPainter使用掩码引导的稀疏Transformer块对传播的特征进行精细调整。这些块使用时空注意力来进行优化,并采用仅考虑特定子集的稀疏策略。这有助于提高算法的效率,减少内存消耗,同时保持高性能水平。
二、项目部署
1. 部署环境
我这里测试部署的系统win 10, cuda 11.8,cudnn 8.5,GPU是RTX 3060, 8G显存,使用conda创建虚拟环境。
官方给的环境配置:
CUDA >= 9.2
PyTorch >= 1.7.1
Torchvision >= 0.8.2
创建并激活一个虚拟环境:
conda create -n ProPainter python==3.8activate ProPainter
下载项目:
git clone https://github.com/sczhou/ProPainter.git
为了避免Pytorch与GPU不兼容的问题,这里单独安装torch:
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.8 -c pytorch -c nvidia
pip install -r requirements.txt
模型下载:
https://github.com/sczhou/ProPainter/releases/tag/v0.1.0
下载之后,放到项目里面:
2 . 目标移除
从官方给的测试,可以看到官方把视频拆分成一帧帧图像,加上要移除目标的mask图,格式如下:
单图如下:
这一步可以借助 Segment-and-Track Anything这个算法完成,关于Segment-and-Track Anything的使用与环境部署可以看我之前的博客,Segment-and-Track Anything转出的的图像是不是黑白mask图像,可以用以下代码进行转换:
然后把mask变成黑和白两种
import os
import numpy as np
import cv2
from glob import glob
from tqdm import tqdmroot_dir = 'xxx/xxxx/data/'
name = 'tao'msk_folder = f'{root_dir}/{name}/{name}_masks'
img_folder = f'{root_dir}/{name}/{name}'
frg_mask_folder = f'{root_dir}/{name}/{name}_masks_0'
bkg_mask_folder = f'{root_dir}/{name}/{name}_masks_1'
os.makedirs(frg_mask_folder, exist_ok=True)
os.makedirs(bkg_mask_folder, exist_ok=True)files = glob(msk_folder + '/*.png')
num = len(files)for i in tqdm(range(num)):file_n = os.path.basename(files[i])mask = cv2.imread(os.path.join(msk_folder, file_n), 0)mask[mask > 0] = 1cv2.imwrite(os.path.join(frg_mask_folder, file_n), mask * 255)bg_mask = mask.copy()bg_mask[bg_mask == 0] = 127bg_mask[bg_mask == 255] = 0bg_mask[bg_mask == 127] = 255cv2.imwrite(os.path.join(bkg_mask_folder, file_n), bg_mask)
然后执行测试代码:
python inference_propainter.py --video inputs/object_removal/bmx-trees --mask inputs/object_removal/bmx-trees_mask
如果图像太大了,内存爆炸,则要指定压缩大小:
python inference_propainter.py --video inputs/object_removal/bmx-trees --mask inputs/object_removal/bmx-trees_mask --height 240 --width 432
3.视频祛水印
分割出水印的位置的mask图像,这步可以使用 Segment Anything这个项目完成:
然后执行:
python inference_propainter.py --video inputs/video_completion/running_car.mp4 --mask inputs/video_completion/mask_square.png --height 240 --width 432
测试效果:
视频目标移动与祛水印
相关文章:

一键智能视频编辑与视频修复算法——ProPainter源码解析与部署
前言 视频编辑和修复确实是随着电子产品的普及变得越来越重要的技能。有许多视频编辑工具可以帮助人们轻松完成这些任务如:Adobe Premiere Pro,Final Cut Pro X,Davinci Resolve,HitFilm Express,它们都提供一些视频修…...
Flutter开发环境的配置
2023-10最新版本 flutter SDK版本下载地址 https://flutter.cn/docs/development/tools/sdk/releases gradle各版本快速下载地址 https://blog.csdn.net/ii950606/article/details/109105402 JAVA SDK下载地址 https://www.oracle.com/java/technologies/downloads/#java…...

【超详细】Wireshark教程----Wireshark 分析ICMP报文数据试验
一,试验环境搭建 1-1 试验环境示例图 1-2 环境准备 两台kali主机(虚拟机) kali2022 192.168.220.129/24 kali2022 192.168.220.3/27 1-2-1 网关配置: 编辑-------- 虚拟网路编辑器 更改设置进来以后 ,先选择N…...
Linux命令(92)之rm
linux命令之rm 1.rm介绍 linux命令rm是用来删除一个或多个文件/目录,由于其删除的不可逆性,建议在日常工作中一定要慎用 2.rm用法 rm [参数] 文件/目录 rm常用参数 参数说明-r递归删除文件或目录-f不提示强制删除-i删除文件或目录前进行确认-v详细显…...

Mysql主从复制数据架构全面解读
大家好,我是山子,今天给大家分析Mysql 实现主从复制的方方面面,主从复制当然也是我们做读写分离的前提,以下内容是从各网络平台摘录整理总结归纳在一起的;内容已经从主从复制的各方面的维度进行了阐述;非常…...

ios证书类型及其作用说明
ios证书类型及其作用说明 很多刚开始接触iOS证书的开发者可能不是很了解iOS证书的类型功能和概念。下面对iOS证书的几个方面进行介绍。 apple开发账号分类: 免费账号: 无需支付费用给apple,使用个人信息注册的账号 可以开发测试安装&…...
警告-Ubuntu提示W: Possible missing firmware xxx解决方法
目录 现象原因解决方法 现象 当执行 sudo apt-get update或者sudo apt-get dist-upgrade时,有如下警告: W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125a-3.fw for module r8169 W: Possible missing firmware /lib/firmware/rtl_nic/rt…...

有时候,使用 clang -g test.c 编译出可执行文件后,发现 gdb a.out 进行调试无法读取符号信息,为什么?
经过测试,gdb 并不是和所有版本的 llvm/clang 都兼容的 当 gdb 版本为 9.2 时,能支持 9.0.1-12 版本的 clang,但无法支持 16.0.6 版本的 clang 可以尝试使用 LLVM 专用的调试器 lldb 我尝试使用了 16.0.6 版本的 lldb 调试 16.0.6 的 clan…...

UG\NX二次开发 信息窗口的一些操作 NXOpen/ListingWindow
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 信息窗口的一些操作 NXOpen/ListingWindow 效果: 代码: #include "me.hpp" #include <NXOpen/ListingWindow.hxx> #include <…...

macbook电脑磁盘满了怎么删东西?
macbook是苹果公司的一款高性能笔记本电脑,受到很多用户的喜爱。但是,如果macbook的磁盘空间不足,可能会导致一些问题,比如无法开机、运行缓慢、应用崩溃等。那么,macbook磁盘满了无法开机怎么办,macbook磁…...
解释 RESTful API,以及如何使用它构建 web 应用程序
RESTful API是一种基于HTTP协议,使用REST架构风格设计的API。其核心思想是将所有的Web应用程序资源抽象为一组资源集合,并通过HTTP协议中的GET、POST、PUT、DELETE等几个方法对这些资源进行操作,使得Web应用程序能够方便地、高效地进行管理和…...
qml使用c++自定义listmodel数据
qml要使用c中自定义的model,首先该model类需要继承QAbstractListModel类,然后需要重写其中的三个函数,分别是 int rowCount(const QModelIndex &parent); QVariant data(const QModelIndex &index, int role Qt::DisplayRole); QHas…...

cf 解题报告 01
E. Power of Points Problem - 1857E - Codeforces 题意: 给你 n n n 个点,其整数坐标为 x 1 , … x n x_1,\dots x_n x1,…xn,它们位于一条数线上。 对于某个整数 s s s,我们构建线段[ s , x 1 s,x_1 s,x1], [ s , x…...

傅里叶系列 P1 的定价选项
如果您想了解更多信息,请查看第 2 部分和第 3 部分。 一、说明 这是第一篇文章,我将帮助您获得如何使用这个新的强大工具来解决金融中的半分析问题并取代您的蒙特卡洛方法的直觉。 我们都知道并喜欢蒙特卡洛数字积分方法,但是如果我告诉你你可…...

第二十届北京消防展即将开启,汉威科技即将精彩亮相
10月10日~13日,第二十届中国国际消防设备技术交流展览会,将在北京市顺义区中国国际展览中心新馆隆重举行。该展会由中国消防协会举办,是世界三大消防品牌展会之一,本届主题为“助力产业发展,服务消防救援”。届时将有4…...
mongodb、mysql、redis 区别
MongoDB、MySQL 和 Redis 是三种不同的数据库管理系统,它们在数据存储、访问模型和使用场景方面有一些显著的区别。 1. 数据存储模型: MongoDB:MongoDB 是一种文档数据库,它使用 BSON(Binary JSON)格式来存储数据。数据以文档的形式组织,每个文档可以有不同的字段,文档…...

【Flutter】Flutter Web 开发 如何从 URL 中获取参数值
【Flutter】Flutter Web 开发 如何从 URL 中获取参数值 文章目录 一、前言二、Flutter Web 中的 URL 处理三、如何从 URL 中获取参数四、实际业务中的用法五、完整示例六、总结 一、前言 大家好!我是小雨青年,今天我想和大家分享一下在 Flutter Web 开发…...

【Java 进阶篇】JDBC Statement:执行 SQL 语句的重要接口
在Java应用程序中,与数据库进行交互是一项常见的任务。为了执行数据库操作,我们需要使用JDBC(Java Database Connectivity)来建立与数据库的连接并执行SQL语句。Statement接口是JDBC中的一个重要接口,它用于执行SQL语句…...

Python与数据分析--Pandas操作进阶
目录 1.文件读取方式 1.1.绝对路径读取文件 1.2.相对路径读取文件 2.列表数据操作 2.1.列索引指定 2.2.代码数据对齐 3.创建新CSV文件 4.缺失值处理 4.1.缺失值创建 4.2.缺失值检索 4.3.缺失值查询 4.3.1.isnull()函数判断 4.3.2.notnull()函数判断 4.3.3.any()函数…...
国庆小练习
一、二、三 一、 创建一个双向链表, 将26个英文字母通过头插的方式插入到链表中 通过尾删的方式将数据读取出来并删除。main.c #include <my_head.h> #include "dblink.h"int main(int argc, const char *argv[]) {dblink *h create_head();for…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...