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 facexlib

pip 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序】新版获取手机号码实现一键登录(uniapp语法)(完整版附源码)

需求 如图&#xff0c;点击按钮&#xff0c;获取用户手机号实现一键登录&#xff0c;当然&#xff0c;用户也可以自行输入其他手机号进行登录 问题 要想获取用户手机号并不复杂&#xff0c;但由于近几年微信小程序获取手机号的api进行了更新&#xff0c;当前很多帖子使用的…

VB.NET—DataGridView控件教程详解

目录 前言: 过程: 第一步: 第二步: 第三步: 第四步: 第五步&#xff1a; 番外篇: 总结: 前言: DataGridView是.NET FormK中的一个Windows窗体控件&#xff0c;它提供了一个可视化的表格控件&#xff0c;允许用户以表格形式显示和编辑数据。它通常用于显示和编辑数据库…

Rust教程5:泛型和特征

文章目录 泛型函数特征特征泛型 Rust系列&#xff1a;初步⚙所有权⚙结构体和枚举类⚙函数进阶 泛型函数 Rust采纳了C中的泛型机制&#xff0c;并且形式上也几乎借鉴了C&#xff0c;示例如下 fn add<T: std::ops::Add<Output T>>(a:T, b:T) -> T {a b } fn…

Java智慧工地管理平台可视化大数据建造工地APP源码

建筑行业是国民经济的重要物质生产部门和支柱产业之一&#xff0c;同时&#xff0c;建筑业也是一个安全事故多发的高危行业。如何加强施工现场安全管理、降低事故发生频率、杜绝各种违规操作和不文明施工、提高建筑工程质量&#xff0c;是摆在各级政府部门、施工企业面前的一道…

一文学会Scala【Scala一站式学习笔记】

文章目录 为什么要学习Scala语言什么是Scala如何快速掌握Scala语言Scala环境安装配置Scala命令行 Scala的基本使用变量数据类型操作符if 表达式语句终结符循环高级for循环 Scala的集合体系集合SetListMapArrayArrayBuffer数组常见操作Tuple总结 Scala中函数的使用函数的定义函数…

Python+Selenium+Unittest 之selenium12--WebDriver操作方法2-鼠标操作1(ActionChains类简介)

在我们平时的使用过程中&#xff0c;会使用鼠标去进行很多操作&#xff0c;比如鼠标左键点击、双击、鼠标右键点击&#xff0c;鼠标指针悬浮、拖拽等操作。在selenium中&#xff0c;我们也可以去实现常用的这些鼠标操作&#xff0c;这时候就需要用到selenium中的ActionChains类…

Android transform旋转rotate圆角矩形图roundedCorners,Kotlin

Android transform旋转rotate圆角矩形图roundedCorners&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.…

【IO多路转接】pollepoll

文章目录 1 :peach:poll:peach:1.1 :apple:poll函数接口:apple:1.2 :apple:poll接口的使用:apple:1.3 :apple:poll的优缺点:apple: 2 :peach:epoll:peach:2.1 :apple:epoll函数接口:apple:2.1.1 :lemon:epoll_create:lemon:2.1.2 :lemon:epoll_ctl:lemon:2.1.3 :lemon:epoll_wa…

pcie对phy的skew要求

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 pcie的设计中有这样一条要求&#xff0c;所有但phy/tx*_clk pin的clock skew要小于skew要求。 这里提供一下实现方法&#xff0c;如果你有更好的办法可以在评论区留言或者私信…

利用maven的dependency插件将项目依赖从maven仓库中拷贝到一个指定的位置

https://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html 利用dependency:copy-dependencies可以将项目的依赖从maven仓库中拷贝到一个指定的位置。 使用默认配置拷贝依赖 如果直接执行mvn dependency:copy-dependencies&#xff0c;是将项目…

IP地址与MAC地址(硬件地址)的区别

IP地址和硬件地址都是用于标识网络设备的地址&#xff0c;但它们的作用和使用方式不同。IP地址是用于在网络中唯一标识一个设备的逻辑地址它是由网络协议栈分配的&#xff0c;可以动态地分配和改变。而硬件地址是设备的物理地址&#xff0c;也称为MAC地址&#xff0c;是由设备制…

TCP/IP的基础知识

文章目录 TCP/IP的基础知识硬件&#xff08;物理层&#xff09;网络接口层&#xff08;数据链路层&#xff09;互联网层&#xff08;网络层&#xff09;TCP/IP的具体含义传输层应用层&#xff08;会话层以上的分层&#xff09;TCP/IP分层模型与通信示例发送数据包的一个例子接收…

什么是微服务?与分布式又有什么区别?

什么是微服务&#xff0c;我们先从传统的单体结构进行了解&#xff0c;对两者进行对比。 单体结构 单体结构是一种传统的软件架构模式&#xff0c;它将应用程序划分为一组相互依赖的模块和组件。这些模块和组件通常都是构建在同一个平台上的&#xff0c;并且紧密耦合在一起。…

一种可以实现安全便捷文件摆渡的跨网文件安全交换软件

为了保护数据的安全性和完整性&#xff0c;很多企业都采用了内外网物理隔离的方式&#xff0c;防止核心数据泄露或被恶意篡改。然而&#xff0c;这也给企业内部或与外部合作伙伴之间的文件交换带来了很多不便和挑战。如何在保证数据安全的前提下&#xff0c;实现跨网文件的快速…

【h5 uniapp】 滚动 滚动条,数据跟着变化

uniapp项目 需求&#xff1a; 向下滑动时&#xff0c;数据增加&#xff0c;上方的日历标题日期也跟着变化 向上滑动时&#xff0c;上方的日历标题日期跟着变化 实现思路&#xff1a; 初次加载目前月份的数据 以及下个月的数据 this.getdate()触底加载 下个月份的数据 onReach…

缓冲流详解

缓冲流概述 缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。 作用&#xff1a;缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能。 字节缓冲流 字节缓冲流性能优化原理&#xff1a; 字节缓冲输入流自带了8KB缓冲池&#xff0c;以后我们直接…

计算机找不到MSVCR120.dll,MSVCR120.dll丢失的三种解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“MSVCR120.dll丢失”。这个错误通常出现在运行某些程序时&#xff0c;导致程序无法正常启动。那么&#xff0c;如何解决MSVCR120.dll丢失的问题呢&#xff1f;小编将详细介绍解决方法&#…

第二证券:北交所30%的涨跌幅限制?

随着我国股市的不断发展&#xff0c;股市生意的涨跌幅束缚也成为了一个备受注重的论题。在北交所&#xff0c;股票的涨跌幅束缚为30%&#xff0c;这一束缚是否合理呢&#xff1f;本文将从多个角度进行剖析。 首先&#xff0c;涨跌幅束缚对于股市的安稳起着重要的效果。股票价格…

JavaScript使用对象

对象(object)是最基本、最通用的类型&#xff0c;具有复合性结构&#xff0c;属于引用型数据&#xff0c;对象的结构具有弹性&#xff0c;内部的数据是无序的&#xff0c;每个成员被称为属性。在JavaScript中&#xff0c;对象是一个泛化的概念&#xff0c;任何值都可以转换为对…

任正非说:流程的作用就三个:一是正确及时交付,二是赚到钱,三是没有腐败。

你好&#xff01;这是华研荟【任正非说】系列的第32篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、流程的作用就三个&#xff1a;一是正确及时交付&#xff0c;二是赚到钱&#xff0c;三是没有腐败。如果这三个目的都实现了…