0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從圖像數(shù)據(jù)中提取非常精準(zhǔn)的姿勢數(shù)據(jù)

Tensorflowers ? 來源:未知 ? 作者:李倩 ? 2018-08-23 11:37 ? 次閱讀

機(jī)器學(xué)習(xí)計(jì)算機(jī)視覺領(lǐng)域,姿勢預(yù)測或根據(jù)圖像數(shù)據(jù)探測人體及其姿勢的能力,堪稱最令人興奮而又最棘手的一個(gè)話題。近期,Google 公布了PoseNet,這是一個(gè)先進(jìn)的姿勢預(yù)測模型,可從圖像數(shù)據(jù)中提取非常精準(zhǔn)的姿勢數(shù)據(jù)(即便在圖像模糊不清、分辨率低或僅為黑白色的情況下仍能做到)。本文將詳細(xì)介紹這項(xiàng)實(shí)驗(yàn),正是在該實(shí)驗(yàn)的推動下,我們率先創(chuàng)建了這一適用于網(wǎng)頁的姿勢預(yù)測內(nèi)容庫。

幾個(gè)月前,我們開展了一項(xiàng)名為Move Mirror的趣味原型實(shí)驗(yàn):您只需四下走動,即可在瀏覽器中檢索相應(yīng)圖像。該實(shí)驗(yàn)創(chuàng)造了一種動畫般的獨(dú)有體驗(yàn),它會追蹤您的動作并據(jù)此呈現(xiàn)各種人體動作圖像,其中包括體育運(yùn)動、舞蹈、武術(shù)以及表演等多種動作。我們希望在網(wǎng)頁上推出這項(xiàng)體驗(yàn),讓其他人也有機(jī)會親身感受,了解機(jī)器學(xué)習(xí)相關(guān)知識,然后與好友分享。但遺憾的是,我們面臨著一個(gè)問題:眼下沒有可公開獲取的網(wǎng)頁專用姿勢預(yù)測模型。

一般而言,用戶在處理姿勢數(shù)據(jù)時(shí)需要訪問特殊硬件或需要具備 C++/Python 計(jì)算機(jī)視覺庫的相關(guān)使用經(jīng)驗(yàn)。由此,我們發(fā)現(xiàn)了一個(gè)有助推動姿勢預(yù)測更加大眾化的難得機(jī)會,具體方法是將內(nèi)部模型移植到TensorFlow.js中,這是一個(gè) Javascript 庫,支持用戶在瀏覽器中運(yùn)行機(jī)器學(xué)習(xí)項(xiàng)目。我們組建了一支團(tuán)隊(duì),耗費(fèi)數(shù)月來開發(fā)這一內(nèi)容庫,并最終推出了PoseNet這一開放源代碼工具,該工具允許任何網(wǎng)頁開發(fā)者完全在瀏覽器內(nèi)輕松處理人體互動,且無需配備專門的攝像頭或具備 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ì)的真誠合作,我們才得以成功構(gòu)建 PoseNet 和 Move Mirror。

Move Mirror是一項(xiàng) AI 實(shí)驗(yàn),能夠檢測您的姿勢,并將檢測到的動作與全球成千上萬張圖像進(jìn)行匹配

繼續(xù)閱讀,以深入了解我們的實(shí)驗(yàn)思路、我們在瀏覽器中預(yù)測姿勢時(shí)經(jīng)歷的興奮點(diǎn),以及令我們甚為激動的后續(xù)創(chuàng)意。

什么是姿勢預(yù)測?什么是 PoseNet?

您或許已猜到,姿勢預(yù)測是一個(gè)極為復(fù)雜的問題:人的體型大小各異;需追蹤的關(guān)節(jié)數(shù)量眾多(這些關(guān)節(jié)在空間中的連接方式多種多樣);周圍通常還會有其他人及/或物體遮擋視線。有些人使用輪椅或拐杖等輔助裝置,這可能會阻擋攝像頭對人體的取像;有些人或許肢體不全,還有些人的身體比例可能與常人迥然不同。我們希望,我們的機(jī)器學(xué)習(xí)模型能夠理解并推理各類不同體型的數(shù)據(jù)。

此圖顯示 PoseNet 針對不同輔助裝置(如手杖、輪椅和假肢)的使用者給出的關(guān)節(jié)檢測結(jié)果

過去,在解決姿勢預(yù)測問題時(shí),技術(shù)專家曾使用專門的攝像頭和傳感器(如 3D 眼鏡、動作捕捉套裝和紅外攝像頭),以及可從 2D 圖像中提取預(yù)測姿勢的計(jì)算機(jī)視覺技術(shù)(如OpenPose)。這些解決方案盡管有效,但往往需要采用昂貴而又遠(yuǎn)未普及的技術(shù),并且/或者要熟知計(jì)算機(jī)視覺庫以及 C++ 或 Python。這加大了普通開發(fā)者迅速開展趣味姿勢實(shí)驗(yàn)的難度。

首次使用 PoseNet 時(shí),發(fā)現(xiàn)它可通過簡單的 web API 獲取,這讓我們無比激動。突然間,我們就可以在 Javascript 中輕松迅速地開展姿勢預(yù)測原型實(shí)驗(yàn)了。我們只需向內(nèi)部終端地址發(fā)送 HTTP POST 請求以及圖像的 base64 數(shù)據(jù),API 終端地址便會為我們返回姿勢數(shù)據(jù),而且?guī)缀鯖]有任何延遲時(shí)間。這大大降低了開展小型探索性姿勢實(shí)驗(yàn)的準(zhǔn)入門檻:只需寥寥幾行 JavaScript 代碼和一個(gè) API 密鑰,即可大功告成!當(dāng)然,并非人人都能夠在后端運(yùn)行自己的 PoseNet,而且(按常理)并非人人都愿意將自己的照片發(fā)送到中央服務(wù)器。我們?nèi)绾尾拍茏屓藗冇锌赡苓\(yùn)行自己的姿勢實(shí)驗(yàn),而不必依賴自己或他人的服務(wù)器呢?

我們意識到,這是將 TensorFlow.js 與 PoseNet 相連接的絕佳機(jī)會。使用 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ī)視覺庫,亦無需設(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 使用起來非常簡便,只需在您的 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)頁即可。

隱私性:由于姿勢預(yù)測的全部工作均可在瀏覽器中完成,因此您的所有圖像數(shù)據(jù)均會留存在本地計(jì)算機(jī)中。您無需將照片發(fā)送至某個(gè)云端服務(wù)器以利用集中式服務(wù)開展姿勢分析(例如,當(dāng)您使用自己無法控制的視覺 API 時(shí),或此 API 可能發(fā)生故障,或存在任何不可控因素時(shí)),只需使用自身設(shè)備即可完成所有的姿勢預(yù)測工作,并能精確控制圖像的移動位置。借助 Move Mirror,我們可以將 PoseNet 輸出的 (x,y) 關(guān)節(jié)數(shù)據(jù)與后端的姿勢圖庫進(jìn)行匹配,但您的圖像仍會完全留存在您自己的計(jì)算機(jī)中。

技術(shù)討論到此結(jié)束:下面我們來談?wù)勗O(shè)計(jì)!

設(shè)計(jì)與靈感

我們曾耗費(fèi)數(shù)周時(shí)間,四處摸索不同的姿勢預(yù)測原型。對于我們當(dāng)中有過 C++ 或 Kinect 黑客行為的人來說,僅僅是使用網(wǎng)絡(luò)攝像頭在瀏覽器中看到我們的骨骼反射回自身,就足以稱得上是令人驚嘆的演示。我們在對移動軌跡、木偶以及其他各類易于操控的物件進(jìn)行過試驗(yàn)之后,才開始真正著眼于后來的Move Mirror 概念。

若聽到 Google 創(chuàng)意實(shí)驗(yàn)室的許多研究員都有意進(jìn)行搜索和探究,這也許不足為奇。在談及姿勢預(yù)測的用途時(shí),我們都覺得通過姿勢搜索歸檔數(shù)據(jù)的想法十分有趣。如果您在擺出姿勢后,得到一個(gè)您在做舞蹈動作的結(jié)果,會怎么樣?或者更有趣的是,您在擺出姿勢后得到一個(gè)相同的動作結(jié)果,但該結(jié)果卻與您所處情境完全不同,又會怎么樣?從武術(shù)、烹飪、滑雪到嬰兒的第一次學(xué)步,我們?nèi)绾螐募姺倍鄻拥娜梭w活動中找到這種古怪、偶然的聯(lián)系呢?這會如何讓我們大吃一驚、愉悅享受,并開懷大笑呢?

出自 Awwwards 的Land Lines Gif;出自 Cooper Hewitt 的Gesture Match 圖像

我們的靈感源自于Land Lines(該實(shí)驗(yàn)會使用手勢數(shù)據(jù)探索 Google 地球中的相似線條)和 Cooper Hewitt 的Gesture Match(這是一個(gè)現(xiàn)場安置項(xiàng)目,可通過姿勢匹配從歸檔數(shù)據(jù)中查找相應(yīng)條目)等項(xiàng)目。不過,從美學(xué)上來看,我們傾向于采用更迅速且更實(shí)時(shí)的方式。我們熱衷這一想法,即調(diào)用連續(xù)不斷的圖像來響應(yīng)您的動作,并通過您的動作將各行各業(yè)的人們聯(lián)系在一起。從The Johnny Cash 項(xiàng)目中所用的轉(zhuǎn)描和縮時(shí)攝影技術(shù)得到啟發(fā),再加上 YouTube 上自拍縮時(shí)攝影趨勢的推動,我們決定鉚足干勁,著力在瀏覽器中實(shí)現(xiàn)實(shí)時(shí)響應(yīng)式姿勢匹配(盡管這本身就是一個(gè)十分復(fù)雜的問題)。

The Johnny Cash 項(xiàng)目生成的Gif,在此項(xiàng)目中已有超過 250000 人為 “Ain’t No Grave” 這首歌描畫框架,制作眾包的音樂視頻

構(gòu)建 Move Mirror

盡管 PoseNet 會為我們作出姿勢預(yù)測,但我們?nèi)杂性S多任務(wù)要完成。這項(xiàng)實(shí)驗(yàn)的核心體驗(yàn)全部在于尋找與用戶姿勢相匹配的圖像,如此,當(dāng)您直立且右臂上揚(yáng)時(shí),Move Mirror 便能找到某人站立且抬起右臂的圖像。為此,我們需要做好三項(xiàng)準(zhǔn)備:圖像數(shù)據(jù)集、搜索該數(shù)據(jù)集的技術(shù)和姿勢匹配算法。下面我們來逐一細(xì)談。

構(gòu)建數(shù)據(jù)集:搜索多樣圖片

要?jiǎng)?chuàng)建有用的數(shù)據(jù)集,我們必須搜索共同涵蓋海量人體動作的圖像。如果數(shù)據(jù)集中未包含其他姿勢,而只有 400 張舉起右臂直立的人體圖像,這將毫無意義。為確保提供始終如一的體驗(yàn),我們還決定只尋找全身圖像。最終,我們出品了系列視頻,在我們看來,這些視頻不僅代表著各類動作,而且還涵蓋各種體型、膚色、文化特質(zhì)和身體能力。我們將這些視頻分為大約 80000 個(gè)靜止幀,然后使用 PoseNet 處理了每張圖像,并存儲了相關(guān)的姿勢數(shù)據(jù)。接下來,我們來探討最棘手的部分:姿勢匹配與搜索。

我們通過 PoseNet 解析了數(shù)千張圖像。您會發(fā)現(xiàn),并非所有圖像都解析正確,因此我們舍棄了一些,最終得到的數(shù)據(jù)集約包含 80000 張圖像

姿勢匹配:定義相似性時(shí)遇到的挑戰(zhàn)

要讓 Move Mirror 正常運(yùn)作,我們首先要明確該如何定義“匹配”?!捌ヅ洹敝傅氖钱?dāng)用戶擺出一個(gè)姿勢時(shí),我們根據(jù)接收到的姿勢數(shù)據(jù)返回的圖像。在談及由 PoseNet 生成的“姿勢數(shù)據(jù)”時(shí),我們指的是一組包含 17 個(gè)身體或面部部位的數(shù)據(jù),例如我們稱為“關(guān)鍵點(diǎn)”的肘部或左眼部位。PoseNet 會返回輸入圖像中每個(gè)關(guān)鍵點(diǎn)的 x 和 y 坐標(biāo),以及相應(yīng)的置信度得分(稍后會詳細(xì)介紹)。

PoseNet 會檢測面部和身體的 17 個(gè)姿勢關(guān)鍵點(diǎn)。每個(gè)關(guān)鍵點(diǎn)均包括三個(gè)重要的數(shù)據(jù)塊:(x,y) 坐標(biāo)(代表輸入圖像中 PoseNet 找到該關(guān)鍵點(diǎn)的像素位置)和置信度得分(PoseNet 認(rèn)為其猜測正確的信心度)

定義 “相似度” 是我們遇到的第一個(gè)難題。對于用戶的 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è)最相似姿勢的任務(wù)便會轉(zhuǎn)化為在此高維度空間中尋找兩個(gè)最接近的向量。這就是余弦距離的用途所在。

余弦相似度是一種測量兩個(gè)向量之間相似度的方法:主要測量兩個(gè)向量的夾角,在向量指向完全相反時(shí)返回 -1,而在指向幾乎完全相同時(shí)則返回 1。重要的是,這種方法測量的是方向而非數(shù)值。

余弦相似度的直觀描述,出自Christian Perone

雖然我們現(xiàn)在談?wù)摰氖窍蛄亢徒嵌?,但這并不限于圖表上的線條。例如,您可以使用余弦相似度來獲得兩個(gè)等長字符串之間的數(shù)值相似度。(如果您以前使用過Word2Vec,可能已間接用到余弦相似度。)這一方法的確非常實(shí)用,能夠?qū)蓚€(gè)高維向量(兩個(gè)長句或兩個(gè)長數(shù)組)之間的關(guān)系最終簡化為一個(gè)單一數(shù)值。

Nish Tahir 典型示例簡化版。不懂向量數(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ù)測,便能以相同的方式對生成的數(shù)組展開比較。這就是我們的第一步:將物體數(shù)據(jù)變?yōu)閿?shù)組。

源自 PoseNet 的 JSON 數(shù)據(jù)片段,以及包含 X 和 Y 坐標(biāo)的扁平化數(shù)組的數(shù)據(jù)片段。(您會發(fā)現(xiàn)該數(shù)組并未考慮到置信度,我們稍后會回到這個(gè)話題!)

這樣,我們就可以使用余弦相似度來求得所輸入的 34 位浮點(diǎn)數(shù)組與數(shù)據(jù)庫中任何給定的 34 位浮點(diǎn)數(shù)組之間的相似度測量值。我們偶爾也可輸入兩個(gè)長數(shù)組,然后獲得更易解析的相似度得分(介于 -1 與 1 之間)。

由于數(shù)據(jù)集中所有圖像的寬度/高度各不相同,且每個(gè)人還會出現(xiàn)在不同的圖像子集(左上、右下或中央子集等)中,因此我們額外執(zhí)行了兩個(gè)步驟,以便能對數(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)行一致化處理并對其求和,所得結(jié)果將為 1)。比較這些圖表,即可了解歸一化對向量的轉(zhuǎn)換方式:

利用 L2 歸一化縮放的向量

對上述兩個(gè)步驟可作如下直觀考慮:

Move Mirror 數(shù)據(jù)歸一化步驟

使用歸一化處理后的關(guān)鍵點(diǎn)坐標(biāo)(以向量數(shù)組形式存儲),我們最終可計(jì)算出余弦相似度并執(zhí)行若干計(jì)算(下文將詳細(xì)介紹),從而得出一個(gè)可解釋為余弦距離的歐幾里得距離。計(jì)算公式如下所示:

在以上公式中,F(xiàn)xy 與 Gxy 表示經(jīng) L2 歸一化處理后可供比較的兩個(gè)姿勢向量。此外,F(xiàn)xy 和 Gxy 僅包含 17 個(gè)關(guān)鍵點(diǎn)的 X 和 Y 坐標(biāo),并不包含每個(gè)關(guān)鍵點(diǎn)的置信度得分。

JavaScript 要點(diǎn)如下所示:

一目了然,對吧?開始匹配吧!

匹配策略 #2:加權(quán)匹配

好吧,其實(shí)這種方法仍存在很大缺陷。上例中,我們在計(jì)算余弦相似度時(shí)使用了兩個(gè)句子:“Jane likes to code” 和 “Irene likes to code”,這兩句話是靜態(tài)的:我們已就二者表示的含義得出了 100% 的置信度。但姿勢預(yù)測并非如此索然無味。事實(shí)上,我們在努力推斷關(guān)節(jié)位置時(shí),幾乎從未得出 100% 的置信度。我們也能做到十分接近,但除非變成 X 光機(jī),否則我們很難精確達(dá)到 100% 的置信度。有時(shí),我們也會完全看不到關(guān)節(jié),只能根據(jù)獲知的其他人體信息作出最佳猜測。

Posenet 會返回每個(gè)關(guān)鍵點(diǎn)的置信度得分。該模型預(yù)測關(guān)鍵點(diǎn)的置信度得分越高,結(jié)果就會越準(zhǔn)確

由此,每個(gè)返回的關(guān)節(jié)數(shù)據(jù)塊也會有置信度得分。有時(shí),我們非常自信能夠確定關(guān)節(jié)的位置(例如當(dāng)我們可以清楚看到關(guān)節(jié)時(shí));但有些時(shí)候,我們的置信度會很低(例如當(dāng)關(guān)節(jié)被攔斷或出現(xiàn)遮擋時(shí)),以至必須為數(shù)值附帶一個(gè)大大的聳肩表情符號來當(dāng)做擋箭牌。如果忽視這些置信度得分,我們便會喪失與自身數(shù)據(jù)相關(guān)的重要數(shù)據(jù),并可能對實(shí)際置信度較低的數(shù)據(jù)賦予過多權(quán)重和重要性。這會產(chǎn)生干擾,最終導(dǎo)致匹配結(jié)果十分怪異,看似雜亂無章。

因此,倘若余弦距離法較為實(shí)用且能產(chǎn)生良好結(jié)果,我們覺得納入對置信度得分(PoseNet 正確預(yù)計(jì)關(guān)節(jié)所在位置的概率)的考量將能進(jìn)一步提升結(jié)果的準(zhǔn)確度。具體而言,我們希望能對關(guān)節(jié)數(shù)據(jù)進(jìn)行加權(quán),以確保低置信度關(guān)節(jié)對距離指標(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è)姿勢向量(已在前文中有過說明)。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)可能會更清晰地說明這一點(diǎn):

這一策略可為我們提供更準(zhǔn)確的結(jié)果。即使人體被遮擋或位于框架之外,我們也能借助該策略更準(zhǔn)確地找到與用戶所做動作相似的姿勢圖像。

Move Mirror 嘗試根據(jù) PoseNet 預(yù)測的姿勢來尋找匹配圖像。匹配準(zhǔn)確度取決于 PoseNet 的準(zhǔn)確度和數(shù)據(jù)集的多樣性。

大規(guī)模搜索姿勢數(shù)據(jù):約在 15 毫秒內(nèi)搜索 80000 張圖像

最后,我們必須設(shè)法弄清如何進(jìn)行大規(guī)模搜索和匹配。首先,我們可以輕松進(jìn)行暴力匹配:在對輸入姿勢與包含 10 種姿勢的數(shù)據(jù)庫中的每個(gè)條目進(jìn)行比較時(shí),毫不費(fèi)力。但顯而易見,10 張圖像遠(yuǎn)遠(yuǎn)不夠:為涵蓋各類人體動作,我們至少需要數(shù)萬張圖像。您也許已經(jīng)預(yù)料到,對包含 80000 張圖像的數(shù)據(jù)庫中的每個(gè)條目運(yùn)行距離函數(shù),將無法生成實(shí)時(shí)結(jié)果!因此,我們的下一個(gè)難題就是設(shè)法弄清如何快速推導(dǎo)可以跳過的條目以及真正相關(guān)的條目。我們能夠確信跳過的條目越多,返回匹配結(jié)果的速度就會越快。

我們從Zach Lieberman和Land Lines 實(shí)驗(yàn)中得到啟發(fā),并采用了一種名為 “制高點(diǎn)樹” 的數(shù)據(jù)結(jié)構(gòu)(前往此處查看 Javascript 庫)來遍歷姿勢數(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)樹,便會發(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),部分位于圓外。然后,我們再選擇兩個(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)中。之后,我們對這兩個(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è)條目:如果輸入的姿勢與制高點(diǎn)樹中某個(gè)節(jié)點(diǎn)的相似度不夠,我們便可設(shè)想該節(jié)點(diǎn)的所有子節(jié)點(diǎn)均不會達(dá)到足夠的相似度。如此,我們便無需暴力搜索數(shù)據(jù)庫中的所有條目,而只需通過遍歷制高點(diǎn)樹來進(jìn)行搜索,這樣我們就能夠安全、安心地舍棄數(shù)據(jù)庫中不相關(guān)的巨大數(shù)據(jù)列。

制高點(diǎn)樹有助我們大幅提升搜索結(jié)果的速度,同時(shí)還可打造我們向往的實(shí)時(shí)體驗(yàn)。盡管制高點(diǎn)樹應(yīng)用起來困難重重,但其使用體驗(yàn)之奇妙一如我們所望。

如果您想親自嘗試這些方法,可參考我們在使用 Javascript 庫vptree.js構(gòu)建 vp 樹時(shí)所用的 Javascript 代碼要點(diǎn)。在本例中,我們使用了自有的距離匹配函數(shù),不過,我們也建議您去探索并嘗試其他可能的方法,只需在構(gòu)建時(shí)替換傳輸?shù)?vp 樹的距離函數(shù)即可。

在Move Mirror中,我們最終只使用了最鄰近的圖像來匹配用戶姿勢。但如果是調(diào)試,我們實(shí)際可以遍歷制高點(diǎn)樹,并找到最鄰近的 10 張或 20 張圖像。事實(shí)上,我們構(gòu)建了一個(gè)調(diào)試工具來以這種方式探索數(shù)據(jù),而且該工具還能協(xié)助我們十分高效地探索數(shù)據(jù)集的漏洞。

使用我們的調(diào)試工具后,生成的圖像會按照相似度由高至低的順序進(jìn)行分類(依上述算法確定)

開發(fā)環(huán)境搭建

當(dāng)看到自己的動作在游泳者、廚師、舞者和嬰兒身上再現(xiàn)時(shí),我們會覺得樂趣十足。此外,這項(xiàng)技術(shù)還能為我們帶來更多其他樂趣。想像一下,無論是搜索各類舞蹈動作、經(jīng)典電影片段還是音樂短片,一切都可在您的私人客廳(甚至是您的私人瀏覽器)中完成。換個(gè)角度考慮,您還可利用姿勢預(yù)測協(xié)助指導(dǎo)居家瑜伽鍛煉或物理治療。Move Mirror 只是一項(xiàng)小小實(shí)驗(yàn),我們希望它能引領(lǐng)瀏覽器內(nèi)的姿勢預(yù)測實(shí)驗(yàn)遍地開花,讓大眾暢享無窮樂趣。

快來訪問Move Mirror網(wǎng)站,體驗(yàn)姿勢預(yù)測的新樂趣。若您有意體驗(yàn)面向TensorFlow.js的 PoseNet,歡迎瀏覽我們的代碼庫和隨附博文。您還可前往Experiments with Google網(wǎng)站探索更多實(shí)驗(yàn)。期待看到您的實(shí)驗(yàn)成果,記得加上 #tensorflowjs 和 #posenet 分享您的精彩項(xiàng)目哦!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:Move Mirror:使用 TensorFlow.js 在瀏覽器中預(yù)測姿勢之 AI 實(shí)驗(yàn)

文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    關(guān)于RGB圖像中提取alpha通道

    小弟現(xiàn)在正在試著做一個(gè)修圖片的程序,使圖片的灰度圖右移(修正曝光不足),想法是提取圖像的alpha通道,逐像素的加灰度?,F(xiàn)在用到color image to array函數(shù),我似乎發(fā)現(xiàn)只有U64輸出
    發(fā)表于 04-25 20:07

    如果采集的數(shù)據(jù)中提取一個(gè)完整的脈沖數(shù)據(jù)?

    本帖最后由 eehome 于 2013-1-5 09:43 編輯 由于我不是學(xué)信號出生的,現(xiàn)在有一個(gè)難題請大家?guī)兔?,謝謝了!從一個(gè)100M的采集卡中采集到的數(shù)據(jù)存放到TDMS文件中,如何從這些數(shù)據(jù)中提取區(qū)分出一個(gè)個(gè)完整的脈
    發(fā)表于 12-23 11:24

    怎么EXA中提取IQ數(shù)據(jù)進(jìn)行后期處理

    我正試圖EXA中提取IQ數(shù)據(jù)進(jìn)行后期處理。我設(shè)法捕獲了I / Q樣本并將它們轉(zhuǎn)儲到一個(gè)文件中(附帶示例),但有兩個(gè)問題:1 - IQ Analyzer文檔中似乎沒有描述文件格式(http
    發(fā)表于 03-05 16:41

    怎么繪圖或變換中提取特定數(shù)據(jù)點(diǎn)

    嗨,大家好,我想在劇情或轉(zhuǎn)換中有一套iccap數(shù)據(jù)。我想自動提取數(shù)據(jù)的特定點(diǎn)并分別存儲值。是否有任何內(nèi)部函數(shù)直接提取數(shù)據(jù)?或者我需要為此編寫
    發(fā)表于 08-14 08:44

    怎么DHT11溫度傳感器中提取數(shù)據(jù)

    嘿,伙計(jì)們,我試圖DHT11溫度傳感器中提取數(shù)據(jù)。你能告訴我是否存在一個(gè)示例項(xiàng)目或一個(gè)圖書館?試著自己寫還沒有成功…
    發(fā)表于 09-12 06:16

    如何特征值中提取兩個(gè)字節(jié)?

    請求時(shí),很容易WReqq=(CyLay-GATSSAWReqEyReqqPARAMYT**)事件PARAMARM中提取值,其值如下:LILUNIT8值=WReq-& Gt;但這不
    發(fā)表于 10-15 13:24

    LabVIEW和VDM提取色彩和生成灰度圖像

    (可選) 第二個(gè)VI演示了如何將圖像顏色(RGB)轉(zhuǎn)換為灰度圖像。這個(gè)簡單的程序通過兩種方法將彩色圖像轉(zhuǎn)換為灰度:1)將RGB圖像轉(zhuǎn)換為H
    發(fā)表于 05-26 20:39

    如何通過M480系列的PDMAA步態(tài)模式RGB顏色陣列中提取

    應(yīng)用程序: 以 PDMA 向下模式 RGB 顏色陣列中提取紅色、 綠色 和 藍(lán)色 數(shù)據(jù) 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件
    發(fā)表于 08-22 08:23

    JAVA教程之壓縮包中提取文件

    JAVA教程之壓縮包中提取文件,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?3次下載

    利用數(shù)據(jù)場和歐氏距離的圖像邊緣提取

    圖像邊緣是圖像分析和識別的基礎(chǔ),圖像邊緣信息的準(zhǔn)確性和完整性對后續(xù)圖像分析和識別有重要影響。為實(shí)現(xiàn)圖像邊緣有效
    發(fā)表于 11-24 15:03 ?1次下載

    如何HTML或XML文件中提取數(shù)據(jù)的Python爬蟲庫Beautiful Soup概述

    Beautiful Soup是一個(gè)可以HTML或XML文件中提取數(shù)據(jù)的Python庫,簡單來說,它能將HTML的標(biāo)簽文件解析成樹形結(jié)構(gòu),然后方便地獲取到指定標(biāo)簽的對應(yīng)屬性。
    的頭像 發(fā)表于 07-29 09:56 ?2.6w次閱讀

    圖像數(shù)據(jù)還原(matlab)

    鑒于論文中大多只給圖像不給數(shù)據(jù),自己編了個(gè)圖像中提取數(shù)據(jù),可以正常使用。
    發(fā)表于 09-05 09:24 ?0次下載

    如何使用OpenCV和Python圖像中提取感興趣區(qū)域

    今天我們將一起探究如何使用OpenCV和Python圖像中提取感興趣區(qū)域(ROI)。 在之間的文章中,我們完成了圖像邊緣提取,例
    的頭像 發(fā)表于 02-07 14:42 ?1715次閱讀

    OST中提取郵箱數(shù)據(jù)和重置丟失的WindowsServer 密碼的工具

    ? ?還原Exchange數(shù)據(jù)庫 MVP 和 IT 管理員強(qiáng)烈推薦的 5 合 1 專用工具套件,用于修復(fù)損壞的 EDB 、備份中提取郵箱以及將 Exchange 數(shù)據(jù)庫 (EDB)
    的頭像 發(fā)表于 06-24 11:58 ?1107次閱讀
    OST<b class='flag-5'>中提取</b>郵箱<b class='flag-5'>數(shù)據(jù)</b>和重置丟失的WindowsServer 密碼的工具

    如何MySQL中提取數(shù)據(jù)并增加換手率指標(biāo)進(jìn)行回測

    事實(shí)上,backtrader雖然沒有直接提供接口給我們做這樣的優(yōu)化,但是我們可以通過繼承DataBase基類重寫DataFeed實(shí)現(xiàn)目的。下面就給大家演示一下如何MySQL中提取數(shù)據(jù)并增加換手率
    的頭像 發(fā)表于 11-02 10:38 ?719次閱讀
    如何<b class='flag-5'>從</b>MySQL<b class='flag-5'>中提取</b><b class='flag-5'>數(shù)據(jù)</b>并增加換手率指標(biāo)進(jìn)行回測