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

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署LivePortrait :通过缝合和重定向控制实现高效的肖像动画制作

目录

项目论文介绍 

论文中实际开展的工作

非扩散性的肖像动画

基于扩散的肖像动画

方法论

基于Ubuntu的部署实践开始

1. 克隆代码并准备环境

2. 下载预训练权重

3. 推理

快速上手

驱动视频自动裁剪

运动模板制作

4. Gradio 界面

5. 推理速度评估

社区资源


政安晨的个人主页:政安晨

欢迎 👍点赞✍评论⭐收藏

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

本文目标:在Ubuntu系统上部署使用LivePortrait ,感谢快手团队对开源世界的贡献。

项目地址:https://github.com/KwaiVGI/LivePortrait

论文地址:https://arxiv.org/pdf/2407.03168


项目论文介绍 

上图表达:该项目的模型产生了定性肖像动画。只要输入一张静态的肖像图像,我们的模型就能将其制作成生动的动画、确保无缝拼接,并能精确控制眼睛和嘴唇的动作。

肖像动画旨在从单个源图像中合成逼真的视频,使用它作为外观参考,并利用来自驱动视频、音频、文本或生成的运动(即面部表情和头部姿态)。

该项目不按照主流的基于扩散的方法进行探索和扩展,而是探索和扩展了基于隐式关键点的框架的潜力,该框架能够有效地平衡计算效率和可控性。在此基础上,该项目开发了一个名为LivePortrait的视频驱动肖像动画框架,重点关注更好的泛化性、可控性和效率,以便实际应用。为了提高生成质量和泛化能力,我们将训练数据扩大到约6900万帧高质量图像,采用混合图像-视频训练策略,升级网络架构,并设计更好的运动转换和优化目标。此外,我们发现紧凑的隐式关键点可以有效地表示一种混合形状,并精心提出了一个拼接和两个重新定位模块,利用小型MLP几乎没有计算开销,以增强可控性。实验结果表明,即使与基于扩散的方法相比,我们的框架也显著有效。在配备PyTorch的RTX 4090 GPU上,生成速度达到了12.8毫秒。

现如今,人们经常使用智能手机或其他录像设备来捕捉静态肖像,记录他们宝贵的时刻。iPhone上的实况照片功能可以通过录制拍摄前后1.5秒的时刻将静态肖像变得生动起来,可能是通过一种形式的视频录制实现的。然而,基于最近的进展,如生成对抗网络(GANs)和扩散,各种肖像动画方法使得将静态肖像转化为动态肖像成为可能,而不依赖于特定的录像设备。

在这篇论文中,我们的目标是给静态肖像图像添加动画,使其更具真实感和表现力,并同时追求高推理效率和精确可控性。尽管基于扩散的肖像动画方法在质量方面取得了令人印象深刻的结果,但它们通常计算成本高昂,并且缺乏精确的可控性,例如缝合控制。相反,我们广泛探索了基于隐式关键点的视频驱动框架,并扩展了它们的潜力,以有效平衡通用能力、计算效率和可控性。

论文中实际开展的工作

最近的基于视频的肖像动画方法可以分为非扩散和扩散两种方法,如表所总结。

视频驱动的肖像动画方法摘要

非扩散性的肖像动画

对于非扩散模型,基于隐式关键点的方法使用隐式关键点作为中间运动表示,并通过光流将源肖像图与驱动图像扭曲。FOMM  在每个关键点附近执行一阶Taylor展开,并使用局部仿射变换近似每个关键点附近的运动。MRAA 利用基于PCA的运动估计表示了关节动作。Face vid2vid  通过引入3D隐式关键点表示扩展了FOMM,并实现了自由视角的肖像动画。IWA  基于跨模态注意力改进了扭曲机制,可以扩展到使用多个源图像。为了更灵活地估计光流并更好地处理大尺度运动,TPSM 使用非线性薄板样条变换表示更复杂的运动。同时,DaGAN 利用密集深度图来估计捕捉关键驱动运动的隐式关键点。MCNet 设计了一个以身份表示为条件的记忆补偿网络,以解决复杂驱动运动引起的生成模糊问题。

该项目在工作中使用了预定义的动作表示,如3DMM blendshapes。另一些工作提出了从头学习潜在表达表示的方法。MegaPortrait利用高分辨率图像升级动画分辨率到百万像素。EMOPortraits使用一个富含表情的训练视频数据集和表情增强的损失来表达强烈的动作。

基于扩散的肖像动画

扩散模型通过迭代地去除噪音,从高斯噪声中合成所需的数据样本。之后,提出了潜在扩散模型(LDMs),并将训练和推理过程转移到压缩的潜在空间中以进行高效计算。LDMs已广泛应用于全身舞蹈生成、音频驱动的肖像动画和视频驱动的肖像动画等许多并发工作中。

FADM 是第一个基于扩散的肖像动画方法。它通过预训练的隐式关键点模型获得粗略的动画结果,然后在3DMMs的指导下使用扩散模型得到最终的动画效果。Face Adapter 使用身份适配器来增强源肖像的身份保持,并使用空间条件生成器来生成明确的空间条件,即关键点和前景遮罩,作为中间的动作表示。

一些作品使用了相互自注意力和类似于AnimateAnyone 的时间注意力架构,以实现更好的图像质量和外观保持。AniPortrait 使用明确的空间条件,即关键点,作为中间运动表示方法。X-Portrait 提出直接使用原始驱动视频来为肖像画提供动画效果,而不是使用中间的运动表示方法。它使用了基于隐式关键点的方法进行跨身份训练。MegActor 也使用原始驱动视频来为源肖像画提供动画效果。它使用现有的人脸交换和风格化框架来获取跨身份训练对,并对背景外观进行编码以提高动画的稳定性。

方法论

该项目首先简要回顾了基于视频的人像动画框架face vid2vid ,并介绍了项目的重要改进,旨在增强动画的泛化能力和表现力。然后,论文介绍了精心设计的拼接和重新定位模块(感兴趣的小伙伴可以看原始论文,我们这里是为大家基于ubuntu系统部署项目并应用,所以,论文部分仅是简要介绍,小伙伴们多包涵,嘻嘻 —— 政安晨注),这些模块提供了所需的可控性,且计算开销极小。最后,论文详细介绍了推理流程。

关键效果对比:


咱们接下来即将部署的这个名为 LivePortrait 的 repo 包,含有论文 LivePortrait 的官方 PyTorch 实现: 具有拼接和重定向控制功能的高效肖像动画的 PyTorch 官方实现。 项目团队也正在积极更新和改进此软件源。


基于Ubuntu的部署实践开始

1. 克隆代码并准备环境

git clone https://github.com/KwaiVGI/LivePortrait
cd LivePortrait# create env using conda
conda create -n LivePortrait python=3.9
conda activate LivePortrait# install dependencies with pip
# for Linux and Windows users
pip install -r requirements.txt
# for macOS with Apple Silicon users
pip install -r requirements_macOS.txt

过程演绎如下:

下载项目

 

建立环境

安装依赖

注意:确保您的系统已安装 FFmpeg,包括 ffmpeg 和 ffprobe! - 项目团队说明
 —— 在咱们这篇实验中,政安晨的电脑已经安装。

2. 下载预训练权重

下载预训练权重的最简单方法是从 HuggingFace 下载:

# first, ensure git-lfs is installed, see: https://docs.github.com/en/repositories/working-with-files/managing-large-files/installing-git-large-file-storage
git lfs install
# clone and move the weights
git clone https://huggingface.co/KwaiVGI/LivePortrait temp_pretrained_weights
mv temp_pretrained_weights/* pretrained_weights/
rm -rf temp_pretrained_weights

确保目录结构如下或包含以下内容:

pretrained_weights
├── insightface
│   └── models
│       └── buffalo_l
│           ├── 2d106det.onnx
│           └── det_10g.onnx
└── liveportrait
    ├── base_models
    │   ├── appearance_feature_extractor.pth
    │   ├── motion_extractor.pth
    │   ├── spade_generator.pth
    │   └── warping_module.pth
    ├── landmark.onnx
    └── retargeting_models
        └── stitching_retargeting_module.pth

3. 推理

快速上手

# For Linux and Windows
python inference.py# For macOS with Apple Silicon, Intel not supported, this maybe 20x slower than RTX 4090
PYTORCH_ENABLE_MPS_FALLBACK=1 python inference.py

如上图所示,在执行推理的过程中,您可能会遇到错误,重新安装几个包,如我下图:

再重新执行推理:

成功!

 

查看帮助:

如果脚本运行成功,就会得到一个名为 animations/s6--d0_concat.mp4 的 mp4 输出文件。 该文件包括以下结果:驱动视频、输入图像或视频以及生成结果。

或者,也可以通过指定 -s 和 -d 参数来更改输入:

# source input is an image
python inference.py -s assets/examples/source/s9.jpg -d assets/examples/driving/d0.mp4# source input is a video ✨
python inference.py -s assets/examples/source/s13.mp4 -d assets/examples/driving/d0.mp4# more options to see
python inference.py -h

后面的用法,小伙伴们自己探索吧!

驱动视频自动裁剪

若要使用自己的驱动视频,建议您:

—— Crop it to a 1:1 aspect ratio (e.g., 512x512 or 256x256 pixels), or enable auto-cropping by --flag_crop_driving_video.
—— Focus on the head area, similar to the example videos.
—— Minimize shoulder movement.
—— Make sure the first frame of driving video is a frontal face with neutral expression.

以下是通过 --flag_crop_driving_video 进行自动裁剪的案例:

python inference.py -s assets/examples/source/s9.jpg -d assets/examples/driving/d13.mp4 --flag_crop_driving_video

如果发现自动裁剪效果不佳,可以修改 --scale_crop_driving_video、--vy_ratio_crop_driving_video 选项来调整缩放比例和偏移量,或者手动调整。

运动模板制作

您还可以使用自动生成的以 .pkl 结尾的运动模板文件来加快推理速度,并保护隐私,例如:

python inference.py -s assets/examples/source/s9.jpg -d assets/examples/driving/d5.pkl # portrait animation
python inference.py -s assets/examples/source/s13.mp4 -d assets/examples/driving/d5.pkl # portrait video editing

4. Gradio 界面

我们还提供了 Gradio 界面,只需运行即可获得更好的体验:

# For Linux and Windows users (and macOS with Intel??)
python app.py# For macOS with Apple Silicon users, Intel not supported, this maybe 20x slower than RTX 4090
PYTORCH_ENABLE_MPS_FALLBACK=1 python app.py

您可以根据需要指定 --server_port、--share 和 --server_name 参数!

我们还提供了一个加速选项--flag_do_torch_compile。 首次推理会触发一个优化过程(约一分钟),使后续推理速度提高 20-30%。 不同 CUDA 版本的性能提升可能有所不同。

# enable torch.compile for faster inference
python app.py --flag_do_torch_compile

注意:Windows 和 macOS 不支持此方法。

—— 这也是政安晨坚持探索Linux部署应用各类开源AI框架的原因。

5. 推理速度评估

我们还提供了一个脚本,用于评估每个模块的推理速度:

# For NVIDIA GPU
python speed.py

以下是使用本地 PyTorch 框架和 torch.compile 在 RTX 4090 GPU 上推断一帧图像的结果:

ModelParameters(M)Model Size(MB)Inference(ms)
Appearance Feature Extractor0.843.30.82
Motion Extractor28.121080.84
Spade Generator55.372127.59
Warping Module45.531745.21
Stitching and Retargeting Modules0.232.30.31

注:"缝合 "和 "重定向 "模块的数值代表三个连续 MLP 网络的综合参数数量和总推理时间。

社区资源

探索项目社区提供的宝贵资源,提升您的 LivePortrait 体验:

  • ComfyUI-LivePortraitKJ by @kijai
  • comfyui-liveportrait by @shadowcz007
  • LivePortrait In ComfyUI by @Benji
  • LivePortrait hands-on tutorial by @AI Search
  • ComfyUI tutorial by @Sebastian Kamph
  • Replicate Playground and cog-comfyui by @fofr

项目社区一定是还做出了更多了不起的贡献!


再次感谢开源项目团队的付出,该项目在Ubuntu系统上部署执行,很好地推动了一些相关工作的进展!

相关文章:

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署LivePortrait :通过缝合和重定向控制实现高效的肖像动画制作

目录 项目论文介绍 论文中实际开展的工作 非扩散性的肖像动画 基于扩散的肖像动画 方法论 基于Ubuntu的部署实践开始 1. 克隆代码并准备环境 2. 下载预训练权重 3. 推理 快速上手 驱动视频自动裁剪 运动模板制作 4. Gradio 界面 5. 推理速度评估 社区资源 政安…...

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代,信息安全的重要性不言而喻,尤其当涉及到个人隐私和账户安全时。每天,无数的用户登录各种在线服务,从社交媒体到银行账户,再到电子邮件和云存储服务。这些服务的背后,是复杂的系统架构&am…...

RedHat8安装Oracle19C

RedHat8安装Oracle19C 1、 更新yum源 更新yum源为阿里云镜像源: # 进入源目录 cd /etc/yum.repos.d/ # 删除 redhat 默认源 rm redhat.repo # 下载阿里云的centos7源 curl -O http://mirrors.aliyun.com/repo/Centos-8.repo # 替换 Centos-8.repo 中的 $releasev…...

React系列面试题

大家好,我是有用就点赞,有用就扩散。 1.React的组件间通信都有哪些形式? 父传子:在React中,父组件调用子组件时可以将要传递给子组件的数据添加在子组件的属性中,在子组件中通过props属性进行接收。这个就…...

C#:通用方法总结—第6集

大家好&#xff0c;今天继续介绍我们的通用方法系列。 下面是今天要介绍的通用方法&#xff1a; &#xff08;1&#xff09;这个通用方法为SW查找草图数量 /// <summary> /// 查找草图数量 /// </summary> /// <param name"doc2"></param>…...

Spark实时(一):StructuredStreaming 介绍

文章目录 Structured Streaming 介绍 一、SparkStreaming实时数据处理痛点 1、复杂的编程模式 2、SparkStreaming处理实时数据只支持Processing Time 3、微批处理,延迟高 4、精准消费一次问题 二、StructuredStreaming架构与场景应用 三、​​​​​​​​​​​​​​…...

LangChain4j-RAG基础

RAG是什么 简而言之&#xff0c;RAG 是一种在将数据发送到 LLM 之前从数据中查找相关信息并将其注入到提示中的方法。这样LLM将获得&#xff08;希望&#xff09;相关信息&#xff0c;并能够使用这些信息进行回复&#xff0c;这应该会减少产生幻觉的可能性。 实现方法: 全文…...

git--本地仓库修改同步到远程仓库

尝试将本地分支推送到远程仓库时&#xff0c;出现一个非快速前进的错误。通常是因为远程仓库中的分支包含本地分支没有的提交。在推送之前&#xff0c;需要将远程仓库的更改合并到本地分支。 解决步骤如下&#xff1a; 切换到你的本地分支&#xff1a; 确保处于想要推送的分支…...

剑和沙盒 3 - 深度使用和解析Windows Sandbox

介绍 两年前&#xff0c;微软作为Insiders build 18305的一部分发布了一项新功能- Windows Sandbox。 该沙箱具有一些有用的规格&#xff1a; Windows 10&#xff08;Pro/Enterprise&#xff09;的集成部分。在 Hyper-V 虚拟化上运行。原始且可抛弃 – 每次运行时都干净地开…...

深度学习loss

pytorch模型训练demo代码 在PyTorch中&#xff0c;模型训练通常涉及几个关键步骤&#xff1a;定义模型、定义损失函数、选择优化器、准备数据加载器、编写训练循环。以下是一个简单的PyTorch模型训练演示代码&#xff0c;该代码实现了一个用于手写数字识别&#xff08;使用MNIS…...

编写一个Chrome插件,网页选择文字后,右键出现菜单“search with bing”,选择菜单后用bing搜索文字

kimi ai 生成&#xff0c;测试可用&#xff0c;需要自行准备图标文件 创建一个简单的Chrome插件来实现选择文本后的搜索功能&#xff0c;你需要完成以下几个步骤&#xff1a; 创建插件的基础文件夹和文件&#xff1a; 创建一个文件夹用于存放插件的所有文件。在该文件夹中创建以…...

【算法】分割回文串

难度:中等 题目: 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1: 输入:s = “aab” 输出:[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输入:s = “a” 输出:[[“a”]] 提示: 1 <= s.length <…...

lua 游戏架构 之 游戏 AI (三)ai_attack

这段Lua脚本定义了一个名为 ai_attack 的类&#xff0c;继承自 ai_base 类。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读119次。定义了一套接口和属性&#xff0c;可以基于这个基础类派生出具有特定行为的AI组件。例如&#xff0c;可以…...

大数据之Oracle同步Doris数据不一致问题

数据同步架构如下&#xff1a; 出现的问题&#xff1a; doris中的数据条数 源库中的数据条数 总数完全不一致。 出现问题的原因&#xff1a; 在Dinky中建立表结构时&#xff0c;缺少对主键属性的限制 primary key(ID) not enforced 加上如上语句&#xff0c;数据条数解决一致 …...

visual studio 问题总结

一. Visual Studio: 使用简体中文&#xff08;GB2312&#xff09;编码加载文件, 有些字节已用Unicode替换字符更换 解决方法&#xff1a;vs 工具-》选项-》文本编辑器...

go-错误码的最佳实践

一、背景 在工程开发中&#xff0c;我们有以下场景可以用错误码解决 我们不太方便直接将内部的错误原因暴露给外部&#xff0c;可以根据错误码得到对应的外部暴露消息通过设定错误码判断是客户端或者服务端的问题&#xff0c;避免不必要的排障浪费方便查找日志&#xff0c;定…...

Python面试题:使用Matplotlib和Seaborn进行数据可视化

使用Matplotlib和Seaborn进行数据可视化是数据分析中非常重要的一部分。以下示例展示了如何使用这两个库来创建各种图表&#xff0c;包括基本的线图、柱状图、散点图和高级的分类数据可视化图表。 安装 Matplotlib 和 Seaborn 如果你还没有安装这两个库&#xff0c;可以使用以…...

模拟实现c++中的vector模版

目录 一vector简述&#xff1a; 二vector的一些接口函数&#xff1a; 1初始化&#xff1a; 2.vector增长&#xff1a; 3vector增删查改&#xff1a; 三vector模拟实现部分主要函数&#xff1a; 1.size,capacity,empty,clear接口&#xff1a; 2.reverse的实现&#xff1…...

uniapp安卓通过绝对路径获取文件

uniapp安卓通过绝对路径获取文件 在uniapp中&#xff0c;如果你想要访问安卓设备上的文件&#xff0c;你需要使用uniapp提供的plus.io API。这个API允许你在应用内访问设备的文件系统。 以下是一个示例代码&#xff0c;展示了如何使用plus.io API来获取文件&#xff1a; fun…...

Known框架实战演练——进销存业务单据

本文介绍如何实现进销存管理系统的业务单据模块&#xff0c;业务单据模块包括采购进货单、采购退货单、销售出货单、销售退货单4个菜单页面。由于进销单据字段大同小异&#xff0c;因此设计共用一个页面组件类。 项目代码&#xff1a;JxcLite开源地址&#xff1a; https://git…...

解决npm依赖树冲突的方法以及npm ERR! code ERESOLVE错误的解决方案

一、问题描述 在使用ng new myapp --skip-install 构建Angular 项目后&#xff0c;尝试用npm install 安装依赖的时候报了以下错误。 (base) PS C:\Users\Administrator\Desktop\agtest\myapp> npm i npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependenc…...

Spring Boot + Spring Batch + Quartz 整合定时批量任务

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 最近一周&#xff0c;被借调到其他部门&#xff0c;赶一个紧急需求&#xff0c;需求内容如下&#xff1a; PC网页触发一条设备升级记录&#xff08;下图&#xff09;&#xff0c;后台要定时批量设备更…...

C++STL简介(二)

目录 1.模拟实现string 1.string基本属性和大体框架 2.基本函数 2.1size&#xff08;&#xff09; 2.2 [] 2.3 begin() 和end() 2.4capacity&#xff08;&#xff09; 2.5 reserve 2.6push_back 2.7 append 2.8 2.9insert 2.10find 2.11substr 2.12 2.12 < …...

嵌入式高频面试题100道及参考答案(3万字长文)

目录 解释嵌入式系统的定义和主要特点 描述微处理器与微控制器的主要区别 什么是ARM体系结构?它在嵌入式系统中有哪些优势? 解释GPIO(通用输入输出)的工作原理 什么是ADC和DAC?它们在嵌入式系统中的作用是什么? 解释中断的概念及其在实时系统中的重要性 描述SPI(串…...

python爬虫-事件触发机制

今天想爬取一些政策&#xff0c;从政策服务 (smejs.cn) 这个网址爬取&#xff0c;html源码找不到链接地址&#xff0c;通过浏览器的开发者工具&#xff0c;点击以下红框 分析预览可知想要的链接地址的id有了&#xff0c;进行地址拼接就行 点击标头可以看到请求后端服务器的api地…...

LeetCode-day27-3106. 满足距离约束且字典序最小的字符串

LeetCode-day27-3106. 满足距离约束且字典序最小的字符串 题目描述示例示例1&#xff1a;示例2&#xff1a;示例3&#xff1a; 思路代码 题目描述 给你一个字符串 s 和一个整数 k 。 定义函数 distance(s1, s2) &#xff0c;用于衡量两个长度为 n 的字符串 s1 和 s2 之间的距…...

C++中的static_cast函数

static_cast 是 C 中的一个类型转换操作符&#xff0c;用于在编译时进行类型转换。它主要用于基本数据类型之间的转换&#xff0c;以及类的指针或引用之间的向上转换&#xff08;将派生类指针或引用转换为基类指针或引用&#xff09;和某些情况下的向下转换&#xff08;将基类指…...

从零开始学习网络安全渗透测试之基础入门篇——(二)Web架构前后端分离站Docker容器站OSS存储负载均衡CDN加速反向代理WAF防护

Web架构 Web架构是指构建和管理Web应用程序的方法和模式。随着技术的发展&#xff0c;Web架构也在不断演进。当前&#xff0c;最常用的Web架构包括以下几种&#xff1a; 单页面应用&#xff08;SPA&#xff09;&#xff1a; 特点&#xff1a;所有用户界面逻辑和数据处理都包含…...

2679. 矩阵中的和

两种方法&#xff1a; 第一种&#xff1a;先对二维列表的每一列进行排序&#xff0c;然后对每一列的数据进行逐个比较&#xff0c;找出最大值。 class Solution:def matrixSum(self, nums: list[list[int]]) -> int:result0mlen(nums)nlen(nums[0])for i in range(m):nums…...

Unity Playables:下一代动画与音频序列

Unity的Playables API是一种灵活的系统&#xff0c;用于创建和控制动画、音频以及其他形式的连续媒体序列。它为开发者提供了一种全新的方法来处理游戏中的时间序列&#xff0c;包括动画、音频、特效等。本文将探讨Playables的基本概念、如何使用Playables API实现动画&#xf…...