ProPainter——实现视频消除特定对象、去水印、视频修复

news2024/11/24 18:30:57

ProPainter视频修复

    • 1. 安装
      • 1.1 克隆项目
      • 1.2 创建虚拟环境和安装依赖库
      • 1.3 下载权重文件
    • 2. 自带示例
      • 2.1 消除物体
      • 2.2 视频修复
    • 3. 实际应用案例
    • 4.训练自己的数据集

📝github:https://github.com/sczhou/ProPainter

📖paper:ICCV2023 | ProPainter: Improving Propagation and Transformer for Video Inpainting

🎥Demo Video:https://www.youtube.com/watch?v=92EHfgCO5-Q

在这里插入图片描述

首先确定下自己的电脑GPU显存是否满足要求,下方展示了不同尺寸、帧数的视频在fp32/fp16两种精确度下的显存需求

分辨率50帧80帧
1280 x 72028G / 19GOOM / 25G
720 x 48011G / 7G13G / 8G
640 x 48010G / 6G12G / 7G
320 x 2403G / 2G4G / 3G

1. 安装


1.1 克隆项目

git clone https://github.com/sczhou/ProPainter.git

1.2 创建虚拟环境和安装依赖库

# create new anaconda env
conda create -n propainter python=3.8 -y
conda activate propainter

# install python dependencies
pip3 install -r requirements.txt
  • CUDA >= 9.2
  • PyTorch >= 1.7.1
  • Torchvision >= 0.8.2
  • 其他库的要求查看requrements.txt

1.3 下载权重文件

从Releases V0.1.0下载权重文件保存到下方路径

weights
   |- ProPainter.pth
   |- recurrent_flow_completion.pth
   |- raft-things.pth
   |- i3d_rgb_imagenet.pt (for evaluating VFID metric)
   |- README.md

2. 自带示例


2.1 消除物体

python inference_propainter.py --video inputs/object_removal/bmx-trees --mask inputs/object_removal/bmx-trees_mask

inputs/object_removal/bmx-trees目录下是视频的所有帧保存的图片,inputs/object_removal/bmx-trees_mask是每帧图片中需要消除的对象的掩码。运行代码后结果保存在results/bmx-trees下。

在这里插入图片描述 在这里插入图片描述

2.2 视频修复

python inference_propainter.py --video inputs/video_completion/running_car.mp4 --mask inputs/video_completion/mask_square.png --height 240 --width 432

inputs/video_completion/running_car.mp4是输入的视频,inputs/video_completion/mask_square.png是输入的掩码。

这个跟上面的区别就是,一个对像素点位置在变化的区域进行修复,一个是对像素点固定区域进行修复。对于待修复区域位置一直在变化的,需要输入每一帧的掩码,待修复区域位置不变的,则只需要一帧的掩码即可。
在这里插入图片描述 在这里插入图片描述

3. 实际应用案例


实际操作,用它试试给视频去水印

  • 首先抓取视频中的一帧保存为图片
import cv2

# 打开视频文件
cap = cv2.VideoCapture('F:/ProPainter/inputs/self/11.mp4')

# 获取视频总帧数和帧率和高宽
count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print('Video info w: {}, h: {}, count: {}, fps: {}'.format(w, h, count, fps))

while cap.isOpened():
    ret, frame = cap.read()
    # 选第一帧保存为图片
    cv2.imwrite("F:/ProPainter/inputs/self/frame.jpg", frame)
    break

# 释放资源
cap.release()
  • 使用win10自带的画图软件获得水印位置,使用脚本生成掩码图

在这里插入图片描述

from PIL import Image, ImageDraw

# 创建一张与视频同样尺寸全黑的图片
img = Image.new('RGB', (1280, 578), color='black')
draw = ImageDraw.Draw(img)

# 三个矩形区域设为白色,分别为三个举行的左上点和右下点的坐标
rectangles = [
    [(301, 33), (413, 86)],
    [(945, 29), (1046, 68)],
    [(959, 194), (1007, 392)]
]

for rect in rectangles:
    draw.rectangle(rect, fill='white')

# 保存图片到本地
img.save('F:/ProPainter/inputs/self/mask.png')
  • 运行程序
python inference_propainter.py --video F:/ProPainter/inputs/self/11.mp4 --mask F:/ProPainter/inputs/self/mask.png --resize_ratio 0.3 --fp16

视频修复需要大量的GPU显存,为了避免内存不足(OOM)错误。可以选用下方参数进一步减少内存使用量:

  • --neighbor_length默认10,通过减少相邻帧数的数量;
  • --ref_stride默认10,通过增加stride;
  • --resize_ratio默认1.0,通过调小处理视频的大小;
  • 通过指定--width--height来设置较小的视频尺寸;
  • --fp16,在推理期间使用半精度;
  • --subvideo_length默认80,减少子视频的帧数;

在这里插入图片描述 在这里插入图片描述

4.训练自己的数据集

请看官方自己的文档,需要将视频每帧转为图片,然后每张图片获取一张掩码图,所有图片需要resize到432x240。

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

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

相关文章

AI 时代的企业级安全合规策略

目录 漏洞分类管理的流程 安全策略管理 在扫描结果策略中定义细粒度的规则 有效考虑整个组织中的关键漏洞 确保职责分离 尝试组合拳 本文来源:about.gitlab.com 作者:Grant Hickman 在应用程序敏捷研发、敏捷交付的今天,让安全人员跟上…

SNP应邀参加2023中国企业数字化转型峰会暨赛意用户大会

创新驱动科技,数智驱动未来。如今,我国产业数字化进程提速升级,数字产业化规模持续壮大。数据显示,2022年,我国数字经济规模达50.2万亿元,总量稳居世界第二。数字经济已经成为推动传统产业转型升级、促进高…

MathWorks Matlab R2023b ARM Mac报错 License Manager Error -8

MathWorks Matlab R2023b 23.2.0.2365128 ARM 版本安装激活后出现报错: License Manager Error -8 License checkout failed. License Manager Error -8 Make sure the HostID of the license file matches this machine, and that the HostID on the SERVER line m…

python实现FINS协议的TCP服务端(篇一)

python实现FINS协议的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模块。本文为第一篇。 一、了解FI…

深度学习之基于Python+OpenCV(DNN)性别和年龄识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Python和OpenCV的深度学习性别和年龄识别系统是一种利用深度学习模型来自动识别人脸照片中的性别和年龄的技术。…

95 课程表

课程表 题解1 BFS(拓扑图模板)题解2 DFS 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] &am…

PostgreSQL 技术内幕(十一)位图扫描

扫描算子在上层计算和底层存储之间,向下扫描底层存储的数据,向上作为计算的输入源,在SQL的执行层中,起着关键的作用。顺序、索引、位图等不同类型的扫描算子适配不同的数据分布场景。然而,扫描算子背后的实现原理是怎样…

Linux nohup后台启动/ 后台启动命令中nohup 、、重定向的使用

文章目录 一、前言二、nohup(不挂断)简介三、nohup使用3.1、nohup启动3.2、nohup与&,后台运行3.3、nohup与>,日志重定向3.4、nohup后台启动-综合使用(推荐)2>&1 3.5、nohup后台启动(不生成日志) 四、查看进程五、知…

输出所有最长公共子序列

输出所有最长公共子序列 什么是最长公共子序列过程讲解完整程序代码(python) 什么是最长公共子序列 在力扣题库中的1143题有一道最长公共子序列,但是那个只是返回最长子序列的长度,而没有输出所有的最长子序列 通过上图中的举例…

VR全景技术,为养老院宣传推广带来全新变革

现如今,人口老龄化的现象加剧,养老服务行业也如雨后春笋般不断冒头,但是市面上各式的养老院被包装的五花八门,用户实际参访后却差强人意,如何更好的给父母挑选更为舒心的养老环境呢?可以利用720度VR全景技术…

响应式艺术作品展示前端html网站模板源码

响应式艺术作品展示网站模板是一款适合各种艺术作品在线展示的响应式网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。 转载自 https://www.qnziyw.cn/wysc/qdmb/23778.html

文献管理软件Zotero之同步篇(2)

文章目录 0、前言1、官方自带同步1.1、Zotero的同步逻辑【必须掌握】1.2、自带同步设置 2、官网进行数据同步,同步网盘进行文件同步的方案2.1、对1.1同步逻辑的补充说明2.2、同步设置2.2.1、同步网盘的选择:2.2.2、同步设置2.2.2.1、分别在每一台计算机中…

JMeter参数化方式:三招让你的性能测试更灵活!

科技新势力,引领向未来 今天我们将探讨关于JMeter(Apache JMeter)性能测试工具中的参数化方式,这些方法可以帮助你更灵活地进行性能测试,并更好地模拟实际用户行为。JMeter是一款强大的开源工具,可用于测试…

R-install_miniconda()卸载 | conda命令行报错及解决方法

运行以下代码&#xff0c;突然报错&#xff1a; C:\Users\hp>conda info-e >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<&…

AI:74-基于深度学习的宠物品种识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

VScode 右键没有转到定义等的菜单

问题&#xff1a; 右键点击该函数出现的结果只能是这样的&#xff1a; 解决&#xff1a; 通过修改 settings.json 文件&#xff0c;以解决问题&#xff1a; 这是原来有问题的配置&#xff1a; {"python.autoComplete.extraPaths": ["/home/robot/1-temp_mak…

【Linux】 reboot 命令使用

reboot 命令用于用来重新启动计算机。 语法 reboot [参数] 命令选项及作用 执行令 man --reboot 执行命令结果 参数 -n : 在重开机前不做将记忆体资料写回硬盘的动作-w : 并不会真的重开机&#xff0c;只是把记录写到 /var/log/wtmp 档案里-d : 不把记录写到 /var/log…

锁策略与CAS

目录 ♫什么是锁策略 ♫乐观锁与悲观锁 ♫互斥锁和读写锁 ♫重量级锁和轻量级锁 ♫自旋锁和挂起等待锁 ♫公平锁和非公平锁 ♫可重入锁和不可重入锁 ♫什么是CAS ♫CAS实现原子类 ♫CAS实现自旋锁 ♫CAS的ABA问题 ♫什么是锁策略 锁策略指的是在并发访问数据时&#xf…

创建一个自定义关卡资源(二)

接上一篇文章&#xff0c;做加载 再做加载之前&#xff0c;提一下 关于上一篇文章中的扩展编辑器&#xff0c;会有点小问题&#xff0c;会有重置的现象&#xff0c;现在有点忙&#xff0c;暂时不研究。 如果研究的话&#xff0c;我会出一篇&#xff08;三&#xff09; 否则就没…

哈希的介绍及开散列和闭散列的实现(c++)

本文主要对哈希的相关知识进行一定的介绍&#xff0c;并对哈希中结构的闭散列和开散列进行一定的介绍和部分功能的实现。 目录 一、哈希概念 二、哈希冲突 三、哈希函数 1. 直接定址法--(常用) 2. 除留余数法--(常用) 3. 平方取中法 4. 折叠法 5. 随机数法 6. 数学分析…