铅华洗尽,粉黛不施,人工智能AI基于ProPainter技术去除图片以及视频水印(Python3.10)

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 视频以及图片修复技术是一项具有挑战性的AI视觉任务,它涉及在视频或者图片序列中填补缺失或损坏的区域,同时保持空间和时间的连贯性。该技术在视频补全、对象移除、视频恢复等领域有广泛应用。近年来,两种突出的方案在视频修复中崭露头角:flow-based propagation和spatiotemporal Transformers。尽管两套方案都还不错,但它们也存在一些局限性,如空间错位、时间范围有限和过高的成本。说白了,你通过AI技术移除水印或者修复一段不清晰的视频,但结果却没法保证连贯性,让人一眼能看出来这个视频或者图片还是缺失状态,与此同时,过高的算力成本也是普通人难以承受的。

视频以及图片修复技术是一项具有挑战性的AI视觉任务,它涉及在视频或者图片序列中填补缺失或损坏的区域,同时保持空间和时间的连贯性。该技术在视频补全、对象移除、视频恢复等领域有广泛应用。近年来,两种突出的方案在视频修复中崭露头角:flow-based propagation和spatiotemporal Transformers。尽管两套方案都还不错,但它们也存在一些局限性,如空间错位、时间范围有限和过高的成本。

说白了,你通过AI技术移除水印或者修复一段不清晰的视频,但结果却没法保证连贯性,让人一眼能看出来这个视频或者图片还是缺失状态,与此同时,过高的算力成本也是普通人难以承受的。

本次,我们通过ProPainter框架来解决视频去水印任务,该框架引入了一种称为双域传播的新方法和一种高效的遮罩引导视频Transformers。这些组件共同增强了视频修复的性能,同时保持了计算效率,成本更低,让普通人也能完成复杂的水印去除任务,正所谓:清水出芙蓉,天然去雕饰。

安装配置ProPainter

老规矩,首先克隆项目:

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

该项目基于CUDA框架,请确保本地环境的CUDA版本大于9.2。

执行命令查看本地的CUDA版本:

nvcc --version

输出:

PS C:\Users\zcxey> nvcc --version  
nvcc: NVIDIA (R) Cuda compiler driver  
Copyright (c) 2005-2022 NVIDIA Corporation  
Built on Tue_Mar__8_18:36:24_Pacific_Standard_Time_2022  
Cuda compilation tools, release 11.6, V11.6.124  
Build cuda_11.6.r11.6/compiler.31057947_0

截至本文发布,笔者的版本是11.6,关于本机配置CUDA和cudnn,请移玉步至:声音好听,颜值能打,基于PaddleGAN给人工智能AI语音模型配上动态画面(Python3.10),囿于篇幅,这里不再赘述。

随后进入项目:

cd ProPainter

安装依赖:

pip3 install -r requirements.txt

接着下载ProPainter的预训练模型:https://github.com/sczhou/ProPainter/releases/tag/v0.1.0

将其放入项目的weights目录中,模型放入之后的目录结构如下:

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

至此,ProPainter就配置好了。

对象移除

ProPainter很贴心地在项目中放入了一些示例,我们直接在项目的根目录运行命令:

python3 inference_propainter.py

程序输出:

E:\work\ProPainter>python inference_propainter.py  
Pretrained flow completion model has loaded...  
Pretrained ProPainter has loaded...  
Network [InpaintGenerator] was created. Total number of parameters: 39.4 million. To see the architecture, do print(network).  

Processing: bmx-trees [80 frames]...  
100%|██████████████████████████████████████████████████████████████████████████████████| 16/16 [00:10<00:00,  1.52it/s]  

All results are saved in results\bmx-trees

ProPainter就会自动演示一段80帧的视频对象移除功能,输出在项目的results文件夹中:

可以看到,脚本将画面里骑自行车的小孩以及自行车给移除了。

具体操作就是将要移除的物体遮罩以及原画面放入到项目的inputs文件夹中,随后预训练模型会根据遮罩完成移除和补全动作。

生成遮罩(mask)

为了防止不法者的滥用,项目作者移除了水印的示例,现在我们来进行演示如何移除水印,首先我有一张带水印的视频或者图片:

可以看到该水印十分巨大,将原始画面的沙发,桌子以及床都遮住了一部分,那么第一步我们需要生成水印的遮罩,让程序可以容易的识别水印轮廓。

首先安装Open-cv库:

pip3 install opencv-python

随后编写代码,将logo提取并产生遮罩:

import cv2  
import numpy as np  


room = cv2.imread('D:/Downloads/room.png' )  
logo = cv2.imread('D:/Downloads/logo.png' )  

#--- Resizing the logo to the shape of room image ---  
logo = cv2.resize(logo, (room.shape[1], room.shape[0]))  

#--- Apply Otsu threshold to blue channel of the logo image ---  
ret, logo_mask = cv2.threshold(logo[:,:,0], 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)  
cv2.imshow('logo_mask', logo_mask)  
cv2.waitKey()  
cv2.imwrite('D:/Downloads/logo_mask.png', logo_mask)

运行效果:

当然,如果不想通过代码来完成,也可以通过Photoshop来做,直接通过Photoshop的的内容选取-》反向选择-》填充黑色-》随后再次反向选择-》填充白色,来完成:

最后效果和Open-cv的处理结果是一样的。

去除水印

如此,我们得到了原画面以及水印的遮罩,在项目的inputs目录创建test目录,随后创建img和mask目录,分别将原画和水印遮罩放入目录:

├─inputs  
│  ├─test  
│  │  ├─img  
│  │  └─mask

注意,由于该项目是基于视频的,所以最少也得有两帧的画面,如果只有1帧的画面,会报错。

运行命令:

python3 inference_propainter.py --video inputs/test/img --mask inputs/test/mask

程序返回:

E:\work\ProPainter>python inference_propainter.py --video inputs/test/img --mask inputs/test/mask  
Pretrained flow completion model has loaded...  
Pretrained ProPainter has loaded...  
Network [InpaintGenerator] was created. Total number of parameters: 39.4 million. To see the architecture, do print(network).  

Processing: img [2 frames]...  
100%|████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:54<00:00, 54.30s/it]  
IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (1227, 697) to (1232, 704) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).  
[swscaler @ 0000025d0a1b5900] Warning: data is not aligned! This can lead to a speed loss  
IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (1227, 697) to (1232, 704) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).  
[swscaler @ 000001b30eb858c0] Warning: data is not aligned! This can lead to a speed loss  

All results are saved in results\img

可以看到,程序将处理后的两帧视频结果输出到了项目的results/img目录中,去除水印后的结果:

移除效果可谓是非常惊艳了。

当然,我们只处理了视频的其中两帧画面,如果是10分钟左右的视频通常需要大量的GPU内存。通过下面的参数输入,可以有效解决本地的“爆显存”错误:

通过减少--neighbor_length(默认为10)来减少局部长度的数量。  
通过增加--ref_stride(默认为10)来减少全局参考帧的数量。  
通过设置--resize_ratio(默认为1.0)来调整处理视频的大小。  
通过指定--width和--height来设置较小的视频尺寸。  
设置--fp16,在推理过程中使用fp16(半精度)。  
通过减少子视频的帧数--subvideo_length(默认为80),有效地分离了GPU内存成本和视频长度。

结语

ProPainter毫无疑问是伟大的项目,但需要注意的是,移除水印可能涉及侵犯版权或违反合同条款,具体是否违法取决于您所在的国家或地区的法律法规以及相关合同的规定。

在许多情况下,水印是版权保护的一种方式,用于标识作品的所有权归属或授权情况。如果您未经授权移除水印,可能会侵犯原创作者的版权权益,这可能违反了版权法。

此外,如果您在使用某个服务或软件时同意了相关的使用条款和隐私政策,这些条款和政策通常会规定您不得移除或修改任何水印或版权信息。违反这些合同条款可能导致法律责任。

因此,建议在涉及水印的情况下,您应该遵守适用的法律法规和合同条款,并尊重原始作品的版权和知识产权。

相关文章
|
2天前
|
机器学习/深度学习 人工智能 物联网
智能家居技术的未来:从自动化到人工智能
本文探讨了智能家居技术的发展趋势,从早期的自动化设备到现在的人工智能集成系统。文章首先介绍了智能家居的基本概念和历史发展,然后详细分析了当前智能家居技术的主要特点,包括物联网、机器学习和用户交互界面。接着,文章讨论了智能家居技术面临的挑战,如隐私保护、数据安全和技术标准化问题。最后,展望了未来智能家居技术的发展方向,包括更加智能化的家居管理、环境自适应能力和高级用户定制服务。文章旨在为读者提供一个关于智能家居技术发展的全面视角,并引发对未来生活方式的思考。
|
2天前
|
数据采集 机器学习/深度学习 搜索推荐
Python爬虫技术基础与应用场景详解
本文介绍了爬虫技术的基本概念、原理及应用场景,包括数据收集、价格监测、竞品分析和搜索引擎优化等。通过一个实战案例展示了如何使用Python爬取电商网站的商品信息。强调了在使用爬虫技术时需遵守法律法规和道德规范,确保数据抓取的合法性和合规性。
|
4天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的编程实践:从Python到深度学习的探索之旅
【9月更文挑战第6天】 在人工智能的黄金时代,编程不仅仅是一种技术操作,它成为了连接人类思维与机器智能的桥梁。本文将通过一次从Python基础入门到构建深度学习模型的实践之旅,揭示编程在AI领域的魅力和重要性。我们将探索如何通过代码示例简化复杂概念,以及如何利用编程技能解决实际问题。这不仅是一次技术的学习过程,更是对人工智能未来趋势的思考和预见。
|
10天前
|
人工智能 运维 自然语言处理
AI战略丨构建未来: 生成式人工智能技术落地策略
GenAI 的技术落地需要企业进行周密地规划和持续地努力。企业必须从自身的战略出发, 综合考虑成本、效果和性能,制定合理的技术架构,通过全面的 AI 治理,实现可持续的创新和发展。
|
5天前
|
存储 安全 算法
显微镜下的安全战!Python加密解密技术,透视数字世界的每一个安全细节
【9月更文挑战第7天】在数字世界中,数据安全至关重要。Python加密解密技术如同显微镜下的精密工具,确保信息的私密性和完整性。以大型医疗机构为例,通过AES和RSA算法的结合,既能高效加密大量医疗数据,又能安全传输密钥,防止数据泄露。以下是使用Python的`pycryptodome`库实现AES加密和RSA密钥交换的简化示例。此方案不仅提高了数据安全性,还为数字世界的每个细节提供了坚实保障,引领我们迈向更安全的未来。
10 1
|
8天前
|
存储 人工智能 算法
人工智能伦理与治理:在技术进步中寻求平衡
【9月更文挑战第4天】人工智能伦理与治理是一个复杂而重要的议题。在推动AI技术进步的同时,我们必须正视其带来的伦理与治理挑战,并寻求在技术进步中寻求平衡的策略。通过制定伦理准则与标准、加强法律与政策监管、提升算法透明度与可解释性、加强公众教育与参与以及推动国际合作与交流等措施,我们可以构建完善的伦理框架和治理体系,确保AI技术的发展和应用符合道德和社会价值观。
|
11天前
|
测试技术 开发者 Python
Bottle技术:如何用Python打造小巧而强大的Web应用,让你一鸣惊人?
【8月更文挑战第31天】本文介绍了Bottle——一种轻量级Web框架,以其简洁的语法和强大功能受到开发者喜爱。文章涵盖Bottle的核心概念(路由、模板、请求对象),并展示了其简单易用的特性及快速开发能力。通过遵循最佳实践,开发者能够高效地利用Bottle创建高质量Web应用,迎接未来Web开发的挑战。
12 1
|
12天前
|
测试技术 Python
Bottle技术:如何用Python打造小巧而强大的Web开发利器?
【8月更文挑战第31天】Bottle是一个用Python编写的轻量级Web框架,设计简洁、快速且小巧,适用于快速开发Web应用程序。其主要特点包括简单易学、快速开发、小巧轻量及强大的功能,如路由、模板和表单验证等。Bottle的核心概念包括路由、模板和请求对象,可通过示例了解其基本用法。此外,合理使用路由、编写测试和利用Bottle扩展等最佳实践有助于更高效地进行Web开发。随着Bottle生态的不断发展,它将在未来Web开发中扮演更重要的角色。
19 1
|
2天前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
9 0
|
4天前
|
应用服务中间件 网络虚拟化 nginx
Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦
以上是对每个问题的简要答案,由于篇幅限制,未能深入到1000字的详细解释,但希望这提供了一个良好的起点。对于这类复杂的话题,深入研究和专业指导至关重要。
13 0