【傳知代碼】無監督動畫中關節動畫的運動表示-論文復現

文章目錄

  • 概述
  • 動畫技術的演進
  • 原理介紹
  • 核心邏輯
  • 環境配置/部署方式
  • 小結

本文涉及的源碼可從無監督動畫中關節動畫的運動表示該文章下方附件獲取

概述

該文探討了動畫在教育和娛樂中的作用,以及通過數據驅動方法簡化動畫制作的嘗試。近期研究通過無監督運動轉移減少對真實數據的依賴,取得一定進展,但仍面臨關節和非剛性對象運動的表示、運動序列動畫化及背景運動處理等問題。為解決這些挑戰,文章提出三個貢獻:

  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.pswp.cn/bicheng/16481.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16481.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16481.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java進階學習筆記30——BigDecimal

BigDecimal: 用于解決浮點型運算的,出現結果失真的問題。 運行結果: package cn.ensource.d4_bigdecimal;import java.math.BigDecimal;public class Test {public static void main(String[] args) {// 目標:了解BigDecimal類do…

RustGUI學習(iced/iced_aw)之擴展小部件(二十七):如何使用number_input部件?

前言 本專欄是學習Rust的GUI庫iced的合集,將介紹iced涉及的各個小部件分別介紹,最后會匯總為一個總的程序。 iced是RustGUI中比較強大的一個,目前處于發展中(即版本可能會改變),本專欄基于版本0.12.1. 概述 這是本專欄的第二十七篇,主要講述number_input部件的使用,會…

8、Qt—Log4Qt使用小記2(每日產生文件)

前言: 開發平臺:Win10 64位 開發環境:Qt Creator 13.0.0 構建環境:Qt 5.15.2 MSVC2019 64位 例如:上一篇文章中筆者記錄了Log4qt的編譯及配置使用,這篇文章重點寫下每天產生文件到指定文件夾中,…

5.1 Go 函數的定義與調用

💝💝💝歡迎蒞臨我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:「stormsha的主頁」…

Spring Boot集成testcontainers快速入門Demo

1.什么是testcontainers? Testcontainers 是一個用于創建臨時 Docker 容器進行單元測試的 Java 庫。當我們想要避免使用實際服務器進行測試時,它非常有用。,官網介紹稱支持50多種組件。? 應用場景 數據訪問層集成測試: 使用My…

ubuntu20安裝Labelme

conda create --namelabelme python3 進入conda環境 source activate labelme 安裝labelme pip install labelme 遇到網絡問題 使用清華源 pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple/ 輸入labelme 打開

Google的MLP-MIXer的復現(pytorch實現)

Google的MLP-MIXer的復現(pytorch實現) 該模型原論文實現用的jax框架實現,先貼出原論文的代碼實現: # Copyright 2024 Google LLC. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may …

GEC210編譯環境搭建

一、下載編譯工具鏈 下載:點擊跳轉 二、解壓到 /usr/local/arm 目錄 sudo mv gec210.zip /usr/local/arm cd /usr/local/arm sudo unzip gec210.zip 三、添加到環境變量 PATH/usr/local/arm/arm-cortex_a8-linux-gnueabi-4.7.3/bin:$PATH 四、測試驗證 在終端…

python數據分析-基于數據挖掘對APP評分的預測

前言 當我們談論關于APP用戶分析與電子商務之間的聯系時,機器學習在這兩個領域的應用變得至關重要。App用戶分析和電子商務之間存在著密切的關聯,因為用戶行為和偏好的深入理解對于提高用戶體驗、增加銷售以及優化產品功能至關重要。故本文基于K-近鄰模…

OFDM 802.11a的FPGA實現(二十)使用AXI-Stream FIFO進行跨時鐘(含代碼)

目錄 1.前言 2.AXI-Stream FIFO時序 3.AXI-Stream FIFO配置信息 4.時鐘控制模塊MMCM 5.ModelSim仿真 6.總結 1.前言 至此,通過前面的文章講解,對于OFDM 802.11a的發射基帶的一個完整的PPDU幀的所有處理已經全部完成,其結構如下圖所示&…

opencv-C++ VS2019配置安裝

最新opencv-c安裝及配置教程(VS2019 C & opencv4.4.0)_c opencv配置-CSDN博客

夜雨觸花感懷

夜雨觸花感懷 雨落有軌跡,業成無坦途。 ?雞毛飛虛空,尋德問心路。 ?恰如求耕耘,大話量寸土。 ?好吃品五味,難得評真俗。

CAN總線簡介

1. CAN總線概述 1.1 CAN定義與歷史背景 CAN,全稱為Controller Area Network,是一種基于消息廣播的串行通信協議。它最初由德國Bosch公司在1983年為汽車行業開發,目的是實現汽車內部電子控制單元(ECUs)之間的可靠通信。…

用Vuex存儲可配置下載的ip地址(用XML進行ajax請求配置文件)

1.在public文件夾下創建一個名為Configuration的文件在創建一個Configuration.txt里面就放IP地址(這里的名字可以隨便命名一定性的被人解讀文件含義) 例如: http://172.171.208.1:80032.在store文件夾中創建一個名為 ajaxModule.js 的 Vuex …

2. CSS選擇器與偽類

2.1 基本選擇器回顧 在開始介紹CSS3選擇器之前&#xff0c;我們先回顧一下CSS的基本選擇器。這些選擇器是所有CSS開發的基礎。 2.1.1 元素選擇器 元素選擇器用于選中指定類型的HTML元素。 /* 選中所有的<p>元素 */ p {color: blue; }2.1.2 類選擇器 類選擇器用于選中…

03自動輔助導航駕駛NOP其實就是NOA

蔚來NOP是什么意思&#xff1f;蔚來NOP是啥 蔚來NOP的意思就是NavigateonPilot智能輔助導航駕駛&#xff0c;也就是大家俗稱的高階輔助駕駛&#xff0c;在車主設定好導航路線&#xff0c;并且符合開啟NOP條件的前提下&#xff0c;蔚來NOP可以代替駕駛員完成從A點到B點的智能輔助…

深入理解數倉開發(二)數據技術篇之數據同步

1、數據同步 數據同步我們之前在數倉當中使用了多種工具&#xff0c;比如使用 Flume 將日志文件從服務器采集到 Kafka&#xff0c;再通過 Flume 將 Kafka 中的數據采集到 HDFS。使用 MaxWell 實時監聽 MySQL 的 binlog 日志&#xff0c;并將采集到的變更日志&#xff08;json 格…

【二叉樹】:LeetCode:100.相同的數(分治)

&#x1f381;個人主頁&#xff1a;我們的五年 &#x1f50d;系列專欄&#xff1a;初階初階結構刷題 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 1.問題描述&#xff1a; 2.問題分析&#xff1a; 二叉樹是區分結構的&#xff0c;即左右子樹是不一…

[JDK工具-6] jmap java內存映射工具

文章目錄 1. 介紹2. 主要選項3. 生成java堆轉儲快照 jmap -dump4. 顯示堆詳細信息 jmap -heap pid5. 顯示堆中對象統計信息 jmap -histo pid jmap(Memory Map for Java) 1. 介紹 位置&#xff1a;jdk\bin 作用&#xff1a; jdk安裝后會自帶一些小工具&#xff0c;jmap命令(Mem…