【数字人】3、LIA | 使用隐式空间来实现视频驱动单张图数字人生成(ICLR 2022)

news2024/9/25 11:22:45

在这里插入图片描述

文章目录

    • 一、背景
    • 二、方法
      • 2.1 latent motion representation
      • 2.2 latent code driven image animation
      • 2.3 学习方式
      • 2.4 推理
    • 三、效果
      • 3.1 数据集
      • 3.2 训练细节
      • 3.3 评估
      • 3.4 定性效果
      • 3.5 定量效果
      • 3.6 消融实验
      • 3.7 失败示例

论文:Latent Image Animator: Learning to Animate Images via Latent Space Navigation

代码:https://github.com/wyhsirius/LIA

出处:ICLR 2022

一、背景

现有的 image animation 方法一般都使用计算机图形学、语义 map、人体关键点、3D meshs、光流等,这些方法的 gt 需要提前提取出来,在实际使用中会受限。对没见过的人物表现很差。

自监督方法将原始的视频作为输入,使用预测的密集光流场来控制输入图片的运动,这样虽然能够避免对领域知识或标记 gt 的需求,能够提升在任意图像上测试的性能。但这些方法需要明确的结构表达来作为运动指引。其他的先验信息如关键点等,也会使用一个额外的网络来进行端到端训练,作为预测光流场过程的中间特征。虽然这样不需要提前提取 gt label,但也会提升复杂度。

在本文中,为了降低复杂度,作者剔除了额外的分支,而是使用隐空间。本文方法受启发于 GAN、styleGAN、BigGAN

作者提出了 LIA(Latent Image Animate),主要由自编码器构成,通过隐空间来引导对图像的驱动

作者引入了 Linear Motion Decomposition (LMD) ,通过线性组合一系列可学习的运动方向和大小,来表达隐空间中的路径。也就是将这一系列都限制为正交基,每个向量都表示一个基础的视觉变换。

且在 LIA 中,在一个 encoder-generator 结构中的 motion 和 appearance 是解耦的,没有使用分开的网络结构,这样能降低计算量。

二、方法

Self-supervised image animation 的目标将 driving video 的运动迁移到 source image 上,让 source image 按照 driving video 的运动方式动起来

如图 2 所示,本文的想法是通过隐空间来引导运动系数的建模,整个大体过程如图 2 所示

  • 在训练过程中,需要同时输入 source 和 driving image,driving image 是从 video 中随机采样的。两个图像都会编码到隐空间,用于表达运动变化,training 目标是使用学习到的 motion transformation 和 source image 来重建 driving image
  • 在测试过程中,driving video 中的每一帧都会顺序的被处理,来驱动 source subject

在这里插入图片描述

框架结构如图 3 所示,整个模型是自编码器的结构,由两个主要的网络构成

  • encoder E:是第一步,也就是对 source image 和 driving image 进行编码,编码到隐空间,
  • generator G:是第二步,也就是当获得了 target latent code 后,G 会 decode

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1 latent motion representation

给定 source image x s x_s xs 和 driving image x d x_d xd

latent motion representation 也是整个过程的第一步:

学习一个 latent code z s → d   Z ∈ R N z_{s \to d}~ Z \in R^N zsd ZRN 来表达从 x s x_s xs x d x_d xd 的 motion transformation,由于这两个图片都有不确定性,直接学习 z s → d z_{s \to d} zsd 的话比较难,因为需要模型去捕捉非常复杂的运动。所以,在此处假设有一个 reference image x r x_r xr,motion transfer 的过程被建模为 x s → x r → x d x_s \to x_r \to x_d xsxrxd,而不是直接学习 z s → d z_{s \to d} zsd。因此,将 z s → d z_{s \to d} zsd 作为 latent space 的 target point,起始点为 z s → r z_{s \to r} zsr,线性路径为 w r → d w_{r \to d} wrd

在这里插入图片描述

在这里插入图片描述

reference image 如何生成:

在这里插入图片描述

x r x_r xr 到底表达的是什么:

  • 如图 5 所示, x r x_r xr 表达的是 x s x_s xs 的 canonical pose,

在这里插入图片描述

如何学习 w r → d w_{r \to d} wrd:LMD(Linear Motion Decomposition)

  • 首先,学习一组 motion directions D m = { d 1 , . . . , d M } D_m=\{d_1, ... , d_M\} Dm={d1,...,dM} 来在 latent space 表达任意的 path,且限制 D m D_m Dm 作为正交基,其中每个向量都表示运动方向 d i d_i di,且其中每两个向量两两之间都是正交的

    在这里插入图片描述

  • 然后,将 D m D_m Dm 中的每个基都和向量 A r → d = { a 1 , . . . , a M } A_{r \to d}=\{a_1, ..., a_M\} Ard={a1,...,aM} 进行结合, a i a_i ai 表示 d i d_i di 的模值,所以在 latent 空间中的每一个 linear path 都可以使用如下的线性组合来表示,且每个 d i d_i di 都表示一个基, a i a_i ai 表示步长。 A r → d A_{r \to d} Ard 是通过映射 z d → r z_{d \to r} zdr 得到的,是 x d x_d xd 经过 E 后的输出。

    在这里插入图片描述

  • 最后,latent motion representation 如下, D m D_m Dm 中的向量都是可学习的

    在这里插入图片描述

D m D_m Dm 中的方向表示什么:表示点头(d8)、眨眼(d6)、面部表情(d19、d7)等

在这里插入图片描述

在这里插入图片描述

2.2 latent code driven image animation

得到了 z s → d z_{s \to d} zsd 后,就是第二步了,即使用 G 来解码出 flow filed ϕ s → d \phi_{s \to d} ϕsd 并 warp x s x_s xs

G 包含两部分,且为了学习多尺度特征, G 使用了一个残差结构:

  • flow field 生成器 G f G_f Gf:包含 N 个 model 来不同 layer 的生成金字塔的 flow fields ϕ s → d = { ϕ i } 1 N \phi_{s \to d}=\{\phi_i\}_1^N ϕsd={ϕi}1N。从 E 中会获得多尺度 source features x s e n c = { x i e n c } 1 N x_s^{enc}=\{x_i^{enc}\}_1^N xsenc={xienc}1N,然后会在 G f G_f Gf 中进行 warp

    • 如果直接基于 ϕ s → d \phi_{s \to d} ϕsd 来 warp source feature,不能很充分且精确的来重建 driving image,因为在一些位置上会有遮挡,为了更好的预测这些遮挡位置的像素,需要对 warped feature map 进行修复,所以,在 G f G_f Gf 中也根据 { ϕ i } 1 N \{\phi_i\}_1^N {ϕi}1N 预测了 multi-scale mask { m i } 1 N \{m_i\}_1^N {mi}1N,可以 mask 出需要修复的区域

    • 每个残差模型中都有:

        	![在这里插入图片描述](https://img-blog.csdnimg.cn/45d30238ed51419893f36c5ee667cded.png)
      
    • 所以,输出共三个通道,前两个通道是 ϕ i \phi_i ϕi,最后一个通道是 m i m_i mi

  • refinement network G r G_r Gr:基于上面得到的修复后的 feature map f ( x i ′ ) f(x_i') f(xi) 和上一个 G r G_r Gr 得到的上采样后的 image g ( x i − 1 ) g(x_{i-1}) g(xi1),可以得到每个模块的 RGB 图像

    在这里插入图片描述

2.3 学习方式

作者使用 self-supervised 的方法来重建 x d x_d xd,使用了 3 个 loss:

  • reconstruction loss:重建 loss,用于最小化 x d x_d xd x s → d x_{s \to d} xsd 的 pixel-wise L 1 L_1 L1 距离

    在这里插入图片描述

  • perceptual loss:感知 loss,用于最小化感知特征 loss,使用的是 VGG19-based L v g g L_{vgg} Lvgg,衡量 real 和 generated images 的多尺度的 feature map 的距离,尺度分别为 256/128/64/32

    在这里插入图片描述

  • adversarial loss:对抗 loss,为了生成更真实的结果,作者在 x s → d x_{s \to d} xsd 上使用了不饱和的对抗 loss L a d v L_{adv} Ladv

    在这里插入图片描述

整体 loss:

在这里插入图片描述

2.4 推理

在推理阶段,给定一个 driving video 序列 V d = x t 1 T V_d={x_t}_1^T Vd=xt1T,目标是将 V d V_d Vd 的运动转移到 x s x_s xs 上,生成一个新的 video V d → s = { x t → s } 1 T V_{d \to s}=\{x_{t \to s}\}_1^T Vds={xts}1T

如果 V d V_d Vd x s x_s xs 来自同一个 video,则可以使用 absolute transfer 的方式来重建每帧,和训练的过程一样:

在这里插入图片描述

如果 V d V_d Vd x s x_s xs 来自不同的 video,这个时候两个图片中的人物的外貌特征、动作、表情都是不同的,这个时候就要使用 relative transfer 来估计

在这里插入图片描述

三、效果

3.1 数据集

  • VoxCeleb
  • TaichiHD
  • TED-talk

裁剪到分辨率大小为 256x256

在这里插入图片描述
在这里插入图片描述

3.2 训练细节

  • 4 个 16G NVIDIA V100 GPUs
  • batch size 为 32,每张卡上 8 张图
  • 学习率:0.002
  • 优化器:Adam
  • latent code 维度, D m D_m Dm 中的方向 都是 512
  • l a m b d a lambda lambda:10
  • 训练时间: 150 小时

3.3 评估

3.4 定性效果

在这里插入图片描述

3.5 定量效果

同一人物的重建:

在这里插入图片描述

跨视频的生成

在这里插入图片描述

User study:

在这里插入图片描述

3.6 消融实验

1、motion dictionary D m D_m Dm 是否有效:

在这里插入图片描述

2、 D m D_m Dm 需要多少个方向:20 个最优

在这里插入图片描述

3.7 失败示例

  • Taichi 中,身体遮挡重合(如胳膊、腿等)的部分无法很好的 transfer
  • 在 TED-talks,手部动作难以 transfer

在这里插入图片描述

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

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

相关文章

C语言使用ip代码示例

以下是一个使用C语言编写的简单爬虫IP代码示例&#xff1a; c #include <stdio.h> #include <stdlib.h> #include <curl/curl.h> size_t write_callback_func(void *ptr, size_t size, size_t nmemb, void *stream) { size_t written fwrite(ptr, size…

掌握Python输入输出:从键盘到文件的全面指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python作为一门强大的编程语言&#xff0c;提供了丰富而灵活的输入输出&#xff08;I/O&#xff09;功能&#xff0c;使得与用户交互和数据处理变得轻而易举。 标准输入与标准输出 Python的输入输出从最基础的…

主从Reactor高并发服务器

文章目录 Reactor模型的典型分类单Reactor单线程单Reactor多线程多Reactor多线程本项目中实现的主从Reactor One Thread One Loop各模型的优点与缺点 项目分解Reactor服务器模块BufferSocketChannelEpollerTimerWheelEventLoopAnyConnectionAcceptorLoopThreadLoopThreadPoolTc…

如何进行前端单元测试?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Servlet的部署与安全

1 Servlet 部署 Servlet规范关于各个东西该放在哪里有许多严格的规则。 1.1 WAR war文件代表Web归档(Web Archive)&#xff0c;war实际就是一个JAR&#xff0c;只不过扩展名是.war而不是.jar。 其采用了一种可移植的压缩形式&#xff0c;把整个Web应用结构&#xff08;去掉…

知识图谱系列4:neo4j学习

这是一篇还不错的教程&#xff0c;我将会针对其中的Cypher语法在这篇帖子内提出问题&#xff0c;以便学习与复习。 MATCH是什么操作&#xff1f; 小括号()代表什么&#xff1f;&#xff08;n&#xff09;代表什么&#xff1f; MATCH (n) DETACH DELETE n是什么含义&#xff1…

紫光同创FPGA实现UDP协议栈精简版,基于YT8511和RTL8211,提供2套PDS工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的以太网方案3、设计思路框架RGMII转GMII动态ARPUDP协议回环FIFOIP地址、端口号修改 4、PDS工程1&#xff1a;YT8511版本5、PDS工程2&#xff1a;RTL8211版本6、上板调试验证并演示准备工作动态ARP测试UDP通信测试 7、福利&#xff1a;工程代…

铁道交通运输运营3D模拟仿真实操提供一个沉浸、高效且环保的情境

VR模拟果蔬运输应急处理场景在农产品物流行业中具有重要的意义。这种模拟技术为农产品运输提供了全新的、更高效和更安全的方式来模拟真实世界的应急情况&#xff0c;帮助操作人员、研究者和管理者更好地理解和应对可能的运输风险措施。 VR模拟果蔬运输应急处理场景可以模拟出各…

如何在 Spring Boot 中实现容错机制

在 Spring Boot 中实现容错机制 容错机制是构建健壮和可靠的应用程序的重要组成部分。它可以帮助应用程序在面对异常或故障时保持稳定运行。Spring Boot提供了多种机制来实现容错&#xff0c;包括异常处理、断路器、重试和降级等。本文将介绍如何在Spring Boot中实现这些容错机…

Ubuntu输入正确密码重新跳到登录界面

Ubuntu输入正确密码重新跳到登录界面 问题描述 输入正确的密码登录后闪一下又回到锁屏界面 输入正确的密码后还是回到这个界面 产生的原因 /etc/profile或者/etc/enviroment出现了问题,导致无法正常登录 该错误产生的原因不止一个 这里是因为/etc/profile或者/etc/enviromen出…

mac使⽤nginx

⽅法1&#xff1a;homebrew 默认本地已经安装homebrew&#xff1b; 安装与启动 brew install nginx 安装nginx&#xff1b; brew services start nginx 启动nginx nginx⽂件⽬录 1. nginx安装⽂件⽬录/usr/local/Cellar/nginx 2. nginx配置⽂件⽬录/usr/local/etc/nginx 3. con…

C语言每日一题(12)猜排名

题目描述 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果&#xff1a; A选手说&#xff1a;B第二&#xff0c;我第三&#xff1b; B选手说&#xff1a;我第二&#xff0c;E第四&#xff1b; C选手说&#xff1a;我第一&#xff0c;D第二&#xff1b; D…

Linux:redis的基础操作

redis介绍&#xff0c;安装和性能测试 Linux&#xff1a;redis数据库源码包安装-CSDN博客https://blog.csdn.net/w14768855/article/details/133752744?spm1001.2014.3001.5501如果没有了解过redis那么一定要去看看介绍 登录 redis-cli 可以登录到本机127.0.0.1&#xff0c;…

CSS特殊学习网址

css基本教程内填充padding——前端编程新手必学_哔哩哔哩_bilibilicss3基本语法CSS flex布局&#xff08;弹性布局/弹性盒子&#xff09;Agence digitale crative Paris et Montpellier | Sweet PunkCSS布局CSS Layout — Phuoc NguyenCSS中文特效Coco ’s blog特效网址Coco ’…

uniapp获取公钥、MD5,‘keytool‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

获取MD5、SHA1、SHA256指纹信息 通过命令的形式获取 winr调出黑窗口cd到证书所在目录输入keytool -list -v -keystore test.keystore,其中 test.keystore为你的证书名称加文件后缀按照提示输入你的证书密码&#xff0c;就可以查看证书的信息 通过uniapp云端查看(证书是在DClou…

SR660 V2 ESXI 的安装

连接BMC端口 登录BMC管理界面&#xff08;需要设置三个参数&#xff1a; IP DNS RAID &#xff09; 在网络设置里有IP DNS 的设置 配置IP 配置DNS Ctrl shift 选中物理驱动器配置里的两块磁盘 否则会弹出报错&#xff1a;最小值2物理设备应该按照所选的RAID等级来配置 配置…

docker compose和consul(服务注册与发现)

一、Docker-compose 简介 Docker-Compose项目是基于Python开发的Docker官方开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&a…

STM32使用HAL库驱动DS18B20

1、STM32CubeMx配置IO口 因为DS18B20是单总线&#xff0c;数据接收发送都是这根线&#xff0c;所以单片机配置为开漏上拉输出。 2、定时器配置 因为DS18B20对时序要求比较严格&#xff0c;建议用定时器延时获得微秒延时函数。 总线为48M&#xff0c;分频48&#xff0c;获得1…

Mall脚手架总结(二) —— SpringData操作Elasticsearch

前言 万字长文带你弄清楚SpringData中的Elasticsearch操作以及在脚手架里接口的结构关系&#xff01;经过前面鉴证授权的整合&#xff0c;荔枝开始熟悉项目的学习的方法了&#xff0c;虽然脚手架中的内容比较简单&#xff0c;但是把边角的知识点全部扫到还是比较花时间的尤其是…

panads操作excel

panads简介 pandas是基于Numpy创建的Python包&#xff0c;内置了大量标准函数&#xff0c;能够高效地解决数据分析数据处理和分析任务&#xff0c;pandas支持多种文件的操作&#xff0c;比如Excel&#xff0c;csv&#xff0c;json&#xff0c;txt 文件等&#xff0c;读取文件之…