激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

基于姿態(tài)估計的3D動畫生成

發(fā)布時間:2024-04-11 11:03:33 瀏覽量:211次

在本文中,我們將嘗試通過跟蹤 2D 視頻中的動作來渲染人物的 3D 動畫。

在 3D 圖形中制作人物動畫需要大量的運動跟蹤器來跟蹤人物的動作,并且還需要時間手動制作每個肢體的動畫。 我們的目標是提供一種節(jié)省時間的方法來完成同樣的任務。

NSDT工具推薦: Three.js AI紋理開發(fā)包 - YOLO合成數(shù)據(jù)生成器 - GLTF/GLB在線編輯 - 3D模型格式在線轉(zhuǎn)換 - 可編程3D場景編輯器 - REVIT導出3D模型插件 - 3D模型語義搜索引擎

我們對這個問題的解決方案包括以下步驟:

  • 2D 姿態(tài)估計:人體至少需要 17 個標志點才能完整描述其姿態(tài)。
  • DeepSORT+FaceReID:跟蹤姿勢的運動。
  • 將 2D 提升到 3D:我們從上一步獲得的坐標是 2D 的。 為了以 3D 方式制作它們的動畫,我們需要將這些 2 維坐標映射到 3 維空間。
  • 渲染為 3D:上一步中檢測到的這 17 個標志點的坐標現(xiàn)在將是需要動畫處理的 3D 角色的四肢關節(jié)的位置。

讓我們在本文的其余部分詳細討論這些步驟。

1、2D 姿態(tài)估計

如上所述,只需指定 17 個關鍵點(在深度學習社區(qū)中稱為landmark points)即可完整描述人體姿勢。 你可能已經(jīng)猜到,我們正在使用深度學習來估計人類的姿勢(即跨視頻幀跟蹤人類的姿勢)。 有很多最先進的框架(例如 PoseFlow 和 AlphaPose)可以在github上找到,它們已經(jīng)實現(xiàn)了相當準確的姿勢估計。

第一個框架是由 Yuliang Xiu 等人開發(fā)的 PoseFlow。 PoseFlow 算法的基本概述是,該框架首先通過最大化視頻所有幀的整體置信度來構(gòu)建姿勢。 下一步是使用稱為非極大值抑制(通??s寫為 NMS)的技術(shù)刪除檢測到的冗余姿勢。

可以在下面附加的 GIF 中看到,使用 PoseFlow(左側(cè))估計的姿勢在某些幀中存在輕微故障。 這給我們帶來了下一個框架:AlphaPose。 AlphaPose由Hao-Shu Fang等人開發(fā)。 該框架在幀中檢測到的人周圍繪制邊界框,并估計他們在每個幀中的姿勢。 即使一個人被另一個人部分遮擋,它也可以檢測姿勢。

左:PoseFlow 右:AlphaPose

AlphaPose 框架的代碼可以在這里找到。

2、DeepSORT + FaceReID

我們使用 Alpha Pose 來檢測視頻中人類的姿勢。 下一步是跟蹤他們的動作,以便能夠構(gòu)建平滑的移動動畫。 DeepSORT 框架的研究論文可以在這里找到。

使用 DeepSORT 和 FaceReid 邊界框的輸出,我們通過以下方式分離不同人的姿勢。

在每一幀中繪制人體周圍的邊界框

檢查姿勢關鍵點是否在邊界框內(nèi)的函數(shù)

分離不同人的姿勢的循環(huán)

3、令人振奮的 2D 到 3D

如上所述,我們在姿態(tài)估計步驟中獲得的坐標是二維的(即它們位于二維空間中)。 但為了實現(xiàn) 3D 動畫的主要項目目標,這些坐標必須映射到 3 維空間。 這也是使用......你猜對了!......深度學習! Github 上有一個存儲庫以及 ICCV ’17 接受的一篇研究論文。 可以在此處找到存儲庫的鏈接。

3d-pose-baseline 存儲庫在 Human3.6M 數(shù)據(jù)集上訓練了他們的模型。 該數(shù)據(jù)集包含約 360 萬人在 17 種不同場景下的 3D 姿勢及其相應圖像。 簡而言之,模型的輸入是 360 萬人類的圖像,所需的輸出是數(shù)據(jù)集中存在的 3D 姿勢。 現(xiàn)在,可以構(gòu)建和調(diào)整深度學習模型,直到達到相當?shù)臏蚀_度:

4、3D 動畫

一旦我們從姿勢估計框架中獲得了關鍵點的坐標,就可以將這些坐標提供給 3D 角色身體的每個肢體。 在這里,我們使用Unity作為3D動畫環(huán)境來完成任務。

每幀的 17 個關鍵點的坐標存儲在一個文本文件中,該文本文件是在 Unity 中使用 C# 讀取的。 從文件中讀取的坐標現(xiàn)在重新定位到 3D 人形模型中。 這17個關鍵點與Unity內(nèi)置的人形頭像的身體關鍵點進行映射。

現(xiàn)在,動畫是使用 Unity 的逆運動學(inverse kinematics)、骨骼旋轉(zhuǎn)和四元數(shù)完成的。首先看 charanim.cs 的渲染更新函數(shù) update():

void Update()
{
	if (pos == null) {
		return;
	}
	play_time += Time.deltaTime;

	int frame = s_frame + (int)(play_time * 24.057f);  
	if (frame > e_frame) {
		play_time = 0;  
		frame = s_frame;
	}

	if (debug_cube) {
		UpdateCube(frame); 
	}

	Vector3[] now_pos = pos[frame];

	Vector3 pos_forward = TriangleNormal(now_pos[7], now_pos[4], now_pos[1]);
	bone_t[0].position = now_pos[0] * scale_ratio + new Vector3(init_position.x, heal_position, init_position.z);
	bone_t[0].rotation = Quaternion.LookRotation(pos_forward) * init_inv[0] * init_rot[0];

	for (int i = 0; i < bones.Length; i++) {
		int b = bones[i];
		int cb = child_bones[i];
		bone_t[b].rotation = Quaternion.LookRotation(now_pos[b] - now_pos[cb], pos_forward) * init_inv[b] * init_rot[b];
	}

	bone_t[8].rotation = Quaternion.AngleAxis(head_angle, bone_t[11].position - bone_t[14].position) * bone_t[8].rotation;
}

其中的 updateCube() 定義如下:

void UpdateCube(int frame)
	{
		if (cube_t == null) {
			
			cube_t = new Transform[bone_num];

			for (int i = 0; i < bone_num; i++) {
				Transform t = GameObject.CreatePrimitive(PrimitiveType.Cube).transform;
				t.transform.parent = this.transform;
				t.localPosition = pos[frame][i] * scale_ratio;
				t.name = i.ToString();
				t.localScale = new Vector3(0.05f, 0.05f, 0.05f);
				cube_t[i] = t;

				Destroy(t.GetComponent<BoxCollider>());
			}
		}
		else {
			
			Vector3 offset = new Vector3(1.2f, 0, 0);

			
			for (int i = 0; i < bone_num; i++) {
				cube_t[i].localPosition = pos[frame][i] * scale_ratio + new Vector3(0, heal_position, 0) + offset;
			}
		}
	}

最終我們得到的結(jié)果如下,視頻點擊這里:

還不錯!

5、結(jié)束語

總而言之,我們能夠?qū)崿F(xiàn)視頻中多個人的姿勢估計,并使用 Unity 等 3D 環(huán)境制作運動動畫,同時還保持視頻中兩個不同人之間的相對位置。我們項目的 Github 存儲庫鏈接可以在這里找到。


原文鏈接:從姿態(tài)估計到3D動畫 - BimAnt

熱門課程推薦

熱門資訊

請綁定手機號

x

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯(lián)系,請保持電話暢通!
確定