翻譯文章,內容有刪減。原文地址: https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5
與谷歌創意實驗室合做,我很高興地宣佈發佈TensorFlow.js版本的PoseNet,這是一種機器學習模型,容許在瀏覽器中進行實時人體姿式估計。您能夠訪問https://storage.googleapis.com/tfjs-models/demos/posenet/camera.html嘗試一下在線演示。javascript
PoseNet可使用單姿態或多姿態算法檢測圖像和視頻中的人物形象 - 所有來自瀏覽器。html
那麼,問題來了,什麼是姿態估計?姿態估計是指在圖像和視頻中檢測人物的計算機視覺技術,以便人們能夠肯定某我的的肘部在圖像中出現的位置。須要澄清的是,這項技術並不能識別誰在圖像中 - 沒有任何與識別身份相關的我的身份信息。該算法僅僅估計關鍵身體關節的位置。java
好吧,爲何這是使人興奮的開始?姿態估計有不少用途,從對身體作出反應的交互式安裝到加強現實、動畫、健身用途等等。咱們但願此模型的輔助能力可以激勵更多的開發人員和製造商嘗試將姿態檢測應用到他們本身的項目中。雖然許多可選的姿態檢測系統已經開源,但都須要專門的硬件和/或相機,以及至關多的系統設置。PoseNet運行在TensorFlow.js上,任何擁有攝像頭的PC或手機的人均可以在網絡瀏覽器中體驗這種技術。並且因爲咱們已經開源了這個模型,JavaScript開發人員能夠用幾行代碼來使用這個技術。更重要的是,這實際上能夠幫助保護用戶隱私。因爲TensorFlow.js上的PoseNet在瀏覽器中運行,所以任何姿態數據都不會留在用戶的計算機上。es6
PoseNet可用於估計單個姿式或多個姿式,這意味着該算法的一個版本只能檢測圖像/視頻中的一我的,而另外一個版本能夠檢測圖像/視頻中的多我的。爲何會有兩個版本?單人姿式檢測器更快,更簡單,但圖像中只能有一個主體(稍後會深刻探討)。咱們先探討更容易使用的單個姿式。算法
在上層看來,姿式估計發生在兩個階段:npm
等等,這些關鍵詞的含義是什麼? 讓咱們回顧一下最重要的:api
PoseNet返回檢測到的每一個人的置信度值以及檢測到的每一個姿式關鍵點。圖片來源:「Microsoft Coco:上下文數據集中的通用對象」,https://cocodataset.org。數組
PosNet檢測的17個姿式關鍵點。瀏覽器
將模型的複雜性抽象化並將功能封裝爲易於使用的方法,這放面已經作了不少工做。讓咱們回顧一下如何配置PoseNet項目的基礎知識。網絡
該庫能夠經過npm安裝:
npm install @tensorflow-models/posnet
使用es6模塊導入:
import * as posenet from '@tensorflow-models/posenet'; const net = await posenet.load();
或經過頁面的bundle:
<html> <body> <!-- Load TensorFlow.js --> <script src="https://unpkg.com/@tensorflow/tfjs"></script> <!-- Load Posenet --> <script src="https://unpkg.com/@tensorflow-models/posenet"> </script> <script type="text/javascript"> posenet.load().then(function(net) { // posenet model loaded }); </script> </body> </html>
應用於圖像的單人姿式估計算法示例。圖片來源:「Microsoft Coco:上下文數據集中的通用對象」,https://cocodataset.org。
如前面所說的,單姿態估計算法更簡單、速度更快。它的理想場景是隻有一我的在輸入圖像或視頻的中間。缺點是,若是圖像中有多我的,那麼來自兩我的的關鍵點可能會被估計爲是同一個單一姿式的一部分 - 例如,#1的左臂和#2的右膝由該算法肯定爲屬於相同姿式而可能被合併。若是輸入圖像可能包含多人,則應該使用多姿態估計算法。
咱們來看看單姿態估計算法的輸入:
如今讓咱們看一下單姿態估計算法的輸出:
一下這個簡短的代碼塊展現瞭如何使用單姿態估計算法:
const imageScaleFactor = 0.50; const flipHorizontal = false; const outputStride = 16; const imageElement = document.getElementById('cat'); // load the posenet model const net = await posenet.load(); const pose = await net.estimateSinglePose(imageElement, scaleFactor, flipHorizontal, outputStride);
一個輸出姿式的例子以下所示:
{ "score": 0.32371445304906, "keypoints": [ { // nose "position": { "x": 301.42237830162, "y": 177.69162777066 }, "score": 0.99799561500549 }, { // left eye "position": { "x": 326.05302262306, "y": 122.9596464932 }, "score": 0.99766051769257 }, { // right eye "position": { "x": 258.72196650505, "y": 127.51624706388 }, "score": 0.99926537275314 }, ... ] }
一個應用於圖像的多人姿態估計算法的示例。 圖片來源:「Microsoft Coco:上下文數據集中的通用對象」,https://cocodataset.org
多人姿式估計算法能夠估計圖像中的許多姿式/人物。它比單姿態算法更復雜而且速度稍慢,但它的優勢是,若是圖片中出現多我的,他們檢測到的關鍵點不太可能與錯誤的姿式相關聯。出於這個緣由,即便應用場景是檢測單人姿式,該算法也可能更合乎須要。
此外,該算法的一個吸引人的特性是性能不受輸入圖像中人數的影響。不管是15人仍是5人,計算時間都是同樣的。
讓咱們看看輸入:
查看這些參數有什麼效果的最好方法是嘗試使用這個多姿態估計的示例:https://storage.googleapis.com/tfjs-models/demos/posenet/camera.html。
讓咱們看一下輸出:
下面這段簡單的代碼塊展示瞭如何使用多姿態估計算法:
const imageScaleFactor = 0.50; const flipHorizontal = false; const outputStride = 16; // get up to 5 poses const maxPoseDetections = 5; // minimum confidence of the root part of a pose const scoreThreshold = 0.5; // minimum distance in pixels between the root parts of poses const nmsRadius = 20; const imageElement = document.getElementById('cat'); // load posenet const net = await posenet.load(); const poses = await net.estimateMultiplePoses( imageElement, imageScaleFactor, flipHorizontal, outputStride, maxPoseDetections, scoreThreshold, nmsRadius);
姿式數組輸出的樣例以下所示:
// array of poses/persons [ { // pose #1 "score": 0.42985695206067, "keypoints": [ { // nose "position": { "x": 126.09371757507, "y": 97.861720561981 }, "score": 0.99710708856583 }, ... ] }, { // pose #2 "score": 0.13461434583673, "keypositions": [ { // nose "position": { "x": 116.58444058895, "y": 99.772533416748 }, "score": 0.9978438615799 }, ... ] }, ... ]
讀到這兒,您就得到了足夠的知識理解PoseNet示例。若是您想了解更多關於該模型和實施的技術細節,請閱讀原文:https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5,裏面附錄了更多的技術細節。