深度学习系列65:数字人openHeygen详解

news2024/12/23 18:00:19

1. 主流程分析

从inference.py函数进入,主要流程包括:
1) 使用cv2获取视频中所有帧的列表,如下:
在这里插入图片描述
2)定义Croper。核心代码为69行:full_frames_RGB, crop, quad = croper.crop(full_frames_RGB)。其中crop是头肩位置,quad是人脸位置,得到的新的full_frames_RGB为人脸区域的截图。(此函数在ffhq_preprocess.py中),此时图像如下:
在这里插入图片描述

  1. 将头肩区域full_frames_RGB重新resize到(256,256)得到frames_pil,然后使用KeypointExtractor(face3d库,调用的是face_alignment包)获取关键点lm。lm在frames_pil上的图如下:
    在这里插入图片描述
  2. 加载3d人脸重建模型(这里是一个resnet50模型),并用face3d库的lm3d函数加载BFM模型,生成人脸模型参数semantic_npy,并加载表情expression.mat,得到img_stablized。这里使用中性表情,处理后的结果如下:
    在这里插入图片描述

5)进行图像增强,使用的是GPEN-BFR-512模型,图片变高清了:
在这里插入图片描述
6)接下来加载wav语音文件,并拆成块
7)进行lipSync,如下图
在这里插入图片描述
8) 将lipsync的结果贴到原图上,然后找嘴部的mask
在这里插入图片描述
在这里插入图片描述
9) 使用mask,将新图和原图进行poisson blending即可:
在这里插入图片描述

2. dlib做人脸和关键点检测

参见http://dlib.net/face_landmark_detection.py.html
使用模型为:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
做人脸检测部分:detector = dlib.get_frontal_face_detector()
关键点检测部分predictor = dlib.shape_predictor(‘checkpoints/shape_predictor_68_face_landmarks.dat’)

对应项目的utils.ffhq_preprocess.Croper。结果绘制如下:

for lmi in lm:
    rr, cc=draw.ellipse(lmi[1],lmi[0],10,10)
    draw.set_color(img,[rr,cc],[255,0,0])
rr, cc=draw.polygon_perimeter([y1,y1,y2,y2],[x1,x2,x2,x1])
draw.set_color(img,[rr,cc],[255,0,0])
plt.imshow(img,plt.cm.gray)

在这里插入图片描述

3. face3D库做人脸3dmm

定义的代码为88-89行:
net_recon = load_face3d_net(args.face3d_net_path, device)
lm3d_std = load_lm3d(‘checkpoints/BFM’)

其中加载模型结构load_face3d_net引用的是utils.inference_utils。
加载参数load_lm3d引用的是third_part.face3d.util.load_mats
计算获得coeff,并加载expression表情参数。

4. GPEN库做人脸增强

third_part.GPEN.gpen_face_enhancer import FaceEnhancement
接下来使用DNet进行人脸增强。DNet首先学习一个GAN来生成高质量人脸图像,然后把它嵌入到一个U型的DNN里面作为先验的decoder,然后再利用合成的低质量人脸图像微调这个’嵌入GAN先验的DNN’。

5. 使用ENet做lipsync

这段是核心部分,很费时间。加载包含LNet的ENet模型。
incomplete, reference = torch.split(img_batch, 3, dim=1)
pred, low_res = model(mel_batch, img_batch, reference)

6. 使用GFPGAN做人脸增强

代码入下:

cropped_faces, restored_faces, restored_img = restorer.enhance(
    ff, has_aligned=False, only_center_face=True, paste_back=True)
    # 0,   1,   2,   3,   4,   5,   6,   7,   8,  9, 10,  11,  12,
mm = [0,   0,   0,   0,   0,   0,   0,   0,   0,  0, 255, 255, 255, 0, 0, 0, 0, 0, 0]
mouse_mask = np.zeros_like(restored_img)
tmp_mask = enhancer.faceparser.process(restored_img[y1:y2, x1:x2], mm)[0]
mouse_mask[y1:y2, x1:x2]= cv2.resize(tmp_mask, (x2 - x1, y2 - y1))[:, :, np.newaxis] / 255.
height, width = ff.shape[:2]
restored_img, ff, full_mask = [cv2.resize(x, (512, 512)) for x in (restored_img, ff, np.float32(mouse_mask))]
img = Laplacian_Pyramid_Blending_with_mask(restored_img, ff, full_mask[:, :, 0], 10)
pp = np.uint8(cv2.resize(np.clip(img, 0 ,255), (width, height)))
pp, orig_faces, enhanced_faces = enhancer.process(pp, xf, bbox=c, face_enhance=False, possion_blending=True)
plt.imshow(pp)

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

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

相关文章

公开课学习——基于索引B+树精准建立高性能索引

文章目录 遇到慢查询怎么办?—— 创建索引联合索引的底层的数据存储结构长什么样? mysql脑图 阿里开发手册 遇到慢查询怎么办?—— 创建索引 不用索引的话一个一个找太慢了,用索引就快的多。 假如使用树这样的结构建立索引&#x…

Spring - 3 ( 12000 字 Spring 入门级教程 )

一:Spring Web MVC入门 1.1 响应 在我们前⾯的代码例子中,都已经设置了响应数据, Http 响应结果可以是数据, 也可以是静态页面,也可以针对响应设置状态码, Header 信息等. 1.2 返回静态页面 创建前端页面 index.html(注意路径) html代码 …

frp 实现 http / tcp 内网穿透(穿透 wordpress )

frp 实现 http / tcp 内网穿透(穿透 wordpress ) 1. 背景简介与软件安装2. 服务端配置2.1 配置文件2.2 wordpress 配置文件2.3 frps 自启动 3.客户端配置3.1 配置文件3.2 frpc 自启动 同步发布在个人笔记frp 实现 http / tcp 内网穿透(穿透 w…

HZNUCTF -- web

HZNUCTF第五届校赛实践赛初赛 Web方向 WriteUp-CSDN博客 ezssti 下载文件 访问 /login 可由源代码中看到 Eval 函数 ,可以任意命令执行 按照格式,可执行命令 POST :name{{.Eval "env"}} 可以得到flag (尝试ls 只能列出…

就业班 第三阶段(负载均衡) 2401--4.19 day3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundan…

微软发布Phi-3 Mini,性能媲美GPT-3.5、Llama-3,可在手机端运行

前言 微软发布了最新版的Phi系列小型语言模型(SLM) - Phi-3。这个系列包括3个不同参数规模的版本:Phi-3 Mini (38亿参数)、Phi-3 Small (70亿参数)和Phi-3 Medium (140亿参数)。 Phi系列模型是微软研究团队开发的小规模参数语言模型。从第一代Phi-1到第二代Phi-2&…

kubebuilder(3)实现operator

在前面的文章我们已经了解了operator项目的基本结构。现在我们来写一点简单的代码,然后把我们的crd和operator部署到k8s集群中。 需求 这是一个真实的需求,只不过做了简化。 在开发公司自己的paas平台,有一个需求是,用户在发版…

【Linux高性能服务器编程】两种高性能并发模式剖析——领导者/追随者模式

hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之两种高性能并发模式介绍,在这篇文章中,你将会学习到高效的创建自己的高性能服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解…

RK3588S和ARM阵列服务器在虚拟化云平台的应用

RK3588是瑞芯微2021年底推出的首款高端8nm旗舰芯片,而RK3588S 则是针对消费端市场在RK3588基础上缩减了部分外围接口,CPU、GPU和NPU等主要参数得到了保留,主要应用范围为高端ARM平板、ARM笔电产品,会议平板类、ARM服务器、智能机器…

利用遥感影像计算大蒜种植面积

大家对大蒜应该不陌生,近几年也经常以"蒜你狠"出现在大众视野。我国是世界大蒜的主要生产国、消费国和出口国,从事大蒜生产的蒜农达500万之多,大蒜产品也远销东南亚、东亚、中东、美洲、 欧洲等地区。大蒜的种植面积是大蒜市场行情的重要影响因…

DRF: 序列化器、View、APIView、GenericAPIView、Mixin、ViewSet、ModelViewSet的源码解析

前言:还没有整理,后续有时间再整理,目前只是个人思路,文章较乱。 注意路径匹配的“/” 我们的url里面加了“/”,但是用apifox等非浏览器的工具发起请求时没有加“/”,而且还不是get请求,那么这…

el-popover放在el-table中点击无反应问题

我们想在table中给btn加弹框但是 el-popover点击按钮没有任何反应思考:通过插槽去添加这个组件el-popover的id是否绑定了一个值解决思路&#xff1a;给每个el-popover都加上单独的id 效果 &#xff1a; 代码 给每个组件都绑定ref <template slot-scope"scope"&g…

组合预测 | Matlab实现LSTM-XGBoost长短期记忆网络组合极限梯度提升树多输入单输出回归预测

组合预测 | Matlab实现LSTM-XGBoost长短期记忆网络组合极限梯度提升树多输入单输出回归预测 目录 组合预测 | Matlab实现LSTM-XGBoost长短期记忆网络组合极限梯度提升树多输入单输出回归预测效果一览基本描述模型描述代码实现参考资料效果一览 基本描述 组合预测 | Matlab实现L…

【性能测试】ChaosTesting(混沌测试)ChaosBlade(混沌实验工具)(四)-k8s容器混沌实验

5. 创建 kubernetes 相关的实验场景 5.0 blade create k8s 5.0.1 介绍 创建 kubernetes 相关的实验场景&#xff0c;除了使用 blade 命令创建场景外&#xff0c;还可以将实验使用 yaml 文件描述&#xff0c;使用 kubectl 命令执行。目前支持的实验场景如下&#xff1a; [bl…

【VueUse】重新定义状态管理在 Vue 中的体验

在 Vue 生态系统中&#xff0c;状态管理一直是开发者们关注的焦点之一。而随着 VueUse 的出现&#xff0c;我们迎来了一种全新的方式来处理状态管理&#xff0c;它让我们能够以更简单、更灵活的方式来管理应用程序的状态。 在本文中我们将深入探讨 VueUse 中与状态管理相关的内…

成功解决ImportError: cannot import name ‘builder‘ from ‘google.protobuf.internal

成功解决ImportError: cannot import name builder from google.protobuf.internal 目录 解决问题 解决思路 解决方法 解决问题 ImportError: cannot import name builder from google.protobuf.internal 解决思路 导入错误:无法从“google.protobuf.internal”导入名称“…

Vscode配置C/C++编程环境@配置C和CPP的运行和调试环境@配置过程的相关问题@中文文件名乱码@build和debug方案组合配置

文章目录 abstractgcc/g文档和用法常见用例 目录.vscode中的相关文件说明tasks.jsonlaunch.jsonc_cpp_properties.json IDE或编辑器配置vscode配置相关指令和快捷键默认task配置和取消默认 配置文件C/C共用一组tasks.json/launch.json文件?关于注释内容示例&#x1f47a;tasks…

【linux】进程地址被占用

在强制关闭一个udp程序后&#xff0c;重启该程序报错&#xff1a; bind error: Address already in use 查找并关闭占用端口的进程&#xff1a; 首先&#xff0c;确定哪个进程占用了目标端口。在Linux系统中&#xff0c;可以使用以下命令&#xff1a; netstat -tulnp | grep …

TensorFlow进阶二(高阶操作)

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

Flutter 上架如何解决 ITMS-91053 问题

最近&#xff0c;我的 Flutter App 发布到 TestFlight 后&#xff0c;就会收到一封邮件&#xff1a;The uploaded build for YOUR APP has one or more issues. 上面的邮件主要是说&#xff0c;我的 App 缺少了调用 API 的声明&#xff0c;以前从来没看到过&#xff0c;上网一查…