為了能安心看幾集 Netflix 劇,技術(shù)宅奶爸都做了些什么……
長期以來,「奶爸」+「萌娃」一直是一個不被看好的組合,甚至有人說,「父愛如山體滑坡」。
眾所周知,人類幼崽似乎是臺永動機,在一天 24 小時任何時間段里都有可能向你發(fā)難。你能讓自己睡個安穩(wěn)覺的方法看來是在白天消耗他們的精力,因此人們想出了各種各樣的方法。 當(dāng)然,并不是所有的奶爸都這么不靠譜,也有人帶起娃來挺正常的,Agustinus Nalwan 就是其中之一。 Agustinus Nalwan 是 Medium 上的一位博主,曾經(jīng)從事計算機視覺、3D / 動畫、游戲開發(fā)等方面的工作,目前供職于澳洲最大的汽車交易平臺 carsale.com.au。 他有一個兩歲半的兒子,名叫 Dexie。Dexie 非常活潑,喜歡動物,尤其是老鷹,經(jīng)常學(xué)老鷹在家里飛來飛去。
孩子的這種舉動一般也就引起家長的「哈哈」一笑(有的會拍成短視頻發(fā)網(wǎng)上),但 Nalwan 可不是一般的家長,他一直在嘗試用技術(shù)增添帶娃的樂趣。去年三月份,Nalwan 就開發(fā)過一款具有玩具識別能力的系統(tǒng),可以和兒子互動并根據(jù)他手里的玩具播放相關(guān)視頻。
? 這個項目幫他拿到了英偉達(dá)「Jetson Project of the Month: Qrio – an interactive AI bot」活動的大獎,獎品是一臺英偉達(dá) Jetson AGX Xavier。
Jetson AGX Xavier 的配置信息。 這是一種算力不小的開發(fā)者套件,曾被京東、美團(tuán)、菜鳥的無人快遞車用作計算核心。鑒于 Jetson AGX Xavier 配置還不錯,Nalwan 決定用它來幫兒子做一個新玩具,實現(xiàn)他「展翅高飛」的夢想。 新玩具名叫 Griffin(神話中的獅鷲),最終實現(xiàn)效果是這樣的:
當(dāng)然,奶爸也可以跟著一起玩或者自己玩。
這么好的帶娃經(jīng)驗當(dāng)然要分享出來。在最近的一篇博客中,Nalwan 完整地介紹了他打造 Griffin 的完整過程,手頭有娃的可以參考一下。
傳說中獅身鷹首的 griffin。《哈利波特》中的 Gryffindor 學(xué)院意為金色的 griffin。 以下是 Nalwan「從零開始」構(gòu)建整套姿態(tài)識別游戲的歷程。 物料準(zhǔn)備 要實現(xiàn)上圖中的效果,Griffin 需要具備以下模塊:
3D 游戲引擎:借助一個用 OpenGL 寫成的飛行模擬器生成帶有山脈、天空和 Griffin 的 3D 魔幻世界。
人體姿態(tài)估計:使用 OpenPose 姿態(tài)估計模型和 SSD 目標(biāo)檢測模型來持續(xù)檢測玩家的身體姿態(tài),作為系統(tǒng)的輸入,以控制 Griffin。
動作映射和手勢識別:將身體姿態(tài)轉(zhuǎn)化為有意義的動作和手勢,如抬起左 / 右翅膀、左右翻滾身體、起飛等。
通信系統(tǒng):使用 socket 將姿態(tài)輸入送進(jìn) 3D 游戲引擎。
以下是整個系統(tǒng)所需要的硬件:
NVIDIA Jetson AGX Xavier:這是一個 GPU 驅(qū)動的小型嵌入式設(shè)備,用來運行以上所有模塊。它可以通過一個簡單的 HDMI 接口支持音視頻輸出。此外,他還有一個以太網(wǎng)接口,方便聯(lián)網(wǎng)。你甚至可以插入鼠標(biāo)和鍵盤在該設(shè)備上進(jìn)行開發(fā)和調(diào)試,因為它有一個功能齊全的 Ubuntu 18.04 OS。
TV(帶有 HDMI 輸入和內(nèi)置揚聲器):作為游戲引擎的顯示器。
攝像頭:我用的是 Sony IMX327。其實這里只需要 224x224 的圖像分辨率,因此也可以選低端一點的攝像頭。
Blu-Tack:把所有硬件拼接在一起。
Jetson AGX Xavier、 IMX327 攝像頭和 Blu Tack。 實現(xiàn)構(gòu)建 3D 游戲引擎 為了更好地模擬飛行體驗,Griffin 系統(tǒng)將以第三人稱視角渲染 3D 世界。想象一下在 Griffin 正后方有一個攝像頭看著他所看的地方。為什么不用飛行模擬器那樣的第一人稱視角呢?因為看到鷹的翅膀并同步移動自己的手臂,可以幫助 Dexie 快速學(xué)習(xí)如何控制這個游戲,并擁有一個更沉浸式的體驗。 自行構(gòu)建 3D 游戲引擎并非易事,可能需要好幾周的時間。現(xiàn)在大多數(shù)開發(fā)者只使用專門的游戲引擎,如 Unity 或 Unreal。但是很遺憾,我找不到可以在 Ubuntu OS/ARM 芯片組上運行的游戲引擎。一種替代方法是找到在 OpenGL 上運行的開源飛行模擬器。這可以保證游戲引擎能在 AGX 上運行,因為它支持 OpenGL ES(OpenGL 的輕量級版本)并且得到硬件加速。如果你不想游戲引擎以龜速運行的話,則這是必要的條件。 幸運的是,我找到了一個滿足標(biāo)準(zhǔn)的 C++ 開源飛行模擬器,并做了以下修改:
我用基于目標(biāo)的系統(tǒng)替換了基于按鍵的飛行控制系統(tǒng)。這樣我就可以不時地設(shè)置 Griffin 身體的目標(biāo)旋轉(zhuǎn)角度,之后這一旋轉(zhuǎn)目標(biāo)將通過手勢識別模塊自行設(shè)置,該模塊可以映射 Dexie 胳膊的方向。
我增強了靜態(tài) 3D 模型管理,以支持層級結(jié)構(gòu)。原始的飛機模型是作為一個剛體移動的,它沒有移動的身體部位。但是 Griffin 有兩個翅膀,需要獨立于身體單獨運動。為此,我添加了兩個翅膀,使之作為身體之上的單獨 3D 模型。我可以單獨旋轉(zhuǎn)每個翅膀,也可以移動 Griffin 的身體,間接移動兩個翅膀。實現(xiàn)該目標(biāo)的一種恰當(dāng)方式是構(gòu)建骨骼動畫系統(tǒng),將身體部位組織為樹結(jié)構(gòu)的形式。但是,由于我要處理的身體部位只有三個(身體和兩個翅膀),因此我可以選擇一種簡便的方式。為了編輯鷹和樹 3D 模型,我使用了一個免費易用的 3D 編輯工具 Blender。
在 Blender 中編輯鷹的 3D 模型。
我添加了 Griffin 起飛狀態(tài)的樹模型,以及無需重啟應(yīng)用即可重啟游戲的游戲狀態(tài)。Griffin 有兩種狀態(tài):站立(站在樹枝上)和飛翔。
我利用 libSFML 添加音效播放:當(dāng) Griffin 起飛時,會出現(xiàn)鷹的尖嘯和風(fēng)聲。
構(gòu)建人體姿態(tài)估計模塊 該模塊旨在檢測來自攝像頭輸入的人體姿態(tài)。具體而言,我們需要知道左 / 右手肘、左 / 右肩膀、脖子和鼻子的位置,才能駕馭 Griffin 的翅膀和身體,并觸發(fā)特定的姿勢。OpenPose 是一個流行的開源庫,并具備大量估計人體姿態(tài)、手部姿勢和面部特征的 AI 模型。我使用的是人體姿態(tài)估計 COCO 模型,以 resnet18 作為骨干特征提取器。該模型可以實時檢測 18 個關(guān)節(jié)點,包括上述我們所需的 6 個點。
COCO 關(guān)節(jié)點圖。 這里存在一個大問題:OpenPose 基于 PyTorch 框架構(gòu)建,在 NVIDIA AGX Xavier 中運行速度很慢(4FPS),因為它無法利用重度優(yōu)化的 TensorRT 框架。幸運的是,還有一個厲害的工具 torch2trt,它可以自動將 PyTorch 模型移植到 TensorRT 框架中!具體步驟是:安裝 OpenPose,將 PyTorch 轉(zhuǎn)換為 TensorRT,下載預(yù)訓(xùn)練 resnet18 骨干模型。 為了獲取來自攝像頭的視頻內(nèi)容,我使用另一個庫 Jetcam。只需要四行代碼,就可以運行。
人體姿態(tài)估計。 這樣就得到了可以 100FPS 速度運行的人體姿態(tài)估計模塊! 經(jīng)過一些測試后,我發(fā)現(xiàn)有時候這個模型會將隨機對象錯誤地識別為關(guān)節(jié)點(假正例,如下圖所示),這會給 Griffin 的動作控制帶來麻煩。
使用 Amazon SageMaker JumpStart 構(gòu)建目標(biāo)檢測模型 解決該問題的一種方式是添加一個輔助 AI 模型,用目標(biāo)檢測模塊來提供人體邊界框,這樣就可以排除掉在邊界框以外檢測到的人體關(guān)節(jié)點了。此外,這些邊界框還可以幫助在一堆人中識別主要玩家,距離攝像頭最近的人應(yīng)該是主要玩家。 在之前的項目中,我手動訓(xùn)練過 SSDMobileNetV2 目標(biāo)檢測模型。這次我選擇使用 Amazon SageMaker JumpStart,只需一鍵操作就可以從 TensorFlowHub 和 PyTorchHub 部署 AI 模型。這里有 150 多個可選的模型,其中就有經(jīng)過完全預(yù)訓(xùn)練的 SSDMobileNetV2。
從 Amazon SageMaker Studio 中啟動 JumpStart。 在 Amazon JumpStart 中選擇 SSDMobileNetV2 后,只需一鍵操作就可以部署模型。有了目標(biāo)檢測模型后,我可以為邊界框以外的關(guān)節(jié)點添加 exclusion logic,這樣假正例就會少很多!
在人體邊界框以外的關(guān)節(jié)點被排除在外。 構(gòu)建動作映射和手勢識別模塊 該模塊對于將人體姿態(tài)估計模塊檢測到的 6 個關(guān)節(jié)點動作轉(zhuǎn)換為更具意義的輸入至關(guān)重要。這包括三種直接的動作映射:
飛行時的身體轉(zhuǎn)動:用于控制 Griffin 飛行時的方向。身體轉(zhuǎn)動可以通過橫軸和左右手肘向量之間的夾角進(jìn)行計算(下圖上)。在飛行時,兩只翅膀基于這一轉(zhuǎn)動角度同步移動。選擇手肘而不是手腕是為了最大化可見度,因為手腕經(jīng)常會掉出攝像頭視角或被其他身體部位遮擋住。
站立時的翅膀旋轉(zhuǎn):這純粹是出于美觀,為了讓游戲更具趣味性,給人一種站立的時候可以單獨控制每個翅膀的印象。這通過橫軸與肩膀 - 手肘向量之間的夾角進(jìn)行計算(下圖下)。最終的翅膀旋轉(zhuǎn)角度會添加 15 度,以加大翅膀的動作,畢竟人長時間舉高胳膊會很累。
身體轉(zhuǎn)動和翅膀旋轉(zhuǎn)時的動作映射。
蹲伏:這是另一個美觀動作,可以讓人感受到能夠控制 Griffin 起飛前的蹲伏姿勢。這通過脖子 - 鼻子向量和肩膀向量之間的長度比進(jìn)行計算。蹲伏得越深,脖子和鼻子之間的距離越短,而左右肩膀之間的距離保持不變,因此長度比變小。
蹲伏動作映射。
起飛姿勢:當(dāng)左右肩膀之間的中心點在一秒內(nèi)上下移動的幅度超過閾值時,則該動作會被識別為起飛姿勢。閾值是肩膀之間的長度。當(dāng)這一動作被觸發(fā)時,Griffin 會跳下樹枝,開始飛翔。
游戲復(fù)位姿勢:當(dāng)左右肩膀的水平位置反轉(zhuǎn)時則為游戲復(fù)位姿勢,如玩家背對攝像頭。游戲?qū)?fù)位,Griffin 回到站在樹上的姿勢,準(zhǔn)備下一次飛行。
起飛和復(fù)位手勢識別。 通信系統(tǒng) 現(xiàn)在,我們完成了三個主要組件,只需要將它們粘合在一起就行了。我們需要將姿態(tài)估計模塊檢測到的人體關(guān)節(jié)點發(fā)送至手勢識別模塊,這個任務(wù)比較簡單。但是,將動作和姿勢映射結(jié)果發(fā)送至 3D 游戲引擎就不那么簡單了,因為游戲引擎是用 C++ 寫的。你可能會疑惑為什么不用 Python 構(gòu)建 3D 游戲引擎,原因在于沒有靠譜的方式來使用 Python 訪問 OpenGL。此外,即使可能,我也不想花費好幾周時間將 C++ 轉(zhuǎn)換為 Python 代碼。 此時我需要以最小花銷高效地在這二者之間傳遞信息。對于游戲引擎而言,最小花銷是非常重要的因素,輸入控制器和動作發(fā)生之間出現(xiàn) 100ms 的延遲都會導(dǎo)致玩家失去沉浸式體驗。因此,兩個單獨應(yīng)用之間的最好通信媒介是 socket。由于這兩個應(yīng)用在同一臺計算機內(nèi),因此延遲會在 5ms 以內(nèi)。 在 C++ 中,我們簡單地使用 sys/socket 庫,而在 Python 中,我們可以使用 socket 框架。從現(xiàn)在開始,我把手勢識別和姿態(tài)估計模塊稱作 Python app,該客戶端發(fā)送五種信息:roll_target、lwing_target、rwing_target、body_height 和 game_state。把 3D 游戲引擎稱為 C++ app,充當(dāng)監(jiān)聽并不斷接收上述信息的服務(wù)器。 為了將這五種信息 / 變量正確地從 Python 映射到 C++ 上,在發(fā)送之前我們需要將其放置在 Python C-like 結(jié)構(gòu)中。
class Payload(Structure): _fields_ = [(“roll_target”, c_int32), (“l(fā)wing_target”, c_int32), ("rwing_target", c_int32), ("body_height", c_int32), ("game_state", c_int32)] 在 C++ app 中,它們以本機 C 結(jié)構(gòu)形式接收。
typedef struct payload_t { int32_t roll_target; int32_t lwing_target; int32_t rwing_target; int32_t body_height; int32_t game_state;} payload; 從下面的架構(gòu)圖可以看出,通信層由一個位于 Python app 中的客戶端模塊和一個位于 C ++ app 中的服務(wù)器模塊組成。
Griffin 的整體架構(gòu)圖。 校準(zhǔn)與測試 準(zhǔn)備就緒后,我設(shè)置了 Griffin 系統(tǒng)以執(zhí)行校準(zhǔn)和測試。這套系統(tǒng)的性能要比我預(yù)測的好很多,在執(zhí)行所有實時 3D 渲染和姿態(tài)估計時一直都保持在 60FPS 的幀率,看來英偉達(dá)的 Jetson AGX Xavier 性能強大不是說說而已。在下面的視頻中,你可以看到校準(zhǔn)和測試的過程。這個視頻幀率較低,是因為我在 Ubuntu 桌面上以 15FPS 錄屏,盡量減少對 Griffin 的影響。
Griffin 系統(tǒng)的校準(zhǔn)與測試。 起飛 最后,是時候讓 Dexie 用 Griffin 嘗試第一次飛行了,這才是真正的大考。我在客廳里架設(shè)好了系統(tǒng),我兒子一直在不耐煩地等待行動。
Dexie 使用 Griffin 飛行的經(jīng)歷。 我只演示了一遍如何控制 Griffin 系統(tǒng),跳一下就是起飛,展開手臂依靠姿勢控制翅膀,Dexie 就學(xué)會了。由于游戲是第三人稱視角,所以他很快就發(fā)現(xiàn)畫面中翅膀的運動是直接和自己姿勢同步的。隨后他就開始享受自己的飛行體驗了。沒有什么是比你自己更好的游戲控制器了——記住喬布斯在發(fā)布第一代 iPhone 時嘲笑手寫筆時所說的話。 有意思的是,Dexie 有次快要撞山時,他奮力揚起手臂想要來個急轉(zhuǎn)彎,但由于我設(shè)置了最大旋轉(zhuǎn)角度限制,Griffin 不允許他飛特別極限的角度,隨后他就撞了山…… 當(dāng)時是這個樣子:
Dexie 在 Griffin 上的首飛。 他上來就玩了半小時,發(fā)瘋似地?fù)]舞著手臂,直到疲倦襲來。最重要的是,那天晚上他睡得很香,對我們來說這是一次勝利!我有更多時間看 Netflix 了 :)
總結(jié) 構(gòu)建這樣一套系統(tǒng)讓我學(xué)到了很多,同時獲得的樂趣也很多。總體來說我學(xué)到了:
Torch2trt 是一個很強大的工具,可以自動將 PyTorch 模型轉(zhuǎn)化為 TensorRT 版,讓 AI 模型在 Jetson AGX Xavier 上運行地更快。很多最先進(jìn)的 AI 模型都是用 PyTorch 構(gòu)建起來的,但手動將它們移植到 TensorFlow 上可不是好的體驗。
英偉達(dá) Jetson AGX Xavier 的性能非常強大!很多人說它可以實時處理 30 個 1080p 視頻流的計算機視覺模型處理任務(wù),看來的確是這樣。
亞馬遜 SageMaker JumpStart 提供了大量流行的 AI 模型,并讓它們非常易于部署。
構(gòu)建 3D 游戲引擎的經(jīng)歷讓我重拾之前作為游戲和電影 SFX 開發(fā)人員的經(jīng)歷,再次用起了生疏的 OpenGL、C++ 和三角學(xué)方面的技能。
說到動作識別游戲,人們自然會想到 Xbox——我本可以用 Unity 引擎和 Kinect 傳感器在 Xbox 上構(gòu)建一個 Griffin,但是這樣不就沒有太大意義了嗎?有時從頭構(gòu)建一套系統(tǒng)才是樂趣所在。
扮演老鷹是一個很累的工作,尤其是長時間抬起手臂這件事。不過真正的老鷹是通過上升氣流獲得幫助并滑翔在天空中的。
不知這樣的一段經(jīng)歷,是否能給你一些啟發(fā)? 最后,作者計劃在近期將項目代碼開源出來。
原文標(biāo)題:用AI「馴服」人類幼崽:這個奶爸找到了硬核帶娃的樂趣
文章出處:【微信公眾號:人工智能與大數(shù)據(jù)技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
AI
+關(guān)注
關(guān)注
87文章
32493瀏覽量
271701 -
人工智能
+關(guān)注
關(guān)注
1800文章
48098瀏覽量
242235
原文標(biāo)題:用AI「馴服」人類幼崽:這個奶爸找到了硬核帶娃的樂趣
文章出處:【微信號:TheBigData1024,微信公眾號:人工智能與大數(shù)據(jù)技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
【書籍評測活動NO.59】零基礎(chǔ)開發(fā)AI Agent——手把手教你用扣子做智能體
10分鐘快速打造爆款AI硬件!涂鴉產(chǎn)品AI功能和智能體開發(fā)平臺重磅上新

《AI Agent 應(yīng)用與項目實戰(zhàn)》----- 學(xué)習(xí)如何開發(fā)視頻應(yīng)用
《AI Agent 應(yīng)用與項目實戰(zhàn)》第1-2章閱讀心得——理解Agent框架與Coze平臺的應(yīng)用
AI開發(fā)平臺模型怎么用
名單公布!【書籍評測活動NO.55】AI Agent應(yīng)用與項目實戰(zhàn)
馬斯克預(yù)言:AI將全面超越人類智力
怎么用Clion開發(fā)APM32

評論