在機(jī)器學(xué)習(xí)和計(jì)算機(jī)視覺領(lǐng)域,姿勢(shì)預(yù)測(cè)或根據(jù)圖像數(shù)據(jù)探測(cè)人體及其姿勢(shì)的能力,堪稱最令人興奮而又最棘手的一個(gè)話題。近期,Google 公布了PoseNet,這是一個(gè)先進(jìn)的姿勢(shì)預(yù)測(cè)模型,可從圖像數(shù)據(jù)中提取非常精準(zhǔn)的姿勢(shì)數(shù)據(jù)(即便在圖像模糊不清、分辨率低或僅為黑白色的情況下仍能做到)。本文將詳細(xì)介紹這項(xiàng)實(shí)驗(yàn),正是在該實(shí)驗(yàn)的推動(dòng)下,我們率先創(chuàng)建了這一適用于網(wǎng)頁的姿勢(shì)預(yù)測(cè)內(nèi)容庫(kù)。
幾個(gè)月前,我們開展了一項(xiàng)名為Move Mirror的趣味原型實(shí)驗(yàn):您只需四下走動(dòng),即可在瀏覽器中檢索相應(yīng)圖像。該實(shí)驗(yàn)創(chuàng)造了一種動(dòng)畫般的獨(dú)有體驗(yàn),它會(huì)追蹤您的動(dòng)作并據(jù)此呈現(xiàn)各種人體動(dòng)作圖像,其中包括體育運(yùn)動(dòng)、舞蹈、武術(shù)以及表演等多種動(dòng)作。我們希望在網(wǎng)頁上推出這項(xiàng)體驗(yàn),讓其他人也有機(jī)會(huì)親身感受,了解機(jī)器學(xué)習(xí)相關(guān)知識(shí),然后與好友分享。但遺憾的是,我們面臨著一個(gè)問題:眼下沒有可公開獲取的網(wǎng)頁專用姿勢(shì)預(yù)測(cè)模型。
一般而言,用戶在處理姿勢(shì)數(shù)據(jù)時(shí)需要訪問特殊硬件或需要具備 C++/Python 計(jì)算機(jī)視覺庫(kù)的相關(guān)使用經(jīng)驗(yàn)。由此,我們發(fā)現(xiàn)了一個(gè)有助推動(dòng)姿勢(shì)預(yù)測(cè)更加大眾化的難得機(jī)會(huì),具體方法是將內(nèi)部模型移植到TensorFlow.js中,這是一個(gè) Javascript 庫(kù),支持用戶在瀏覽器中運(yùn)行機(jī)器學(xué)習(xí)項(xiàng)目。我們組建了一支團(tuán)隊(duì),耗費(fèi)數(shù)月來開發(fā)這一內(nèi)容庫(kù),并最終推出了PoseNet這一開放源代碼工具,該工具允許任何網(wǎng)頁開發(fā)者完全在瀏覽器內(nèi)輕松處理人體互動(dòng),且無需配備專門的攝像頭或具備 C++/Python 技能。
隨著 PoseNet 的問世,我們最終得以發(fā)布Move Mirror?項(xiàng)目,該項(xiàng)目可謂實(shí)驗(yàn)和趣味游戲提升工程設(shè)計(jì)工作價(jià)值的明證。正是由于研究團(tuán)隊(duì)、產(chǎn)品團(tuán)隊(duì)和創(chuàng)意團(tuán)隊(duì)的真誠(chéng)合作,我們才得以成功構(gòu)建 PoseNet 和 Move Mirror。
Move Mirror是一項(xiàng) AI 實(shí)驗(yàn),能夠檢測(cè)您的姿勢(shì),并將檢測(cè)到的動(dòng)作與全球成千上萬張圖像進(jìn)行匹配
繼續(xù)閱讀,以深入了解我們的實(shí)驗(yàn)思路、我們?cè)跒g覽器中預(yù)測(cè)姿勢(shì)時(shí)經(jīng)歷的興奮點(diǎn),以及令我們甚為激動(dòng)的后續(xù)創(chuàng)意。
什么是姿勢(shì)預(yù)測(cè)?什么是 PoseNet?
您或許已猜到,姿勢(shì)預(yù)測(cè)是一個(gè)極為復(fù)雜的問題:人的體型大小各異;需追蹤的關(guān)節(jié)數(shù)量眾多(這些關(guān)節(jié)在空間中的連接方式多種多樣);周圍通常還會(huì)有其他人及/或物體遮擋視線。有些人使用輪椅或拐杖等輔助裝置,這可能會(huì)阻擋攝像頭對(duì)人體的取像;有些人或許肢體不全,還有些人的身體比例可能與常人迥然不同。我們希望,我們的機(jī)器學(xué)習(xí)模型能夠理解并推理各類不同體型的數(shù)據(jù)。
此圖顯示 PoseNet 針對(duì)不同輔助裝置(如手杖、輪椅和假肢)的使用者給出的關(guān)節(jié)檢測(cè)結(jié)果
過去,在解決姿勢(shì)預(yù)測(cè)問題時(shí),技術(shù)專家曾使用專門的攝像頭和傳感器(如 3D 眼鏡、動(dòng)作捕捉套裝和紅外攝像頭),以及可從 2D 圖像中提取預(yù)測(cè)姿勢(shì)的計(jì)算機(jī)視覺技術(shù)(如OpenPose)。這些解決方案盡管有效,但往往需要采用昂貴而又遠(yuǎn)未普及的技術(shù),并且/或者要熟知計(jì)算機(jī)視覺庫(kù)以及 C++ 或 Python。這加大了普通開發(fā)者迅速開展趣味姿勢(shì)實(shí)驗(yàn)的難度。
首次使用 PoseNet 時(shí),發(fā)現(xiàn)它可通過簡(jiǎn)單的 web API 獲取,這讓我們無比激動(dòng)。突然間,我們就可以在 Javascript 中輕松迅速地開展姿勢(shì)預(yù)測(cè)原型實(shí)驗(yàn)了。我們只需向內(nèi)部終端地址發(fā)送 HTTP POST 請(qǐng)求以及圖像的 base64 數(shù)據(jù),API 終端地址便會(huì)為我們返回姿勢(shì)數(shù)據(jù),而且?guī)缀鯖]有任何延遲時(shí)間。這大大降低了開展小型探索性姿勢(shì)實(shí)驗(yàn)的準(zhǔn)入門檻:只需寥寥幾行 JavaScript 代碼和一個(gè) API 密鑰,即可大功告成!當(dāng)然,并非人人都能夠在后端運(yùn)行自己的 PoseNet,而且(按常理)并非人人都愿意將自己的照片發(fā)送到中央服務(wù)器。我們?nèi)绾尾拍茏屓藗冇锌赡苓\(yùn)行自己的姿勢(shì)實(shí)驗(yàn),而不必依賴自己或他人的服務(wù)器呢?
我們意識(shí)到,這是將 TensorFlow.js 與 PoseNet 相連接的絕佳機(jī)會(huì)。使用 TensorFlow.js,用戶可以直接在瀏覽器中運(yùn)行機(jī)器學(xué)習(xí)模型,無需服務(wù)器。將 PoseNet 移植到 TensorFlow.js 后,只要用戶擁有一部質(zhì)量尚可且配備網(wǎng)絡(luò)攝像頭的桌面設(shè)備或電話,便可直接在網(wǎng)絡(luò)瀏覽器內(nèi)親身體驗(yàn)并嘗試使用這項(xiàng)技術(shù),而無需擔(dān)心低級(jí)計(jì)算機(jī)視覺庫(kù),亦無需設(shè)置復(fù)雜的后端和 API。通過與 TensorFlow.js 團(tuán)隊(duì)的Nikhil Thorat和Daniel Smilkov、Google 研究員George Papandreou和Tyler Zhu,以及Dan Oved展開密切協(xié)作,我們已能將某個(gè) PoseNet 模型版本移植到 TensorFlow.js 中。(您可以在此處了解該流程的詳細(xì)信息。)
關(guān)于在 TensorFlow.js 中使用 PoseNet,還有一些方面也讓我們感到非常興奮:
無處不在/隨地獲取:大多數(shù)開發(fā)者均能訪問文本編輯器和網(wǎng)絡(luò)瀏覽器,而且 PoseNet 使用起來非常簡(jiǎn)便,只需在您的 HTML 文件中添加兩個(gè)腳本標(biāo)記即可,無需進(jìn)行復(fù)雜的服務(wù)器設(shè)置。此外,您無需配備專門的高分辨率攝像頭、紅外攝像頭或傳感器來獲取數(shù)據(jù)。我們發(fā)現(xiàn),其實(shí) PoseNet 在處理低分辨率、黑白以及老舊照片時(shí)依然表現(xiàn)良好。
可供分享:TensorFlow.js PoseNet 實(shí)驗(yàn)可全部在瀏覽器中運(yùn)行,因此您不費(fèi)吹灰之力,即可在瀏覽器中分享該實(shí)驗(yàn)。無需構(gòu)建特定的操作系統(tǒng)版本,只需上傳網(wǎng)頁即可。
隱私性:由于姿勢(shì)預(yù)測(cè)的全部工作均可在瀏覽器中完成,因此您的所有圖像數(shù)據(jù)均會(huì)留存在本地計(jì)算機(jī)中。您無需將照片發(fā)送至某個(gè)云端服務(wù)器以利用集中式服務(wù)開展姿勢(shì)分析(例如,當(dāng)您使用自己無法控制的視覺 API 時(shí),或此 API 可能發(fā)生故障,或存在任何不可控因素時(shí)),只需使用自身設(shè)備即可完成所有的姿勢(shì)預(yù)測(cè)工作,并能精確控制圖像的移動(dòng)位置。借助 Move Mirror,我們可以將 PoseNet 輸出的 (x,y) 關(guān)節(jié)數(shù)據(jù)與后端的姿勢(shì)圖庫(kù)進(jìn)行匹配,但您的圖像仍會(huì)完全留存在您自己的計(jì)算機(jī)中。
技術(shù)討論到此結(jié)束:下面我們來談?wù)勗O(shè)計(jì)!
設(shè)計(jì)與靈感
我們?cè)馁M(fèi)數(shù)周時(shí)間,四處摸索不同的姿勢(shì)預(yù)測(cè)原型。對(duì)于我們當(dāng)中有過 C++ 或 Kinect 黑客行為的人來說,僅僅是使用網(wǎng)絡(luò)攝像頭在瀏覽器中看到我們的骨骼反射回自身,就足以稱得上是令人驚嘆的演示。我們?cè)趯?duì)移動(dòng)軌跡、木偶以及其他各類易于操控的物件進(jìn)行過試驗(yàn)之后,才開始真正著眼于后來的Move Mirror 概念。
若聽到 Google 創(chuàng)意實(shí)驗(yàn)室的許多研究員都有意進(jìn)行搜索和探究,這也許不足為奇。在談及姿勢(shì)預(yù)測(cè)的用途時(shí),我們都覺得通過姿勢(shì)搜索歸檔數(shù)據(jù)的想法十分有趣。如果您在擺出姿勢(shì)后,得到一個(gè)您在做舞蹈動(dòng)作的結(jié)果,會(huì)怎么樣?或者更有趣的是,您在擺出姿勢(shì)后得到一個(gè)相同的動(dòng)作結(jié)果,但該結(jié)果卻與您所處情境完全不同,又會(huì)怎么樣?從武術(shù)、烹飪、滑雪到嬰兒的第一次學(xué)步,我們?nèi)绾螐募姺倍鄻拥娜梭w活動(dòng)中找到這種古怪、偶然的聯(lián)系呢?這會(huì)如何讓我們大吃一驚、愉悅享受,并開懷大笑呢?
出自 Awwwards 的Land Lines Gif;出自 Cooper Hewitt 的Gesture Match 圖像
我們的靈感源自于Land Lines(該實(shí)驗(yàn)會(huì)使用手勢(shì)數(shù)據(jù)探索 Google 地球中的相似線條)和 Cooper Hewitt 的Gesture Match(這是一個(gè)現(xiàn)場(chǎng)安置項(xiàng)目,可通過姿勢(shì)匹配從歸檔數(shù)據(jù)中查找相應(yīng)條目)等項(xiàng)目。不過,從美學(xué)上來看,我們傾向于采用更迅速且更實(shí)時(shí)的方式。我們熱衷這一想法,即調(diào)用連續(xù)不斷的圖像來響應(yīng)您的動(dòng)作,并通過您的動(dòng)作將各行各業(yè)的人們聯(lián)系在一起。從The Johnny Cash 項(xiàng)目中所用的轉(zhuǎn)描和縮時(shí)攝影技術(shù)得到啟發(fā),再加上 YouTube 上自拍縮時(shí)攝影趨勢(shì)的推動(dòng),我們決定鉚足干勁,著力在瀏覽器中實(shí)現(xiàn)實(shí)時(shí)響應(yīng)式姿勢(shì)匹配(盡管這本身就是一個(gè)十分復(fù)雜的問題)。
The Johnny Cash 項(xiàng)目生成的Gif,在此項(xiàng)目中已有超過 250000 人為 “Ain’t No Grave” 這首歌描畫框架,制作眾包的音樂視頻
構(gòu)建 Move Mirror
盡管 PoseNet 會(huì)為我們作出姿勢(shì)預(yù)測(cè),但我們?nèi)杂性S多任務(wù)要完成。這項(xiàng)實(shí)驗(yàn)的核心體驗(yàn)全部在于尋找與用戶姿勢(shì)相匹配的圖像,如此,當(dāng)您直立且右臂上揚(yáng)時(shí),Move Mirror 便能找到某人站立且抬起右臂的圖像。為此,我們需要做好三項(xiàng)準(zhǔn)備:圖像數(shù)據(jù)集、搜索該數(shù)據(jù)集的技術(shù)和姿勢(shì)匹配算法。下面我們來逐一細(xì)談。
構(gòu)建數(shù)據(jù)集:搜索多樣圖片
要?jiǎng)?chuàng)建有用的數(shù)據(jù)集,我們必須搜索共同涵蓋海量人體動(dòng)作的圖像。如果數(shù)據(jù)集中未包含其他姿勢(shì),而只有 400 張舉起右臂直立的人體圖像,這將毫無意義。為確保提供始終如一的體驗(yàn),我們還決定只尋找全身圖像。最終,我們出品了系列視頻,在我們看來,這些視頻不僅代表著各類動(dòng)作,而且還涵蓋各種體型、膚色、文化特質(zhì)和身體能力。我們將這些視頻分為大約 80000 個(gè)靜止幀,然后使用 PoseNet 處理了每張圖像,并存儲(chǔ)了相關(guān)的姿勢(shì)數(shù)據(jù)。接下來,我們來探討最棘手的部分:姿勢(shì)匹配與搜索。
我們通過 PoseNet 解析了數(shù)千張圖像。您會(huì)發(fā)現(xiàn),并非所有圖像都解析正確,因此我們舍棄了一些,最終得到的數(shù)據(jù)集約包含 80000 張圖像
姿勢(shì)匹配:定義相似性時(shí)遇到的挑戰(zhàn)
要讓 Move Mirror 正常運(yùn)作,我們首先要明確該如何定義“匹配”?!捌ヅ洹敝傅氖钱?dāng)用戶擺出一個(gè)姿勢(shì)時(shí),我們根據(jù)接收到的姿勢(shì)數(shù)據(jù)返回的圖像。在談及由 PoseNet 生成的“姿勢(shì)數(shù)據(jù)”時(shí),我們指的是一組包含 17 個(gè)身體或面部部位的數(shù)據(jù),例如我們稱為“關(guān)鍵點(diǎn)”的肘部或左眼部位。PoseNet 會(huì)返回輸入圖像中每個(gè)關(guān)鍵點(diǎn)的 x 和 y 坐標(biāo),以及相應(yīng)的置信度得分(稍后會(huì)詳細(xì)介紹)。
PoseNet 會(huì)檢測(cè)面部和身體的 17 個(gè)姿勢(shì)關(guān)鍵點(diǎn)。每個(gè)關(guān)鍵點(diǎn)均包括三個(gè)重要的數(shù)據(jù)塊:(x,y) 坐標(biāo)(代表輸入圖像中 PoseNet 找到該關(guān)鍵點(diǎn)的像素位置)和置信度得分(PoseNet 認(rèn)為其猜測(cè)正確的信心度)
定義 “相似度” 是我們遇到的第一個(gè)難題。對(duì)于用戶的 17 個(gè)關(guān)鍵點(diǎn)數(shù)據(jù)組與數(shù)據(jù)集中圖像的 17 個(gè)關(guān)鍵點(diǎn)數(shù)據(jù)組,我們應(yīng)如何確定二者之間的相似度?我們嘗試了幾種不同方法來確定相似度,最終敲定了兩種有效方式:余弦相似度和結(jié)合關(guān)鍵點(diǎn)置信度得分得出的加權(quán)匹配。
匹配策略 #1:余弦距離
如果我們將每組的 17 個(gè)關(guān)鍵點(diǎn)數(shù)據(jù)轉(zhuǎn)換為一個(gè)向量,并將其標(biāo)繪在高維空間中,那么尋找兩個(gè)最相似姿勢(shì)的任務(wù)便會(huì)轉(zhuǎn)化為在此高維度空間中尋找兩個(gè)最接近的向量。這就是余弦距離的用途所在。
余弦相似度是一種測(cè)量?jī)蓚€(gè)向量之間相似度的方法:主要測(cè)量?jī)蓚€(gè)向量的夾角,在向量指向完全相反時(shí)返回 -1,而在指向幾乎完全相同時(shí)則返回 1。重要的是,這種方法測(cè)量的是方向而非數(shù)值。
余弦相似度的直觀描述,出自Christian Perone
雖然我們現(xiàn)在談?wù)摰氖窍蛄亢徒嵌?,但這并不限于圖表上的線條。例如,您可以使用余弦相似度來獲得兩個(gè)等長(zhǎng)字符串之間的數(shù)值相似度。(如果您以前使用過Word2Vec,可能已間接用到余弦相似度。)這一方法的確非常實(shí)用,能夠?qū)蓚€(gè)高維向量(兩個(gè)長(zhǎng)句或兩個(gè)長(zhǎng)數(shù)組)之間的關(guān)系最終簡(jiǎn)化為一個(gè)單一數(shù)值。
Nish Tahir 典型示例簡(jiǎn)化版。不懂向量數(shù)學(xué)也無妨,重點(diǎn)在于我們能夠?qū)蓚€(gè)抽象的高維數(shù)據(jù)塊(5 個(gè)唯一字詞為 5 維)轉(zhuǎn)化為一個(gè)表示二者相似度的歸一化數(shù)值。這里,您也可以嘗試使用自己的語句
我們輸入的數(shù)據(jù)是 JSON,但我們可以將這些值輕松壓縮為一維數(shù)組,其中每個(gè)條目均象征著某一個(gè)關(guān)鍵點(diǎn)的 X 或 Y 坐標(biāo)。只要我們的結(jié)構(gòu)保持統(tǒng)一并且可預(yù)測(cè),便能以相同的方式對(duì)生成的數(shù)組展開比較。這就是我們的第一步:將物體數(shù)據(jù)變?yōu)閿?shù)組。
源自 PoseNet 的 JSON 數(shù)據(jù)片段,以及包含 X 和 Y 坐標(biāo)的扁平化數(shù)組的數(shù)據(jù)片段。(您會(huì)發(fā)現(xiàn)該數(shù)組并未考慮到置信度,我們稍后會(huì)回到這個(gè)話題!)
這樣,我們就可以使用余弦相似度來求得所輸入的 34 位浮點(diǎn)數(shù)組與數(shù)據(jù)庫(kù)中任何給定的 34 位浮點(diǎn)數(shù)組之間的相似度測(cè)量值。我們偶爾也可輸入兩個(gè)長(zhǎng)數(shù)組,然后獲得更易解析的相似度得分(介于 -1 與 1 之間)。
由于數(shù)據(jù)集中所有圖像的寬度/高度各不相同,且每個(gè)人還會(huì)出現(xiàn)在不同的圖像子集(左上、右下或中央子集等)中,因此我們額外執(zhí)行了兩個(gè)步驟,以便能對(duì)數(shù)據(jù)作出一致比較:
調(diào)整尺寸與縮放:我們根據(jù)每個(gè)人的邊界框坐標(biāo)來將每張圖像(以及相應(yīng)的關(guān)鍵點(diǎn)坐標(biāo))裁剪并縮放至同等尺寸。
歸一化:我們將得到的關(guān)鍵點(diǎn)坐標(biāo)視為 L2 歸一化向量數(shù)組,將其進(jìn)一步歸一化。
具體而言,我們使用L2 歸一化來進(jìn)行第二步,這表示我們要將向量縮放為單位范數(shù)(如果將 L2 歸一化向量中的每個(gè)元素進(jìn)行一致化處理并對(duì)其求和,所得結(jié)果將為 1)。比較這些圖表,即可了解歸一化對(duì)向量的轉(zhuǎn)換方式:
利用 L2 歸一化縮放的向量
對(duì)上述兩個(gè)步驟可作如下直觀考慮:
Move Mirror 數(shù)據(jù)歸一化步驟
使用歸一化處理后的關(guān)鍵點(diǎn)坐標(biāo)(以向量數(shù)組形式存儲(chǔ)),我們最終可計(jì)算出余弦相似度并執(zhí)行若干計(jì)算(下文將詳細(xì)介紹),從而得出一個(gè)可解釋為余弦距離的歐幾里得距離。計(jì)算公式如下所示:
在以上公式中,F(xiàn)xy 與 Gxy 表示經(jīng) L2 歸一化處理后可供比較的兩個(gè)姿勢(shì)向量。此外,F(xiàn)xy 和 Gxy 僅包含 17 個(gè)關(guān)鍵點(diǎn)的 X 和 Y 坐標(biāo),并不包含每個(gè)關(guān)鍵點(diǎn)的置信度得分。
JavaScript 要點(diǎn)如下所示:
一目了然,對(duì)吧?開始匹配吧!
匹配策略 #2:加權(quán)匹配
好吧,其實(shí)這種方法仍存在很大缺陷。上例中,我們?cè)谟?jì)算余弦相似度時(shí)使用了兩個(gè)句子:“Jane likes to code” 和 “Irene likes to code”,這兩句話是靜態(tài)的:我們已就二者表示的含義得出了 100% 的置信度。但姿勢(shì)預(yù)測(cè)并非如此索然無味。事實(shí)上,我們?cè)谂ν茢嚓P(guān)節(jié)位置時(shí),幾乎從未得出 100% 的置信度。我們也能做到十分接近,但除非變成 X 光機(jī),否則我們很難精確達(dá)到 100% 的置信度。有時(shí),我們也會(huì)完全看不到關(guān)節(jié),只能根據(jù)獲知的其他人體信息作出最佳猜測(cè)。
Posenet 會(huì)返回每個(gè)關(guān)鍵點(diǎn)的置信度得分。該模型預(yù)測(cè)關(guān)鍵點(diǎn)的置信度得分越高,結(jié)果就會(huì)越準(zhǔn)確
由此,每個(gè)返回的關(guān)節(jié)數(shù)據(jù)塊也會(huì)有置信度得分。有時(shí),我們非常自信能夠確定關(guān)節(jié)的位置(例如當(dāng)我們可以清楚看到關(guān)節(jié)時(shí));但有些時(shí)候,我們的置信度會(huì)很低(例如當(dāng)關(guān)節(jié)被攔斷或出現(xiàn)遮擋時(shí)),以至必須為數(shù)值附帶一個(gè)大大的聳肩表情符號(hào)來當(dāng)做擋箭牌。如果忽視這些置信度得分,我們便會(huì)喪失與自身數(shù)據(jù)相關(guān)的重要數(shù)據(jù),并可能對(duì)實(shí)際置信度較低的數(shù)據(jù)賦予過多權(quán)重和重要性。這會(huì)產(chǎn)生干擾,最終導(dǎo)致匹配結(jié)果十分怪異,看似雜亂無章。
因此,倘若余弦距離法較為實(shí)用且能產(chǎn)生良好結(jié)果,我們覺得納入對(duì)置信度得分(PoseNet 正確預(yù)計(jì)關(guān)節(jié)所在位置的概率)的考量將能進(jìn)一步提升結(jié)果的準(zhǔn)確度。具體而言,我們希望能對(duì)關(guān)節(jié)數(shù)據(jù)進(jìn)行加權(quán),以確保低置信度關(guān)節(jié)對(duì)距離指標(biāo)的影響低于高置信度關(guān)節(jié)。Google 研究員George Papandreou和Tyler Zhu合力研究出了一個(gè)能夠準(zhǔn)確進(jìn)行此類加權(quán)計(jì)算的公式:
在以上公式中,F(xiàn) 和 G 表示經(jīng) L2 歸一化處理后可供比較的兩個(gè)姿勢(shì)向量(已在前文中有過說明)。Fck 表示 F 的 kth 關(guān)鍵點(diǎn)的置信度得分。Fxy 和 Gxy 表示每個(gè)向量的 kth 關(guān)鍵點(diǎn)的 x 和 y 坐標(biāo)。不理解整個(gè)公式也無妨,重點(diǎn)在于您要理解我們需使用關(guān)鍵點(diǎn)置信度得分來改善匹配結(jié)果。以下 Javascript 要點(diǎn)可能會(huì)更清晰地說明這一點(diǎn):
這一策略可為我們提供更準(zhǔn)確的結(jié)果。即使人體被遮擋或位于框架之外,我們也能借助該策略更準(zhǔn)確地找到與用戶所做動(dòng)作相似的姿勢(shì)圖像。
Move Mirror 嘗試根據(jù) PoseNet 預(yù)測(cè)的姿勢(shì)來尋找匹配圖像。匹配準(zhǔn)確度取決于 PoseNet 的準(zhǔn)確度和數(shù)據(jù)集的多樣性。
大規(guī)模搜索姿勢(shì)數(shù)據(jù):約在 15 毫秒內(nèi)搜索 80000 張圖像
最后,我們必須設(shè)法弄清如何進(jìn)行大規(guī)模搜索和匹配。首先,我們可以輕松進(jìn)行暴力匹配:在對(duì)輸入姿勢(shì)與包含 10 種姿勢(shì)的數(shù)據(jù)庫(kù)中的每個(gè)條目進(jìn)行比較時(shí),毫不費(fèi)力。但顯而易見,10 張圖像遠(yuǎn)遠(yuǎn)不夠:為涵蓋各類人體動(dòng)作,我們至少需要數(shù)萬張圖像。您也許已經(jīng)預(yù)料到,對(duì)包含 80000 張圖像的數(shù)據(jù)庫(kù)中的每個(gè)條目運(yùn)行距離函數(shù),將無法生成實(shí)時(shí)結(jié)果!因此,我們的下一個(gè)難題就是設(shè)法弄清如何快速推導(dǎo)可以跳過的條目以及真正相關(guān)的條目。我們能夠確信跳過的條目越多,返回匹配結(jié)果的速度就會(huì)越快。
我們從Zach Lieberman和Land Lines 實(shí)驗(yàn)中得到啟發(fā),并采用了一種名為 “制高點(diǎn)樹” 的數(shù)據(jù)結(jié)構(gòu)(前往此處查看 Javascript 庫(kù))來遍歷姿勢(shì)數(shù)據(jù)。制高點(diǎn)樹以遞歸方式將數(shù)據(jù)劃分為兩類:一類為比閾值更臨近某個(gè)制高點(diǎn)的數(shù)據(jù),另一類為比閾值相距更遠(yuǎn)的數(shù)據(jù)。這一遞歸分類創(chuàng)造了一個(gè)可供遍歷的樹形數(shù)據(jù)結(jié)構(gòu)。(如果您熟知制高點(diǎn)樹,便會(huì)發(fā)現(xiàn)它與K-D 樹有些類似。您可以在此處了解制高點(diǎn)樹的更多相關(guān)信息。)
下面我們來深入探討一下 vp 樹。不能完全理解下文描述也無妨,重點(diǎn)是要理解大致原理。我們的數(shù)據(jù)空間中包含一組數(shù)據(jù)點(diǎn),從中選擇一個(gè)數(shù)據(jù)點(diǎn)(可隨機(jī)選擇?。┳鳛槲覀兊闹聘唿c(diǎn)(上圖中選擇的是數(shù)據(jù)點(diǎn) 5)。以該數(shù)據(jù)點(diǎn)為圓心畫一個(gè)圓,這樣便可看到部分?jǐn)?shù)據(jù)位于圓內(nèi),部分位于圓外。然后,我們?cè)龠x擇兩個(gè)新的制高點(diǎn):一個(gè)位于圓內(nèi),另一個(gè)位于圓外(此處分別選擇了數(shù)據(jù)點(diǎn) 1 和 7)。我們將這兩個(gè)數(shù)據(jù)點(diǎn)作為子數(shù)據(jù)點(diǎn)添加到第一個(gè)制高點(diǎn)中。之后,我們對(duì)這兩個(gè)數(shù)據(jù)點(diǎn)執(zhí)行如下相同操作:分別以兩個(gè)數(shù)據(jù)點(diǎn)為圓心畫圓,在兩圓內(nèi)外各選一個(gè)數(shù)據(jù)點(diǎn),然后將這些制高點(diǎn)用作它們的子數(shù)據(jù)點(diǎn),以此類推。關(guān)鍵在于,如果您起初選擇數(shù)據(jù)點(diǎn) 5,之后發(fā)現(xiàn)數(shù)據(jù)點(diǎn) 7 要比 1 更接近您想要的位置,此時(shí)不僅可以舍棄數(shù)據(jù)點(diǎn) 1,還能舍棄其子數(shù)據(jù)點(diǎn)。
使用此樹形結(jié)構(gòu),我們就不必再去逐一比較每個(gè)條目:如果輸入的姿勢(shì)與制高點(diǎn)樹中某個(gè)節(jié)點(diǎn)的相似度不夠,我們便可設(shè)想該節(jié)點(diǎn)的所有子節(jié)點(diǎn)均不會(huì)達(dá)到足夠的相似度。如此,我們便無需暴力搜索數(shù)據(jù)庫(kù)中的所有條目,而只需通過遍歷制高點(diǎn)樹來進(jìn)行搜索,這樣我們就能夠安全、安心地舍棄數(shù)據(jù)庫(kù)中不相關(guān)的巨大數(shù)據(jù)列。
制高點(diǎn)樹有助我們大幅提升搜索結(jié)果的速度,同時(shí)還可打造我們向往的實(shí)時(shí)體驗(yàn)。盡管制高點(diǎn)樹應(yīng)用起來困難重重,但其使用體驗(yàn)之奇妙一如我們所望。
如果您想親自嘗試這些方法,可參考我們?cè)谑褂?Javascript 庫(kù)vptree.js構(gòu)建 vp 樹時(shí)所用的 Javascript 代碼要點(diǎn)。在本例中,我們使用了自有的距離匹配函數(shù),不過,我們也建議您去探索并嘗試其他可能的方法,只需在構(gòu)建時(shí)替換傳輸?shù)?vp 樹的距離函數(shù)即可。
在Move Mirror中,我們最終只使用了最鄰近的圖像來匹配用戶姿勢(shì)。但如果是調(diào)試,我們實(shí)際可以遍歷制高點(diǎn)樹,并找到最鄰近的 10 張或 20 張圖像。事實(shí)上,我們構(gòu)建了一個(gè)調(diào)試工具來以這種方式探索數(shù)據(jù),而且該工具還能協(xié)助我們十分高效地探索數(shù)據(jù)集的漏洞。
使用我們的調(diào)試工具后,生成的圖像會(huì)按照相似度由高至低的順序進(jìn)行分類(依上述算法確定)
開發(fā)環(huán)境搭建
當(dāng)看到自己的動(dòng)作在游泳者、廚師、舞者和嬰兒身上再現(xiàn)時(shí),我們會(huì)覺得樂趣十足。此外,這項(xiàng)技術(shù)還能為我們帶來更多其他樂趣。想像一下,無論是搜索各類舞蹈動(dòng)作、經(jīng)典電影片段還是音樂短片,一切都可在您的私人客廳(甚至是您的私人瀏覽器)中完成。換個(gè)角度考慮,您還可利用姿勢(shì)預(yù)測(cè)協(xié)助指導(dǎo)居家瑜伽鍛煉或物理治療。Move Mirror 只是一項(xiàng)小小實(shí)驗(yàn),我們希望它能引領(lǐng)瀏覽器內(nèi)的姿勢(shì)預(yù)測(cè)實(shí)驗(yàn)遍地開花,讓大眾暢享無窮樂趣。
快來訪問Move Mirror網(wǎng)站,體驗(yàn)姿勢(shì)預(yù)測(cè)的新樂趣。若您有意體驗(yàn)面向TensorFlow.js的 PoseNet,歡迎瀏覽我們的代碼庫(kù)和隨附博文。您還可前往Experiments with Google網(wǎng)站探索更多實(shí)驗(yàn)。期待看到您的實(shí)驗(yàn)成果,記得加上 #tensorflowjs 和 #posenet 分享您的精彩項(xiàng)目哦!
-
圖像數(shù)據(jù)
+關(guān)注
關(guān)注
0文章
52瀏覽量
11280 -
計(jì)算機(jī)視覺
+關(guān)注
關(guān)注
8文章
1698瀏覽量
45993 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132646
原文標(biāo)題:Move Mirror:使用 TensorFlow.js 在瀏覽器中預(yù)測(cè)姿勢(shì)之 AI 實(shí)驗(yàn)
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論