摘要:文和,創意實驗室創意技術專家在機器學習和計算機視覺領域,姿勢預測或根據圖像數據探測人體及其姿勢的能力,堪稱最令人興奮而又最棘手的一個話題。使用,用戶可以直接在瀏覽器中運行機器學習模型,無需服務器。
文 / ?Jane Friedhoff 和 Irene Alvarado,Google 創意實驗室創意技術專家
在機器學習和計算機視覺領域,姿勢預測或根據圖像數據探測人體及其姿勢的能力,堪稱最令人興奮而又最棘手的一個話題。近期,Google 公布了 PoseNet,這是一個先進的姿勢預測模型,可從圖像數據中提取非常精準的姿勢數據(即便在圖像模糊不清、分辨率低或僅為黑白色的情況下仍能做到)。本文將詳細介紹這項實驗,正是在該實驗的推動下,我們率先創建了這一適用于網頁的姿勢預測內容庫。
幾個月前,我們開展了一項名為 Move Mirror 的趣味原型實驗:您只需四下走動,即可在瀏覽器中檢索相應圖像。該實驗創造了一種動畫般的獨有體驗,它會追蹤您的動作并據此呈現各種人體動作圖像,其中包括體育運動、舞蹈、武術以及表演等多種動作。我們希望在網頁上推出這項體驗,讓其他人也有機會親身感受,了解機器學習相關知識,然后與好友分享。但遺憾的是,我們面臨著一個問題:眼下沒有可公開獲取的網頁專用姿勢預測模型。
一般而言,用戶在處理姿勢數據時需要訪問特殊硬件或需要具備 C++/Python 計算機視覺庫的相關使用經驗。由此,我們發現了一個有助推動姿勢預測更加大眾化的難得機會,具體方法是將內部模型移植到 TensorFlow.js 中,這是一個 Javascript 庫,支持用戶在瀏覽器中運行機器學習項目。我們組建了一支團隊,耗費數月來開發這一內容庫,并最終推出了 PoseNet 這一開放源代碼工具,該工具允許任何網頁開發者完全在瀏覽器內輕松處理人體互動,且無需配備專門的攝像頭或具備 C++/Python 技能。
隨著 PoseNet 的問世,我們最終得以發布 Move Mirror? 項目,該項目可謂實驗和趣味游戲提升工程設計工作價值的明證。正是由于研究團隊、產品團隊 和 創意團隊的真誠合作,我們才得以成功構建 PoseNet 和 Move Mirror。
Move Mirror 是一項 AI 實驗,能夠檢測您的姿勢,并將檢測到的動作與全球成千上萬張圖像進行匹配
繼續閱讀,以深入了解我們的實驗思路、我們在瀏覽器中預測姿勢時經歷的興奮點,以及令我們甚為激動的后續創意。
什么是姿勢預測?什么是 PoseNet?
您或許已猜到,姿勢預測是一個極為復雜的問題:人的體型大小各異;需追蹤的關節數量眾多(這些關節在空間中的連接方式多種多樣);周圍通常還會有其他人及/或物體遮擋視線。有些人使用輪椅或拐杖等輔助裝置,這可能會阻擋攝像頭對人體的取像;有些人或許肢體不全,還有些人的身體比例可能與常人迥然不同。我們希望,我們的機器學習模型能夠理解并推理各類不同體型的數據。
此圖顯示 PoseNet 針對不同輔助裝置(如手杖、輪椅和假肢)的使用者給出的關節檢測結果
過去,在解決姿勢預測問題時,技術專家曾使用專門的攝像頭和傳感器(如 3D 眼鏡、動作捕捉套裝和紅外攝像頭),以及可從 2D 圖像中提取預測姿勢的計算機視覺技術(如 OpenPose)。這些解決方案盡管有效,但往往需要采用昂貴而又遠未普及的技術,并且/或者要熟知計算機視覺庫以及 C++ 或 Python。這加大了普通開發者迅速開展趣味姿勢實驗的難度。
首次使用 PoseNet 時,發現它可通過簡單的 web API 獲取,這讓我們無比激動。突然間,我們就可以在 Javascript 中輕松迅速地開展姿勢預測原型實驗了。我們只需向內部終端地址發送 HTTP POST 請求以及圖像的 base64 數據,API 終端地址便會為我們返回姿勢數據,而且幾乎沒有任何延遲時間。這大大降低了開展小型探索性姿勢實驗的準入門檻:只需寥寥幾行 JavaScript 代碼和一個 API 密鑰,即可大功告成!當然,并非人人都能夠在后端運行自己的 PoseNet,而且(按常理)并非人人都愿意將自己的照片發送到中央服務器。我們如何才能讓人們有可能運行自己的姿勢實驗,而不必依賴自己或他人的服務器呢?
我們意識到,這是將 TensorFlow.js 與 PoseNet 相連接的絕佳機會。使用 TensorFlow.js,用戶可以直接在瀏覽器中運行機器學習模型,無需服務器。將 PoseNet 移植到 TensorFlow.js 后,只要用戶擁有一部質量尚可且配備網絡攝像頭的桌面設備或電話,便可直接在網絡瀏覽器內親身體驗并嘗試使用這項技術,而無需擔心低級計算機視覺庫, 亦 無需設置復雜的后端和 API。通過與 TensorFlow.js 團隊的 Nikhil Thorat 和 Daniel Smilkov、Google 研究員 George Papandreou 和 Tyler Zhu,以及 Dan Oved 展開密切協作,我們已能將某個 PoseNet 模型版本移植到 TensorFlow.js 中。(您可以在此處了解該流程的詳細信息。)
關于在 TensorFlow.js 中使用 PoseNet,還有一些方面也讓我們感到非常興奮:
無處不在/隨地獲取:大多數開發者均能訪問文本編輯器和網絡瀏覽器,而且 PoseNet 使用起來非常簡便,只需在您的 HTML 文件中添加兩個腳本標記即可,無需進行復雜的服務器設置。此外,您無需配備專門的高分辨率攝像頭、紅外攝像頭或傳感器來獲取數據。我們發現,其實 PoseNet 在處理低分辨率、黑白以及老舊照片時依然表現良好。
可供分享:TensorFlow.js PoseNet 實驗可全部在瀏覽器中運行,因此您不費吹灰之力,即可在瀏覽器中分享該實驗。無需構建特定的操作系統版本,只需上傳網頁即可。
隱私性:由于姿勢預測的全部工作均可在瀏覽器中完成,因此您的所有圖像數據均會留存在本地計算機中。您無需將照片發送至某個云端服務器以利用集中式服務開展姿勢分析(例如,當您使用自己無法控制的視覺 API 時,或此 API 可能發生故障,或存在任何不可控因素時),只需使用自身設備即可完成所有的姿勢預測工作,并能較精確控制圖像的移動位置。借助 Move Mirror,我們可以將 PoseNet 輸出的 (x,y) 關節數據與后端的姿勢圖庫進行匹配,但您的圖像仍會完全留存在您自己的計算機中。
技術討論到此結束:下面我們來談談設計!
設計與靈感
我們曾耗費數周時間,四處摸索不同的姿勢預測原型。對于我們當中有過 C++ 或 Kinect 黑客行為的人來說,僅僅是使用網絡攝像頭在瀏覽器中看到我們的骨骼 反射回自身,就足以稱得上是令人驚嘆的演示。我們在對移動軌跡、木偶以及其他各類易于操控的物件進行過試驗之后,才開始真正著眼于后來的 Move Mirror 概念。
若聽到 Google 創意實驗室的許多研究員都有意進行搜索和探究,這也許不足為奇。在談及姿勢預測的用途時,我們都覺得通過姿勢搜索歸檔數據的想法十分有趣。如果您在擺出姿勢后,得到一個您在做舞蹈動作的結果,會怎么樣?或者更有趣的是,您在擺出姿勢后得到一個相同的動作結果,但該結果卻與您所處情境完全不同,又會怎么樣?從武術、烹飪、滑雪到嬰兒的第一次學步,我們如何從紛繁多樣的人體活動中找到這種古怪、偶然的聯系呢?這會如何讓我們大吃一驚、愉悅享受,并開懷大笑呢?
出自 Awwwards 的 Land Lines Gif;出自 Cooper Hewitt 的 Gesture Match 圖像
我們的靈感源自于 Land Lines(該實驗會使用手勢數據探索 Google 地球中的相似線條)和 Cooper Hewitt 的 Gesture Match(這是一個現場安置項目,可通過姿勢匹配從歸檔數據中查找相應條目)等項目。不過,從美學上來看,我們傾向于采用更迅速且更實時的方式。我們熱衷這一想法,即調用連續不斷的圖像來響應您的動作,并通過您的動作將各行各業的人們聯系在一起。從 The Johnny Cash 項目中所用的轉描和縮時攝影技術得到啟發,再加上 YouTube 上自拍縮時攝影趨勢的推動,我們決定鉚足干勁,著力在瀏覽器中實現實時響應式姿勢匹配(盡管這本身就是一個十分復雜的問題)。
The Johnny Cash 項目生成的 Gif,在此項目中已有超過 250000 人為 “Ain’t No Grave” 這首歌描畫框架,制作眾包的音樂視頻
構建 Move Mirror
盡管 PoseNet 會為我們作出姿勢預測,但我們仍有許多任務要完成。這項實驗的核心體驗全部在于尋找與用戶姿勢相匹配的圖像,如此,當您直立且右臂上揚時,Move Mirror 便能找到某人站立且抬起右臂的圖像。為此,我們需要做好三項準備:圖像數據集、搜索該數據集的技術和姿勢匹配算法。下面我們來逐一細談。
構建數據集:搜索多樣圖片
要創建有用的數據集,我們必須搜索共同涵蓋海量人體動作的圖像。如果數據集中未包含其他姿勢,而只有 400 張舉起右臂直立的人體圖像,這將毫無意義。為確保提供始終如一的體驗,我們還決定只尋找全身圖像。最終,我們出品了系列視頻,在我們看來,這些視頻不僅代表著各類動作,而且還涵蓋各種體型、膚色、文化特質和身體能力。我們將這些視頻分為大約 80000 個靜止幀,然后使用 PoseNet 處理了每張圖像,并存儲了相關的姿勢數據。接下來,我們來探討最棘手的部分:姿勢匹配與搜索。
我們通過 PoseNet 解析了數千張圖像。您會發現,并非所有圖像都解析正確,因此我們舍棄了一些,最終得到的數據集約包含 80000 張圖像
姿勢匹配:定義相似性時遇到的挑戰
要讓 Move Mirror 正常運作,我們首先要明確該如何定義“匹配”?!捌ヅ洹敝傅氖钱斢脩魯[出一個姿勢時,我們根據接收到的姿勢數據返回的圖像。在談及由 PoseNet 生成的“姿勢數據”時,我們指的是一組包含 17 個身體或面部部位的數據,例如我們稱為“關鍵點”的肘部或左眼部位。PoseNet 會返回輸入圖像中每個關鍵點的 x 和 y 坐標,以及相應的置信度得分(稍后會詳細介紹)。
PoseNet 會檢測面部和身體的 17 個姿勢關鍵點。每個關鍵點均包括三個重要的數據塊:(x,y) 坐標(代表輸入圖像中 PoseNet 找到該關鍵點的像素位置)和置信度得分(PoseNet 認為其猜測正確的信心度)
定義 “相似度” 是我們遇到的第一個難題。對于用戶的 17 個關鍵點數據組與數據集中圖像的 17 個關鍵點數據組,我們應如何確定二者之間的相似度?我們嘗試了幾種不同方法來確定相似度,最終敲定了兩種有效方式:余弦相似度和結合關鍵點置信度得分得出的加權匹配。
匹配策略 #1:余弦距離
如果我們將每組的 17 個關鍵點數據轉換為一個向量,并將其標繪在高維空間中,那么尋找兩個最相似姿勢的任務便會轉化為在此高維度空間中尋找兩個最接近的向量。這就是余弦距離的用途所在。
余弦相似度是一種測量兩個向量之間相似度的方法:主要測量兩個向量的夾角,在向量指向完全相反時返回 -1,而在指向幾乎完全相同時則返回 1。重要的是,這種方法測量的是方向而非數值。
余弦相似度的直觀描述,出自 Christian Perone
雖然我們現在談論的是向量和角度,但這并不限于圖表上的線條。例如,您可以使用余弦相似度來獲得兩個等長字符串之間的數值相似度。(如果您以前使用過 Word2Vec,可能已間接用到余弦相似度。)這一方法的確非常實用,能夠將兩個高維向量(兩個長句或兩個長數組)之間的關系最終簡化為一個單一數值。
Nish Tahir 典型示例 簡化版。 不懂向量數學也無妨,重點在于我們能夠將兩個抽象的高維數據塊(5 個字詞為 5 維)轉化為一個表示二者相似度的歸一化數值。這里,您也可以嘗試使用 自己的語句
我們輸入的數據是 JSON,但我們可以將這些值輕松壓縮為一維數組,其中每個條目均象征著某一個關鍵點的 X 或 Y 坐標。只要我們的結構保持統一并且可預測,便能以相同的方式對生成的數組展開比較。這就是我們的第一步:將物體數據變為數組。
源自 PoseNet 的 JSON 數據片段,以及包含 X 和 Y 坐標的扁平化數組的數據片段。(您會發現該數組并未考慮到置信度,我們稍后會回到這個話題?。?/p>
這樣,我們就可以使用余弦相似度來求得所輸入的 34 位浮點數組與數據庫中任何給定的 34 位浮點數組之間的相似度測量值。我們偶爾也可輸入兩個長數組,然后獲得更易解析的相似度得分(介于 -1 與 1 之間)。
由于數據集中所有圖像的寬度/高度各不相同,且每個人還會出現在不同的圖像子集(左上、右下或中央子集等)中,因此我們額外執行了兩個步驟,以便能對數據作出一致比較:
調整尺寸與縮放:我們根據每個人的邊界框坐標來將每張圖像(以及相應的關鍵點坐標)裁剪并縮放至同等尺寸。
歸一化:我們將得到的關鍵點坐標視為 L2 歸一化向量數組,將其進一步歸一化。
具體而言,我們使用 L2 歸一化來進行第二步,這表示我們要將向量縮放為單位范數(如果將 L2 歸一化向量中的每個元素進行一致化處理并對其求和,所得結果將為 1)。比較這些圖表,即可了解歸一化對向量的轉換方式:
利用 L2 歸一化縮放的向量
對上述兩個步驟可作如下直觀考慮:
Move Mirror 數據歸一化步驟
使用歸一化處理后的關鍵點坐標(以向量數組形式存儲),我們最終可計算出余弦相似度并執行若干計算(下文將詳細介紹),從而得出一個可解釋為余弦距離的歐幾里得距離。計算公式如下所示:
在以上公式中,Fxy 與 Gxy 表示經 L2 歸一化處理后可供比較的兩個姿勢向量。此外,Fxy 和 Gxy 僅包含 17 個關鍵點的 X 和 Y 坐標,并不包含每個關鍵點的置信度得分。
JavaScript 要點如下所示:
一目了然,對吧?開始匹配吧!
匹配策略 #2:加權匹配
好吧,其實這種方法仍存在很大缺陷。上例中,我們在計算余弦相似度時使用了兩個句子:“Jane likes to code” 和 “Irene likes to code”,這兩句話是靜態的:我們已就二者表示的含義得出了 100% 的置信度。但姿勢預測并非如此索然無味。事實上,我們在努力推斷關節位置時,幾乎從未得出 100% 的置信度。我們也能做到十分接近,但除非變成 X 光機,否則我們很難較精確達到 100% 的置信度。有時,我們也會完全看不到關節,只能根據獲知的其他人體信息作出較佳猜測。
Posenet 會返回每個關鍵點的置信度得分。該模型預測關鍵點的置信度得分越高,結果就會越準確
由此,每個返回的關節數據塊也會有置信度得分。有時,我們非常自信能夠確定關節的位置(例如當我們可以清楚看到關節時);但有些時候,我們的置信度會很低(例如當關節被攔斷或出現遮擋時),以至必須為數值附帶一個大大的聳肩表情符號來當做擋箭牌。如果忽視這些置信度得分,我們便會喪失與自身數據相關的重要數據,并可能對實際置信度較低的數據賦予過多權重和重要性。這會產生干擾,最終導致匹配結果十分怪異,看似雜亂無章。
因此,倘若余弦距離法較為實用且能產生良好結果,我們覺得納入對置信度得分(PoseNet 正確預計關節所在位置的概率)的考量將能進一步提升結果的準確度。具體而言,我們希望能對關節數據進行加權,以確保低置信度關節對距離指標的影響低于高置信度關節。Google 研究員 George Papandreou 和 Tyler Zhu 合力研究出了一個能夠準確進行此類加權計算的公式:
在以上公式中,F 和 G 表示經 L2 歸一化處理后可供比較的兩個姿勢向量(已在前文中有過說明)。Fck 表示 F 的 kth 關鍵點的置信度得分。Fxy 和 Gxy 表示每個向量的 kth 關鍵點的 x 和 y 坐標。不理解整個公式也無妨,重點在于您要理解我們需使用關鍵點置信度得分來改善匹配結果。以下 Javascript 要點可能會更清晰地說明這一點:
這一策略可為我們提供更準確的結果。即使人體被遮擋或位于框架之外,我們也能借助該策略更準確地找到與用戶所做動作相似的姿勢圖像。
Move Mirror 嘗試根據 PoseNet 預測的姿勢來尋找匹配圖像。匹配準確度取決于 PoseNet 的準確度和數據集的多樣性。
大規模搜索姿勢數據:約在 15 毫秒內搜索 80000 張圖像
最后,我們必須設法弄清如何進行大規模搜索和匹配。首先,我們可以輕松進行暴力匹配:在對輸入姿勢與包含 10 種姿勢的數據庫中的每個條目進行比較時,毫不費力。但顯而易見,10 張圖像遠遠不夠:為涵蓋各類人體動作,我們至少需要數萬張圖像。您也許已經預料到,對包含 80000 張圖像的數據庫中的每個條目運行距離函數,將無法生成實時結果!因此,我們的下一個難題就是設法弄清如何快速推導可以跳過的條目以及真正相關的條目。我們能夠確信跳過的條目越多,返回匹配結果的速度就會越快。
我們從 Zach Lieberman 和 Land Lines 實驗中得到啟發,并采用了一種名為 “制高點樹” 的數據結構(前往此處查看 Javascript 庫)來遍歷姿勢數據。制高點樹以遞歸方式將數據劃分為兩類:一類為比閾值更臨近某個制高點的數據,另一類為比閾值相距更遠的數據。這一遞歸分類創造了一個可供遍歷的樹形數據結構。(如果您熟知制高點樹,便會發現它與 K-D 樹有些類似。您可以在此處了解制高點樹的更多相關信息。)
下面我們來深入探討一下 vp 樹。不能完全理解下文描述也無妨,重點是要理解大致原理。我們的數據空間中包含一組數據點,從中選擇一個數據點(可隨機選擇?。┳鳛槲覀兊闹聘唿c(上圖中選擇的是數據點 5)。以該數據點為圓心畫一個圓,這樣便可看到部分數據位于圓內,部分位于圓外。然后,我們再選擇兩個新的制高點:一個位于圓內,另一個位于圓外(此處分別選擇了數據點 1 和 7)。我們將這兩個數據點作為子數據點添加到第一個制高點中。之后,我們對這兩個數據點執行如下相同操作:分別以兩個數據點為圓心畫圓,在兩圓內外各選一個數據點,然后將這些制高點用作它們的子數據點,以此類推。關鍵在于,如果您起初選擇數據點 5,之后發現數據點 7 要比 1 更接近您想要的位置,此時不僅可以舍棄數據點 1,還能舍棄其子數據點。
使用此樹形結構,我們就不必再去逐一比較每個條目:如果輸入的姿勢與制高點樹中某個節點的相似度不夠,我們便可設想該節點的所有子節點均不會達到足夠的相似度。如此,我們便無需暴力搜索數據庫中的所有條目,而只需通過遍歷制高點樹來進行搜索,這樣我們就能夠安全、安心地舍棄數據庫中不相關的巨大數據列。
制高點樹有助我們大幅提升搜索結果的速度,同時還可打造我們向往的實時體驗。盡管制高點樹應用起來困難重重,但其使用體驗之奇妙一如我們所望。
如果您想親自嘗試這些方法,可參考我們在使用 Javascript 庫 vptree.js 構建 vp 樹時所用的 Javascript 代碼要點。在本例中,我們使用了自有的距離匹配函數,不過,我們也建議您去探索并嘗試其他可能的方法,只需在構建時替換傳輸到 vp 樹的距離函數即可。
在 Move Mirror中,我們最終只使用了最鄰近的圖像來匹配用戶姿勢。但如果是調試,我們實際可以遍歷制高點樹,并找到最鄰近的 10 張或 20 張圖像。事實上,我們構建了一個調試工具來以這種方式探索數據,而且該工具還能協助我們十分高效地探索數據集的漏洞。
使用我們的調試工具后,生成的圖像會按照相似度由高至低的順序進行分類(依上述算法確定)
開發環境搭建
當看到自己的動作在游泳者、廚師、舞者和嬰兒身上再現時,我們會覺得樂趣十足。此外,這項技術還能為我們帶來更多其他樂趣。想像一下,無論是搜索各類舞蹈動作、經典電影片段還是音樂短片,一切都可在您的私人客廳(甚至是您的私人瀏覽器)中完成。換個角度考慮,您還可利用姿勢預測協助指導居家瑜伽鍛煉或物理治療。Move Mirror 只是一項小小實驗,我們希望它能引領瀏覽器內的姿勢預測實驗遍地開花,讓大眾暢享無窮樂趣。
聲明:文章收集于網絡,如有侵權,請聯系小編及時處理,謝謝!
歡迎加入本站公開興趣群商業智能與數據分析群
興趣范圍包括各種讓數據產生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數據倉庫,數據挖掘工具,報表系統等全方位知識
QQ群:81035754
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/4802.html
摘要:反饋檢測到的每個人的置信度值以及檢測到的每個姿勢關鍵點。姿勢置信度這決定了姿勢判斷的整體置信度。在較高級別,這將控制回饋的姿勢較低置信度分數。只有在調整姿勢置信度得分不夠好的情況下,為了過濾掉不太準確的姿勢,該數值應該增加或減少。 文 / Dan Oved,Google Creative Lab 的自由創意技術專家,紐約大學 ITP 的研究生。編輯和插圖 / 創意技術專家 Irene Alv...
摘要:年后的你長什么樣北京航空航天大學和密歇根州立大學的研究人員設計了一個系統,采用生成對抗網絡,可以根據原始照片生成一個人年齡增長后的樣子,甚至連發際線逐漸后移也能逼真地模擬。 20年后的你長什么樣?北京航空航天大學和密歇根州立大學的研究人員設計了一個AI系統,采用生成對抗網絡(GAN),可以根據原始照片生成一個人年齡增長后的樣子,甚至連發際線逐漸后移也能逼真地模擬。論文發表在CVPR 2018...
摘要:最近,這就是街舞第二季開播,又一次燃起了全民熱舞的風潮。然而,真要自己跳起來,實際與想象之間,估計差了若干個羅志祥。系統映射結果展示對于系統的結果,研究人員表示還不完美。谷歌在和跳舞的結合上也花了心思。好了,先不說了,我要去跟學跳舞了。 最近,《這!就是街舞》第二季開播,又一次燃起了全民熱舞的風潮。 剛開播沒多久,這個全程高能的節目,就在豆瓣上就得到了 9.6 的高分。舞者們在比賽中精...
摘要:感謝像這樣的框架,使得這些數據集可以應用于機器學習領域。藍點被標記為壞球,橙點被標記為好球標注來自大聯盟裁判員使用構建模型將機器學習帶入和領域。使用庫將預測結果呈現為熱圖。好球區域位于本壘板上方至英尺之間。 在這篇文章中,我們將使用TensorFlow.js,D3.js和網絡的力量來可視化訓練模型的過程,以預測棒球數據中的壞球(藍色區域)和好球(橙色區域)。在整個訓練過程中,我們將一步...
閱讀 1356·2021-11-22 15:25
閱讀 3350·2021-10-21 09:38
閱讀 1563·2021-10-19 13:21
閱讀 991·2021-09-06 15:00
閱讀 1673·2019-08-30 15:44
閱讀 2576·2019-08-29 15:40
閱讀 3431·2019-08-29 13:44
閱讀 2023·2019-08-26 16:56