【传知代码】无监督动画中关节动画的运动表示-论文复现

文章目录

  • 概述
  • 动画技术的演进
  • 原理介绍
  • 核心逻辑
  • 环境配置/部署方式
  • 小结

本文涉及的源码可从无监督动画中关节动画的运动表示该文章下方附件获取

概述

该文探讨了动画在教育和娱乐中的作用,以及通过数据驱动方法简化动画制作的尝试。近期研究通过无监督运动转移减少对真实数据的依赖,取得一定进展,但仍面临关节和非刚性对象运动的表示、运动序列动画化及背景运动处理等问题。为解决这些挑战,文章提出三个贡献:

  1. 使用区域表示一阶运动以增强稳定性;

  2. 明确建模背景运动以提高点识别的稳定性;

  3. 在无监督空间中解耦对象的形状和姿态,防止形状转移。这些改进提升了无监督运动转移的精度,特别是对于关节对象的动画。

作者还提出一个新的TED演讲者数据集以验证方法,其性能优于现有无监督动画技术。

动画技术的演进

图像动画方法相关工作总结

图像动画方法可以大致分为监督和无监督两类,每种方法都有其独特的挑战和局限性。这篇总结概述了这两类方法中的已有工作,为论文关注的无监督方法提供背景。

在这里插入图片描述

检测实现的静止源图像动画

监督图像动画:

监督方法在训练期间需要关于动画对象的先验知识,通常以地标、语义分割或参数化的3D模型的形式存在。这些方法受到标记数据的需求的限制,仅适用于具有丰富标记数据集的少数对象类别,例如面部和人体。早期的面部再现工作利用3D可塑模型,使用图形技术进行动画和渲染。神经网络后来被引入以提高渲染质量,有时需要每个身份的多个图像 。

监督方法的重要部分将动画视为图像到图像或视频到视频的转换问题,将问题限制为对单个对象实例进行动画处理,无论是面部还是人体。尽管这些方法取得了一些有希望的结果,但在更广泛的对象类别范围内进行泛化仍然具有挑战性。此外,它们往往不仅传递了运动,还传递了驱动对象的形状 。

无监督图像动画:

无监督方法旨在克服监督方法的局限性,通过消除对动画对象形状或地标的标记数据的需求。这一类别包括基于视频生成的动画方法,其根据初始帧和动画类别标签预测未来帧 。值得注意的是,Menapace等人引入了可玩的视频生成,允许在每个时间戳选择动作 。

另一组无监督方法专注于将动画从驱动视频重新定向到源帧。X2Face构建了输入面的规范表示,生成了一个基于驱动视频的变形场 。Monkey-Net学习无监督关键点以生成动画,随后的工作,包括第一阶段运动模型(FOMM),通过考虑每个关键点的局部仿射变换来增强动画质量。

从经验上看,这些无监督方法通常在动画对象的边界上提取关键点,对于人体等关节对象,内部运动建模不足,导致动画不自然。

原理介绍

在无监督学习的动画领域中,关节动画的运动表示原理主要基于对人体或物体运动的模拟。关节动画是一种常用的计算机动画技术,它通过模拟人体或物体的关节运动来实现复杂的动画效果。以下是无监督动画中关节动画的运动表示原理的详细介绍:

一、关节动画的基本原理

关节动画的基本原理是将一个复杂的物体或角色(如人体)分解为一系列相互连接的关节(或骨骼),然后通过控制这些关节的运动来实现整个物体或角色的运动。在动画中,这些关节之间的连接关系形成了一种层次结构,类似于生物体的骨骼系统。

二、关节动画的表示方法

  1. 骨架:关节动画的核心是骨架,它由一系列具有层次关系的关节(骨骼)和关节链组成。这些关节通过连接形成了一种树结构,其中一个关节被选作根关节,其他关节则是根关节的子孙。通过平移和旋转根关节,可以移动并确定整个骨架在世界空间中的位置和方向。
  2. 关节的表示:通常,每个关节都会包含一些基本信息,如关节名、父关节索引、关节绑定姿势的逆变换矩阵(offset矩阵)等。关节的绑定姿势是指蒙皮网格顶点绑定至骨骼时,关节的位置、朝向和缩放。这些信息对于确定关节的运动状态和动画效果至关重要。
  3. 姿势的表示:关节的姿势被定义为关节相对于某坐标系的位置、朝向和缩放。在关节动画中,通常存在三种姿势:绑定姿势、局部姿势和全局姿势。绑定姿势是网格绑定到骨骼之前的姿势,局部姿势是关节相对于父关节来指定的,全局姿势则是关节在整个动画模型所在的坐标空间中的变换。

三、无监督动画中的关节动画

在无监督学习的动画中,关节动画的运动表示原理与传统关节动画类似,但更加注重从数据中学习和推断关节的运动规律。通过大量的无标签视频数据,无监督学习算法可以自动提取出物体或角色的运动特征,并学习到关节之间的运动约束和相互关系。这样,即使在没有明确标注的情况下,算法也能够生成符合自然规律的关节动画效果。

核心逻辑

在这里插入图片描述

  • 一阶运动模型

FOMM 主要包括两个部分:运动估计和图像生成,其中运动估计进一步包含粗糙运动估计和密集运动预测。粗糙运动被建模为分离对象部分之间的稀疏运动,而密集运动则生成整个图像的光流和置信度图。我们用S和D分别表示源帧和驱动帧,这两者来自同一视频。

首先从S和D估计各个对象部分的粗糙运动。每个对象部分的运动由仿射变换表示,Ak ∈ R^2x3,到一个抽象的共同参考帧R;X可以是S或D。针对K个不同的部分估计运动。编码器-解码器关键点预测网络输出K个热图,M1到MK,这些热图对输入图像进行建模,然后经过softmax,使得Mk ∈ [0,1]^HW,满足∑Mk(z) = 1,其中z是图像中的像素位置。这样,仿射变换的平移分量(即Ak的最后一列)可以使用softargmax进行估计。

在FOMM 中,剩余的仿射参数通过每个像素进行回归,形成4个附加通道。用于索引仿射矩阵。这个模型被称为基于回归的模型,因为仿射参数由网络预测并进行池化以计算。D和S之间的每个部分k的运动然后通过公共参考帧计算。

  • 基于PCA的运动估计

准确的运动估计是实现高质量图像动画的主要要求。与FOMM不同,我们采用了不同的运动表示方式,即所有运动直接从热图Mk中测量。我们像以前一样计算平移,而x和y方向的平面旋转和缩放则通过热图Mk的主成分分析(PCA)进行计算。

这里使用奇异值分解(SVD)方法来计算PCA,将热图的协方差分解为酉矩阵Uk和V_k以及奇异值的对角矩阵S_k。我们称这种方法为基于PCA的方法,与基于回归的方法相对。尽管这两者在此使用相同的区域表示和编码器,但由于我们创新的前景运动表示,编码的区域之间存在显著的差异,将前景映射到有意义的对象部分,例如关节。

  • 背景运动估计

背景占据图像的大部分。因此,即使在帧之间有微小的背景运动,例如由于摄像机运动引起的运动,也会对动画质量产生负面影响。FOMM未将背景运动单独处理,因此必须使用关键点对其进行建模。这带来了两个负面影响:(i)需要额外的网络容量,因为关键点用于模拟背景而不是前景;(ii)过度拟合训练集,因为这些关键点集中在背景的特定部分上,而这些部分可能在测试集中不存在。因此,我们使用编码器网络额外预测背景仿射变换。由于我们的框架是无监督的,背景网络可能将前景的某些部分包

含到背景运动中。实际上,这并没有发生,因为对于网络来说,使用前景的更适当的基于PCA的运动表示要比使用S和D编码前景运动更简单。从经验上讲,我们证明了所提出的运动表示可以在完全无监督的情况下分离背景和前景。

  • 图像生成

在这里插入图片描述

  • 与FOMM 类似,我们将目标图像分为两个阶段进行渲染:像素级的光流生成器将粗糙运动转换为密集光流,然后根据光流对源的编码特征进行变形,随后对缺失区域进行修补。密集光流预测器的输入是一个HxWx(4K+3)张量,每个区域有四个通道,每个区域有三个用于根据区域的仿射变换变形的源图像通道,一个用于区域的热图的高斯近似,另外三个通道用于根据背景的仿射变换变形的源图像。与FOMM不同,后者使用常数方差,我们从热图中估计协方差。
    这种模型在背景运动略有变化时会变得复杂。当有轻微的背景运动时,该模型会自动适应通过将一些可用关键点分配给模拟背景来进行调整。我们还通过使用相同的网络预测置信度图C来处理源图像中缺失的部分。最后,S通过编码器传递,然后通过光流变形生成的特征图乘以置信度图。一个解码器然后重建驱动图像D。在测试时,FOMM 有两种动画模式:标准模式和相对模式。在标准动画中,逐帧计算源和驱动之间的运动。对于相对动画,为了生成帧t,首先计算D1和Dt之间的运动,然后应用于s。

通过上述改进,我们提出的方法克服了以前方法在处理关节对象时无法捕捉完整对象部分、形状和姿势的局限性。我们的基于PCA的运动表示以及背景运动估计模块提供了更高的稳定性和区域分布的改善,同时能够更好地适应不同数量的区域。我们的方法在多个数据集和任务上都取得了令人满意的定量和定性结果,为未来在这一领域的改进提供了有力的基准。

环境配置/部署方式

  1. 命令行参数解析:

    parser = ArgumentParser()
    parser.add_argument("--config", required=True, help="path to config")
    parser.add_argument("--mode", default="train", choices=["train", "reconstruction", "animate"])
    parser.add_argument("--log_dir", default='log', help="path to log into")
    parser.add_argument("--checkpoint", default=None, help="path to checkpoint to restore")
    parser.add_argument("--device_ids", default="0", type=lambda x: list(map(int, x.split(','))),
                        help="Names of the devices comma separated.")
    parser.add_argument("--verbose", dest="verbose", action="store_true", help="Print model architecture")
    opt = parser.parse_args()
    
    • 使用 ArgumentParser 解析命令行参数,包括配置文件路径 --config、运行模式 --mode(默认为 “train”)、日志目录 --log_dir(默认为 ‘log’)、检查点路径 --checkpoint、设备编号 --device_ids、是否输出模型架构 --verbose
    • 参数解析结果保存在 opt 对象中。
  2. 加载配置文件:

    with open(opt.config) as f:
        config = yaml.load(f)
    
    • 使用 yaml.load 读取配置文件,其中配置了模型参数、数据集参数等。配置信息保存在 config 字典中。
  3. 初始化模型和数据集:

    generator = OcclusionAwareGenerator(**config['model_params']['generator_params'],
                                        **config['model_params']['common_params'])
    discriminator = MultiScaleDiscriminator(**config['model_params']['discriminator_params'],
                                            **config['model_params']['common_params'])
    kp_detector = KPDetector(**config['model_params']['kp_detector_params'],
                             **config['model_params']['common_params'])
    
    • 创建了生成器 generator、判别器 discriminator 和关键点检测器 kp_detector
    • 模型的参数从配置文件中获取。
  4. 设备配置和模型移动:

    if torch.cuda.is_available():
        generator.to(opt.device_ids[0])
        discriminator.to(opt.device_ids[0])
        kp_detector.to(opt.device_ids[0])
    
    • 如果 GPU 可用,将模型移动到指定的 GPU 设备上。
  5. 日志目录和配置文件的保存:

    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
    if not os.path.exists(os.path.join(log_dir, os.path.basename(opt.config))):
        copy(opt.config, log_dir)
    
    • 创建日志目录,如果不存在的话。
    • 将配置文件拷贝到日志目录中。
  6. 选择运行模式并调用相应函数:

    if opt.mode == 'train':
        print("Training...")
        train(config, generator, discriminator, kp_detector, opt.checkpoint, log_dir, dataset, opt.device_ids)
    elif opt.mode == 'reconstruction':
        print("Reconstruction...")
        reconstruction(config, generator, kp_detector, opt.checkpoint, log_dir, dataset)
    elif opt.mode == 'animate':
        print("Animate...")
        animate(config, generator, kp_detector, opt.checkpoint, log_dir, dataset)
    
    • 根据命令行参数中的 --mode 的值,选择运行训练、重建还是动画生成。
    • 分别调用相应的函数:trainreconstructionanimate

整个代码实现了一个端到端的图像动画生成流程,用户可以通过命令行参数选择不同的模式,并在配置文件中指定模型和数据集的参数。训练模型时,通过调用 train 函数,进行模型的训练;重建时,通过调用 reconstruction 函数,进行图像的重建;动画生成时,通过调用 animate 函数,生成动画。

小结

动画技术在教育和娱乐领域的重要性不言而喻,它不仅能够提供丰富多样的视觉体验,还能有效地传达信息和知识。然而,传统的动画制作方法通常要求专业技能、昂贵的硬件和大量的时间投入,这在一定程度上限制了动画的广泛应用。

为了解决这些问题,近年来数据驱动的方法逐渐受到关注,其中无监督动画框架是一个重要的研究方向。这种框架试图通过自动学习和分析大量数据来生成动画,从而减少了对专业技能和硬件的依赖。然而,无监督动画框架在处理关节对象时面临一些挑战,其传统的表示方法往往无法准确捕捉关节的运动规律。

为了解决这一问题,研究人员提出了一种全新的PCA-Based区域运动表示方法。这种方法利用主成分分析(PCA)技术,对动画中的区域运动进行建模和表示。PCA是一种强大的数据分析工具,它能够识别数据中的主要模式和趋势,从而简化数据的复杂性。在动画中,PCA可以帮助我们更容易地学习到区域运动的关键特征,并鼓励网络学习到语义丰富的对象部分。

具体来说,PCA-Based区域运动表示方法通过以下几个步骤实现:

  1. 数据预处理:首先,从动画数据中提取出与关节运动相关的区域特征,例如关节的位置、速度、加速度等。
  2. 主成分分析:然后,利用PCA对这些区域特征进行降维处理,以识别出其中的主要运动模式。这些主要模式代表了关节运动的关键特征,可以用于后续的动画生成。
  3. 网络学习:接下来,将PCA提取的主要运动模式作为输入,训练一个深度学习网络来学习关节运动的规律。这个网络可以是一个循环神经网络(RNN)或卷积神经网络(CNN),具体取决于问题的复杂性和数据量。
  4. 动画生成:最后,利用训练好的网络生成新的动画。在生成过程中,可以根据需要调整PCA提取的主要运动模式的权重,以实现不同的动画效果。

此外,为了进一步提高动画质量,研究人员还引入了背景运动估计模块。这个模块能够有效地区分前景和背景的运动,从而避免了在动画中出现不自然的背景运动。通过解耦前景和背景的运动,可以使动画看起来更加真实和自然。

综上所述,PCA-Based区域运动表示方法以及背景运动估计模块的引入为无监督动画框架提供了新的思路和技术手段。这些方法不仅能够更准确地捕捉关节对象的运动规律,还能够提高动画的质量和真实性。随着技术的不断发展和完善,相信未来无监督动画框架将在教育和娱乐领域发挥更加重要的作用。
在这里插入图片描述

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

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

相关文章

python数据分析-CO2排放分析

导入所需要的package import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import datetime %matplotlib inline plt.rcParams[font.sans-serif] [KaiTi] #中文 plt.rcParams[axes.unicode_minus] False #负号 数据清洗…

汇编原理(二)

寄存器:所有寄存器都是16位(0-15),可以存放两个字节 AX,BX,CX,DX存放一般性数据,称为通用寄存器 AX的逻辑结构。最大存放的数据为2的16次方减1。可分为AH和AL,兼容8位寄存器。 字:1word 2Byte…

Mysql中表之间的关系

表之间的关系 一对一、多对一(其实就是主从关系,在从表中设置一个外键关联上主表)、多对多关系(需要一个中间表,设置两个外键,分别关联到两个表的主键) 比如订单和商品之间:一个订单…

数据安全不容小觑:.hmallox勒索病毒的防范与应对

一、引言 随着网络技术的飞速发展,网络安全问题日益凸显,其中勒索病毒作为一种极具破坏性的网络攻击手段,已在全球范围内造成了巨大的经济损失和社会影响。在众多勒索病毒中,.hmallox勒索病毒以其狡猾的传播方式和强大的加密能力…

深度学习复盘与小实现

文章目录 一、查漏补缺复盘1、python中zip()用法2、Tensor和tensor的区别3、计算图中的迭代取数4、nn.Modlue及nn.Linear 源码理解5、知识杂项思考列表6、KL散度初步理解 二、处理多维特征的输入1、逻辑回归模型流程2、Mini-Batch (N samples) 三、加载数据集1、Python 魔法方法…

JVM学习-Class文件结构②

访问标识(access_flag) 在常量池后,紧跟着访问标记,标记使用两个字节表示,用于识别一些类或接口层次的访问信息,包括这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果…

打造游戏APP:面向对象编程的实战演练

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、项目背景与架构概览 二、类的设计与实现 三、面向对象编程的实践 四、游戏循环与事件…

WordPress安装memcached提升网站速度

本教程使用环境为宝塔 第一步、服务器端安装memcached扩展 在网站使用的php上安装memcached扩展 第二步:在 WordPress 网站后台中,安装插件「Memcached Is Your Friend」 安装完成后启用该插件,在左侧工具-中点击Memcached 查看是否提示“U…

【Git】版本控制工具——Git介绍及使用

目录 版本控制版本控制系统的主要目标分类小结 分布式版本控制系统——GitGit特点Git与SVN的区别Git的工作机制 Git安装Git 团队协作机制团队内协作跨团队协作远程仓库远程仓库的作用有以下几个方面远程仓库操作流程/团队协作流程 Git分支什么是分支分支的好处 Git的常用命令Gi…

JDBC使用QreryRunner简化SQL查询注意事项

QreryRunner是Dbutils的核心类之一,它显著的简化了SQL查询,并与ResultSetHandler协同工作将使编码量大为减少。 注意事项 1. 使用QreryRunner必须保证实体类的变量名,和sql语句中要查找的字段名必须相同,否则查询 不到数据,会出…

K-means聚类算法详细介绍

目录 🍉简介 🍈K-means聚类模型详解 🍈K-means聚类的基本原理 🍈K-means聚类的算法步骤 🍈K-means聚类的优缺点 🍍优点 🍍缺点 🍈K-means聚类的应用场景 🍈K-mea…

公共代理IP和独享代理IP之间的区别?

公共代理IP和独享代理IP在网络应用中扮演着不同的角色,它们之间的区别主要体现在使用方式、性能、安全性以及隐私保护等方面。以下是对这两种代理IP的详细对比和分析。 第一点就是使用的方式以及成本上的不同,公共代理IP,顾名思义&#xff0…

MySQL中, 自增主键和UUID作为主键有什么区别?

首先我们来看看, 存储自增主键和uuid的数据类型 我们知道, mysql中作为主键的通常是int类型的数据, 这个 数据从第一条记录开始, 从1开始主键往后递增, 例如我有100条数据, 那么根据主键排序后, 里面的记录从上往下一次就是1, 2, 3 ... 100, 但是UUID就不一样了, UUID是根据特殊…

基于Zookeeper的分布式锁

分布式锁的介绍 在Java的多线程部分,我们知道如果在单个jvm进程中,多个线程之间同时访问一个资源,此时会有多线程的安全问题。为了解决这个线程安全的问题,我们可以使⽤“锁”来实现。但是,多个jvm进程之间如果同时访问…

Topk问题以及二叉树的三种层序遍历和基本操作

一、Topk问题 1、问题描述 TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。 比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 2、思路 对于Top-K问题,能想到的最简单直接的…

Go微服务: Nacos的搭建和基础API的使用

Nacos 概述 文档:https://nacos.io/docs/latest/what-is-nacos/搭建:https://nacos.io/docs/latest/quickstart/quick-start-docker/有很多种搭建方式,我们这里使用 docker 来搭建 Nacos 的搭建 这里,我们选择单机模式&#xf…

重学java 46.集合 ① Collection集合

事常与人违,事总在人为 —— 24.5.26 集合 知识导航 1.集合的特点以及作用 2.使用collection接口中的方法 3.使用迭代器迭代集合 4.ArrayList以及LinkedList的使用 5.使用增强for遍历集合 一、单列集合框架的介绍 1.长度可变的容器:集合 2.集合的特点 a.…

App推广新境界:Xinstall助你轻松突破运营痛点,实现用户快速增长!

在移动互联网时代,App已经成为企业营销不可或缺的一部分。然而,如何有效地推广App,吸引并留住用户,成为了众多企业面临的难题。今天,我们将为您揭秘一款神奇的App推广工具——Xinstall,它将助您轻松突破运营…

音视频开发8 音视频中SDL的使用,SDL 在windows上环境搭建,SDL 使用 以及 常用 API说明,show YUV and play PCM

1.SDL简介 SDL(Simple DirectMedia Layer),是一个跨平台的C语言多媒体开发库。 支持Windows、Mac OS X、Linux、iOS、Android 提供对音频、键盘、鼠标、游戏操纵杆、图形硬件的底层访问 很多的视频播放软件、模拟器、受欢迎的游戏都在使用…

我的前端封装之路

最近有粉丝提问了我一个面试中遇到的问题,他说面试的时候,面试官问我:你在以前的项目中封装过组件吗?或者做过npm公共库吗?遇到过什么问题吗?当时自己突然觉得好像没什么可回答的啊,但面试结束想…