当前位置: 首页 > news >正文

Python - 面向现实世界的人脸复原 GFP-GAN 简介与使用

目录

一.引言

二.GFP-GAN 简介

1.GFP-GAN  数据

2.GFP-GAN 架构

3.GFP-GAN In Wave2Lip

三.GFPGAN 实践

1.环境搭建

2.模型下载

3.代码测试

4.测试效果

四.总结


一.引言

近期 wav2lip 大火,其通过语音驱动唇部动作并对视频质量进行修复,其中涉及到三个知识点:

◆ tts 文本到语音转化

◆ wav2lip 语音驱动唇部动作

◆ GFP-GAN 图像质量修复

本文主要介绍腾讯在人像复原、超分等方面的佳作 GFP-GAN。其在 wav2lip 中扮演视频质量判别器的任务,负责对嘴唇修复后的图像帧进行质量修复,提供更高质量的视频效果。

可以看到与多种新兴方法相比,GFP-GAN 的效果相对更优。

二.GFP-GAN 简介

1.GFP-GAN  数据

GFP-GAN 基于 FFHQ 上训练,由 70000 张高质量图像组成。在训练过程中,将所有图像的大小调整为5122。GFP-GAN是在合成数据上训练的,这些合成数据近似于真实的低质量图像,并在推理过程中推广到真实世界的图像。我们遵循惯例采用以下退化模型:

◆ kσ 高斯模糊 - 高质量图像 y 首先与高斯进行卷积模糊核 kσ,采样范围 [0.2:10]

◆ r - 基于比例因子 r 进行下采样,采样范围 [1:8]

◆  - 添加高斯白噪声,采样范围 [0:15]

◆ JPEGq - 具有质量因子 q 的 JPEG 图像,采样范围 [60: 100]

从这个样本构造的过程也可以看出,GFP-GAN 是一种无监督或者是自监督的训练模型,其不需要人工的标注数据。除此之外,我们在色彩增强训练中添加色彩抖动。下图是图像模型在三个真实世界数据集的定性比较,通过放大以获得最佳视图:

2.GFP-GAN 架构

GFP-GAN 模型主要用到了一个 <Degradation Removal > 退化清除模块,其引入了 <Restoration Loss> 面部恢复损失和一个预训练的 GAN 作为先验。二者通过 Channel-Split SFT 进行桥接。训练过程由 3 类 Loss 混合控制: 

Adversarial Loss -中间恢复 Loss 消除复杂退化

Facial Component Loss - 面部成分 Loss 增强面部细节

Identify Preserving Loss - 身份保留 Loss 以保留人脸身份

其整个恢复训练过程就像低维向量 X 向高维向量 Y 的重建过程。借助 GFP-GAN,我们可以将视频关键帧进行截取与处理,最终拼接为高质量的视频。

3.GFP-GAN In Wave2Lip

wav2lip 模型的训练分为两个阶段,第一阶段是专家音频和口型同步判别器预训练;第二阶段是GAN网络训练。训练部分包括一个生成器和两个判别器,这里的两个判别器分别是专家音频和口型同步判别器和视觉质量判别器,前者预训练完毕后,在GAN训练过程中保持冻结。GFP-GAN 在这里扮演视觉质量判别器的任务,其有多个卷积块组成,训练目标是最大化目标函数 Ldisc:

其中 Lg 对应生成器 G 生成的图像,LG 对应真实图像。其中最右侧的 Visual Quality Discriminator 视觉质量鉴别器用于引入视频质量的 Loss 进行图像修复。其训练数据可以参照 LRS2 数据集,这是一个来自 BBC 的唇语视频,包含 4w 多个口语句子。其中推荐视频帧率为 25fps,音频采样率为 16k,视频一帧对应音频块的长度为 16:

三.GFPGAN 实践

1.环境搭建

创建 Python 环境

需要 python >= 3.7 且 PyTorch >= 1.7,我们直接创建并激活 Python 3.8 的新环境:

conda create --name GFP-GAN python=3.8
conda activate GFP-GAN

Clone repo

git clone https://github.com/TencentARC/GFPGAN.git
cd GFPGAN

Install dependent packages

# Install basicsr - https://github.com/xinntao/BasicSR
# We use BasicSR for both training and inference
pip install basicsr# Install facexlib - https://github.com/xinntao/facexlib
# We use face detection and face restoration helper in the facexlib package
pip install facexlibpip install -r requirements.txt
python setup.py develop# If you want to enhance the background (non-face) regions with Real-ESRGAN,
# you also need to install the realesrgan package
pip install realesrgan

最终的 py 3.8 其余 package 依赖版本如下:

torch==2.0.1
torchvision==0.15.2
basicsr==1.4.2
facexlib==0.3.0
realesrgan==0.3.0
opencv-python==4.8.1.78
scipy==1.11.3

2.模型下载

官方 Githuba 提供三个修复模型供使用:

◆ V1 - Paper 中对应模型,带彩色。

◆ V2 - 无着色,不需要CUDA扩展。通过预处理使用更多数据进行训练。

◆ V3 - 基于V1.2,更自然的恢复结果;在非常低质量 / 高质量的输入上获得更好的结果。

我们这里直接下载 V1.3 对应的 GFPGANv1.3.pth,大小约为 333 M:

wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P experiments/pretrained_models

3.代码测试

这里快速测试的话只需要 -i 传入图片对应的文件夹,-o 传入输出地址: 

python inference_gfpgan.py -i inputs/whole_imgs -o results -v 1.3 -s 2

-v 代表模型版本,-s 代表上采样比例,由于原始代码中逻辑涉及到从 URL 中获取 .pth 的复原模型,所以我们需要对代码稍作修改,避免网络原因导致模型下载失败进而异常。

直接指定模型,避免 URL 下载

直接将下载好的 .pth 的模型全路径传给 model_path 即可,除此之外 gfpgan/weights 下面还需要下载两个辅助的 .pth 模型,这里需要等代码执行完毕,如果中途退出下载再运行会在加载时报模型文件异常:

RuntimeError: unexpected EOF, expected xxx more bytes. The file might be corrupted.

4.测试效果

运行结束后会得到多个文件夹:

◆ cmp 即为 compare 对应每个人物的修复效果前后对比

◆ cropped_faces 为裁剪得到的原始人脸图像

◆ restored_faces 为对应的修复人脸图像

◆ restored_imgs 为完整的修复图像。

为了获得比较真实的老图,我们上网找到了三张老板本 <三国演义> 的剧照,看看整体恢复效果:

再看看不同角色的对比修复效果:

case 整体的修复效果还是不错的,不过鲁肃脸上由于光线的原因,修复后有些棱角分明。

四.总结

上面是一些 GFP-GAN 的基本信息与调用流程,官方 Github 还提供了自定义的训练脚本,如果有自己场景的图像数据也可以对模型持续训练。后面有空我们也会分享 wave2lip 的其他相关知识。

参考数据与链接:

LRS2: LRS2数据集处理

GFP-GAN 论文: https://arxiv.org/pdf/2101.04061.pdf

GFP-GAN 代码: GitHub - developing Practical Algorithms for Real-world Face Restoration.

Wave2Lip 论文: http://cdn.iiit.ac.in/cdn/cvit.iiit.ac.in/images/Projects/Speech-to-Lip/paper.pdf

相关文章:

Python - 面向现实世界的人脸复原 GFP-GAN 简介与使用

目录 一.引言 二.GFP-GAN 简介 1.GFP-GAN 数据 2.GFP-GAN 架构 3.GFP-GAN In Wave2Lip 三.GFPGAN 实践 1.环境搭建 2.模型下载 3.代码测试 4.测试效果 四.总结 一.引言 近期 wav2lip 大火&#xff0c;其通过语音驱动唇部动作并对视频质量进行修复&#xff0c;其中…...

Xcode15 framework ‘CoreAudioTypes‘ not found

Xcode15遇见"framework ‘CoreAudioTypes’ not found。" 可尝试移除CoreAudioTypes&#xff0c;添加CoreAudio。 CoreAudio是CoreAudioTypes的套壳。 CoreAudio/CoreAudioTypes.h头文件内容 /*CoreAudio/CoreAudioTypes.h has moved to CoreAudioTypes/CoreAudi…...

torch.cuda.is_available()=false的原因

1、检查是否为nvidia显卡&#xff1b; 2、检查GPU是否支持cuda; 3、命令行cmd输入nvidia-smi&#xff08;中间没有空格&#xff09;&#xff0c;查看显卡信息&#xff0c;cuda9.2版本只支持Driver Version>396.26&#xff1b;如果小于这个值&#xff0c;那么你就需要更新显…...

asp.net docker-compose添加网关和网关配置

打开docker-compose.yml 添加 killsb-social-apigw:image: ${REGISTRY:-killsbdapr}/killsb-social-apigw:${TAG:-latest}build:context: .dockerfile: src/ApiGateways/SocialEnvoy/Dockerfile 在路径src\ApiGateways\SocialEnvoy 添加envoy.yaml admin:access_log_path: …...

论文阅读:LOGO-Former: Local-Global Spatio-Temporal Transformer for DFER(ICASSP2023)

文章目录 摘要动机与贡献具体方法整体架构输入嵌入生成LOGO-Former多头局部注意力多头全局注意力 紧凑损失正则化 实验思考总结 本篇论文 LOGO-Former: Local-Global Spatio-Temporal Transformer for Dynamic Facial Expression Recognition发表在ICASSP&#xff08;声学顶会…...

【GO】项目import第三方的依赖包

目录 一、导入第三方包 1.执行命令 2.查看go环境变量参数 3.查看go.mod文件的变化情况 二、程序里如何import 1. import依赖包 2. 程序编写 本次学习go如果依赖第三方的包&#xff0c;并根据第三方的包提供的接口进行编程&#xff0c;这里需要使用go get命令。下面将go…...

【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接

【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接 目录 【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接深入理解用户缓冲区缓冲区刷新问题缓冲区存在的意义 File模拟实现C语言中文件标准库 文件系统认识磁盘对目录的理解 软硬链接软硬链接的删除文件的三个时间 作者…...

电脑软件:推荐一款电脑多屏幕管理工具DisplayFusion

下载https://download.csdn.net/download/mo3408/88514558 一、软件简介 DisplayFusion是一款多屏幕管理工具&#xff0c;它可以让用户更轻松地管理连接到同一台计算机上的多个显示器。 二、软件功能 2.1 多个任务栏 通过在每个显示器上显示任务栏&#xff0c;让您的窗口管理更…...

免费好用的网页采集工具软件推荐

在众多各具特色的采集器软件中&#xff0c;真正好用的采集器软件有哪些&#xff1f; 自己一个个去查找和尝试无疑会耗费大量的时间和精力。 因此&#xff0c;在深入体验大多数采集器后&#xff0c;给大家推荐几款优秀且好用的免费网页采集器软件。 本文将对这几款采集器进行…...

6.ELK之Elasticsearch嵌套(Nested)类型

0、前言 在Elasticsearch实际应用中经常会遇到嵌套文档的情况&#xff0c;而且会有“对象数组彼此独立地进行索引和查询的诉求”。在ES中这种嵌套文档称为父子文档&#xff0c;父子文档“彼此独立地进行查询”至少有以下两种方式&#xff1a; 1&#xff09;父子文档。在ES的5.…...

RefConv: 重参数化的重新聚焦卷积(论文翻译)

文章目录 摘要1、简介2、相关研究2.1、用于更好性能的架构设计2.2、结构重参数化2.3、权重重参数化方法 3、重参数化的重聚焦卷积3.1、深度RefConv3.2、普通的RefConv3.3、重聚焦学习 4、实验4.1、在ImageNet上的性能评估4.2、与其他重参数化方法的比较4.3、目标检测和语义分割…...

指令重排序

指令重排序是现代处理器在执行指令时的一种优化技术&#xff0c;其目的是为了提高处理器执行指令的效率。这种优化手段会对指令进行重新排序&#xff0c;以提高并行度和性能。 为何会发生指令重排序&#xff1a; 处理器性能优化&#xff1a; 为了更好地利用现代处理器的流水线、…...

【Head First 设计模式】-- 观察者模式

背景 客户有一个WeatherData对象&#xff0c;负责追踪温度、湿度和气压等数据。现在客户给我们提了个需求&#xff0c;让我们利用WeatherData对象取得数据&#xff0c;并更新三个布告板&#xff1a;目前状况、气象统计和天气预报。 WeatherData对象提供了4个接口&#xff1a; …...

JavaWeb篇_01——JavaEE简介【面试常问】

JavaEE简介 什么是JavaEE JavaEE&#xff08;Java Enterprise Edition&#xff09;&#xff0c;Java企业版&#xff0c;是一个用于企业级web开发平台,它是一组Specification。最早由Sun公司定制并发布&#xff0c;后由Oracle负责维护。在JavaEE平台规范了在开发企业级web应用…...

QtC++与QRadioButton详解

介绍 QRadioButton 是 Qt 中的一个重要部件&#xff0c;用于创建单选按钮&#xff0c;它有以下几个主要作用和特点&#xff1a; 单选功能&#xff1a; QRadioButton 用于创建单选按钮&#xff0c;用户可以从一组互斥的选项中选择一个。这在用户界面设计中常用于需要用户从多个…...

移远EC600U-CN开发板 day01

1.官方文档快速上手&#xff0c;安装驱动&#xff0c;下载QPYcom QuecPython 快速入门 - QuecPython (quectel.com)https://python.quectel.com/doc/Getting_started/zh/index.html 注意&#xff1a; &#xff08;1&#xff09;打开开发板步骤 成功打开之后就可以连接开发板…...

【C/C++】什么是POD(Plain Old Data)类型

2023年11月6日&#xff0c;周一下午 目录 POD类型的定义标量类型POD类型的特点POD类型的例子整数类型&#xff1a;C 风格的结构体&#xff1a;数组&#xff1a;C 风格的字符串&#xff1a;std::array:使用 memcpy 对 POD 类型进行复制把POD类型存储到文件中&#xff0c;并从文…...

注册虾皮买家号需要哪些资料?

注册虾皮买家号其实是很简单的&#xff0c;使用相应国家的手机号及对应的环境就可以注册了的&#xff0c;如果想要账号更方便使用&#xff0c;也可以绑定邮箱进行认证。 而如果想要使用shopee买家通系统进行自动化的注册&#xff0c;那么对于资料就有一定的要求了。 1、手机号…...

小腿筋膜炎怎么治疗最有效

小腿筋膜炎症状主要有疼痛、肌肉紧张、活动受限等。 1.疼痛&#xff1a;小腿筋膜炎主要会导致炎症性疼痛&#xff0c;没有固定的压痛点&#xff0c;通常以踝关节、膝关节活动时疼痛为主。疼痛呈持续性&#xff0c;或者反复发作&#xff0c;尤其是在晨起或者天气变化、劳累、受…...

After Effects 2024 v24.0.2(AE2024)

After Effects 2024是视频特效和动态图形设计软件。以下是After Effects 2024的主要功能和特点&#xff1a; 支持创建各种令人惊叹的视觉效果&#xff0c;例如粒子系统、合成特效、绿屏抠像等。支持动画制作&#xff0c;包括关键帧动画、形状动画、运动跟踪等工具&#xff0c;…...

自己实现一个自动检测网卡状态,并设置ip地址

阅读本文前&#xff0c;请先学习下面几篇文章 《搞懂进程组、会话、控制终端关系&#xff0c;才能明白守护进程干嘛的&#xff1f;》 《简简单单教你如何用C语言列举当前所有网口&#xff01;》 《Linux下C语言操作网卡的几个代码实例&#xff01;特别实用》 《安卓如何设置…...

【Linux】进程程序替换

文章目录 替换原理站在进程的角度站在程序的角度初体验及理解原理 替换函数函数解释命名理解exec系列函数与main函数之间的关系在一个程序中调用我们自己写的程序 替换原理 创建子进程的目的是什么&#xff1f; ->想让子进程执行父进程代码的一部分 执行父进程对应的磁盘代码…...

项目构建工具maven的基本配置+idea 中配置 maven

&#x1f451; 博主简介&#xff1a;知名开发工程师 &#x1f463; 出没地点&#xff1a;北京 &#x1f48a; 2023年目标&#xff1a;成为一个大佬 ——————————————————————————————————————————— 版权声明&#xff1a;本文为原创文…...

【解密ChatGPT】:从过去到未来,揭示其发展与变革

&#x1f38a;专栏【ChatGPT】 &#x1f33a;每日一句&#xff1a;天行健,君子以自强不息,地势坤,君子以厚德载物 ⭐欢迎并且感谢大家指出我的问题 文章目录 一、ChatGPT的发展历程 二、ChatGPT的技术原理 三、ChatGPT的应用场景 四、ChatGPT的未来趋势 五、总结 引言:随着…...

系统架构设计】计算机公共基础知识: 5 数学与经济管理

一 运筹方法 1 线性规划 线性规划问题的数学模型通常由线性目标函数、线性约束条件、变量非负条件组成,特点如下: (1)线性规划的可行解域是由一组线性约束条件形成的。 (2)如果存在两个最优解,则连接这两点的线段内所有的点都是最优解,而线段两端延长线上可能会超出…...

Visual Studio 2019光标变成灰色方块问题

文章目录 Visual Studio 2019光标变成灰色方块问题问题描述解决方案 Visual Studio 2019光标变成灰色方块问题 问题描述 单击和双击都无法选中单词&#xff0c;总是选择整行或者是当前光标处的前几个字符一起选中&#xff0c;没有规则&#xff0c;貌似选择单词复制&#xff0…...

C++ http协议POST body raw 字段向服务器发送请求

环境&#xff1a;ubuntu系统c使用http协议不是很方便&#xff0c;通过curl库我们可以很方便使用http协议&#xff0c;由于我的请求方式比较特殊&#xff0c;在网上没有找到相关的资料&#xff0c;之前使用python实现过一版&#xff0c;但是当设备数量超过100台时&#xff0c;程…...

通过migrate命令实现两个redis实例之间的数据迁移

本文适用于将源服务器的redis实例的key的数据迁移到其他服务器的redis实例 一、migrate简介&#xff1a; migrate用于在Redis实例间进行数据迁移&#xff0c;实际上migrate命令是将dump、restore、del三个命令进行组合&#xff0c;从而简化了操作流程。migrate命令具有原子性&…...

Unity 判断两个UI是否相交

今天碰到要判断两个UI是否相交的交互。 尝试了下&#xff0c;发现有两个方法都成功了。 1、使用Collider2D组件 分别创建两个Image组件&#xff0c;并且添加Collider2D组件&#xff0c;其中一个还要添加Rigidbody2D组件&#xff0c;如下图&#xff1a; 然后创建个判断脚本“…...

swoole process 消息通信

swoole文档&#xff1a;Swoole 文档 process子进程和父进程之间通信&#xff0c;依靠监听。子进程和父进程分别做监听。父进程写入信息&#xff0c;子进程监听接收。子进程向父进程写入&#xff0c;调用父进程监听。 子进程向父进程写入信息有两种方式&#xff0c;一种调用wr…...