Google剛剛發布了一個有趣的AI應用,Move Mirror。Move Mirror使用攝像頭捕捉你的動作,并實時地在8萬張圖像中匹配和你的動作相近的圖像。
在發布Move Mirror的同時,Google Creative Lab的Jane Friedhoff和Irene Alvarado發表長文,分享了打造Move Mirror的經驗。
PoseNet
幾個月前,Google Creative Lab有了制作Move Mirror的想法。顯然,這個應用的核心是位姿估計(pose estimation)模型。
Google自家就在CVPR 2017上提交了PoseNet的論文。PoseNet可以檢測多人的2D位姿,并在COCO數據集的關鍵任務上達到了當前最優表現。
表現出色,又是自家出品,所以Move Mirror團隊順理成章地選擇了PoseNet作為應用背后的模型。在原型開發階段,團隊通過簡單的web API訪問PoseNet模型,這極大地簡化了原型開發流程。只需向內部的PoseNet API接口發送一個HTTP POST請求,提交base64編碼的圖像,API就會傳回位姿數據(基本無延遲)。若干行JavaScript代碼,一份API密鑰,搞定!
不過,考慮到不是所有人樂意把自己的圖像發送到一個中央服務器,順便也為了減少對后端服務器的依賴,團隊決定把PoseNet移植到TensorFlow.js上。TensorFlow.js讓用戶可以在他們自己的瀏覽器中運行機器學習模型——無需服務器。
在Google Brain的TensorFlow.js團隊成員Nikhil Thorat、Daniel Smilkov,以及Google研究員George Papandreou、Tyler Zhu、Dan Oved(Papandreou和Zhu是PoseNet的作者)的幫助下,移植工作順利完成了。
PoseNet單人位姿檢測過程
我們將根據上面的示意圖簡單介紹PoseNet的位姿檢測算法。我們看到,圖中標明了網絡架構是MobileNet。實際上,在PoseNet的論文中,研究人員同時訓練了ResNet和MobileNet網絡。盡管基于ResNet的模型精確度更高,但對實時應用來說,較大的尺寸和較多的網絡層會是頁面加載時間和推理時間不夠理想。因此,TensorFlow.js上的PoseNet使用了MobileNet模型。
網絡輸出關鍵點熱圖和偏移向量。關鍵點熱圖用于估計關鍵點的位置,而偏移向量則用來在熱圖的基礎上進一步預測關鍵點的精確位置。
限于篇幅,我們這里不介紹多人位姿估計算法的細節。和單人位姿估計算法相比,多人位姿估計算法的主要差別在于使用了貪婪方法分組關鍵點,具體而言,使用了Google在2018年發表的PersonLab論文中的高速貪婪解碼算法。
構建數據集
巧婦難為無米之炊。雖然PoseNet已經解決了位姿估計問題,但為了根據用戶的位姿查找匹配的圖像,首先要有圖像。圖像要符合以下兩個要求:
多樣性為了更好地匹配用戶做出的各種各樣的動作,圖像的位姿需要盡可能多樣化。
全身像從用戶體驗的一致性出發,決定只使用全身像。
最終,團隊選擇了包含多種動作,不同體型、膚色、文化的一組視頻,將其切分為8萬張靜止圖像。使用PoseNet處理這些圖像,并儲存相應的位姿數據。
你可能注意到,不是所有的圖像都能正確解析位姿,所以丟棄了一些圖像
位姿匹配
PoseNet的位姿數據包括17個關鍵點的坐標,以及相應的置信度。
為了匹配關鍵點的相似度,很自然的一個想法是將17個關鍵點轉換為向量,那么位姿匹配問題就轉換為了高維空間中的向量相似性問題。這一問題有現成的余弦距離方案可用。
將JSON格式的關鍵點數據轉換為向量
余弦相似度
如果你不熟悉余弦相似度,這里我們簡單溫習下這一概念。余弦相似度測量兩個向量的相似程度:基本上,它測量兩個向量之間的夾角,如果兩個向量方向正好相反,則返回-1,如果兩個向量方向一致,則返回1。重要的是,它只測量向量的方向,而不考慮長度。
圖片來源:Christian Perone
盡管我們談論的是向量和角度,余弦相似度并不限于直線和圖。例如,余弦相似度可以得到兩個字符串的相似度數值。(如果你曾經使用過Word2Vec,你可能已經間接地使用過余弦相似度。)事實上,余弦相似度是一個極其有效的將高維向量的關系約減至單個數字的方法。
溫習了余弦相似度的概念之后,讓我們回到之前的話題。理論上,直接將關鍵點數據轉為向量后,就可以比較其余弦相似度了。實際上,還需要處理一些細節,這是因為數據集中的圖像尺寸大小不同,不同的人也可能出現在圖像的不同局部。
具體而言,進行了如下兩項額外處理,以便保持比較的一致性:
縮放根據每個人的包圍盒裁剪圖片,然后縮放至固定大小。
標準化L2正則化向量(使分量的平方和等于1)。
L2正則化向量
可視化以上兩個處理步驟:
最終,根據下式計算向量間的距離:
加權匹配
上面的匹配算法好像缺了點什么?還記得我們之前提到的嗎?
PoseNet的位姿數據包括17個關鍵點的坐標,以及相應的置信度。
左肘在畫面中清晰可見,置信度較高;右肩在畫面中不可見,置信度較低
上面的匹配算法根本沒有考慮置信度呀。顯然,置信度是很重要的信息。為了得到更準確的結果,我們應該給置信度高的關鍵點較高的權重,給置信度低的關鍵點較低的權重。換句話說,增強置信度高的關鍵點對相似度的影響,削弱置信度低的關鍵點對相似度的影響。
Google研究員George Papandreou和Tyler Zhu給出了將置信度納入考量后的距離公式:
上式中,Ck為第k個關鍵點的置信度,xyk為第k個關鍵點的x、y坐標(經過縮放、標準化等處理)。
加權匹配提供更精確的結果。即使身體的部分被遮擋或位于畫面之外,仍然能夠匹配。
優化匹配速度
還記得嗎?總共有8萬張圖像!如果采用暴力搜索法,每次匹配需要計算8萬次距離。這對于實時應用來說不可接受。
為了優化匹配速度,需要將8萬個位姿數據以某種有序的數據結構存儲,這樣,匹配的時候就可以跳過那些明顯距離很遠的位姿數據,從而大大加速匹配進程。
Move Mirror選用的數據結構是制高點樹(vantage-point tree,簡稱VP樹)。
制高點樹
簡單溫習下制高點樹這一數據結構。
圖片來源:Data Structures for Spatial Data Mining
我們在數據點中選取一點(可以隨機選取)作為根節點(上圖中為5)。我們繞著5畫一個圈,將空間分割成圈內和圈外兩部分。接著我們在圈內、圈外各選一點作為制高點(上圖中為7和1)。接著,繞著每個制高點各畫一個圈,同樣在圈內、圈外各選一點……以此類推。這里的關鍵在于,如果我們從點5開始,然后發現7比1更接近目標,那么我們就可以跳過1的所有子節點。
關于制高點樹的更多細節,可以參閱fribbels.github.io/vptree/writeup 使用了制高點樹(javascript庫vptree.js)之后,匹配得以在大約15ms內完成,對實時應用而言,這一數字很理想。
Move Mirror僅僅返回最匹配用戶位姿的圖像。不過,通過遍歷制高點樹,不難返回更多結果,比如最接近的10張或20張圖像。這可以用來制作調試工具,發現數據集的問題。
Move Mirror調試工具
結語
Move Mirror團隊期待能看到更多類似的有趣應用,比如匹配舞蹈動作,匹配經典電影片段。或者反向操作,基于位姿估計幫助人們在家中練習瑜伽或者進行理療。
如果你想親自嘗試Move Mirror效果:g.co/movemirror
如果你也想基于TensorFlow.js上的PoseNet制作應用:tensorflow/tfjs-models/posenet
-
Google
+關注
關注
5文章
1769瀏覽量
57656 -
機器學習
+關注
關注
66文章
8428瀏覽量
132840 -
數據集
+關注
關注
4文章
1208瀏覽量
24749
原文標題:魔鏡煉成記:Google位姿估計應用Move Mirror架構與實現
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論