瀏覽器中的姿態檢測:PoseNet 模型
本文為雷鋒字幕組編譯的技術博客,原標題 Pose Detection in the Browser: PoseNet Model,作者為 Siraj Raval 。
翻譯 | 趙朋飛 程煒 整理 | 凡江
概述
這裡附上 Youtube 上這段視頻的源代碼,作者是 Siraj Raval:https://youtu.be/9KqNk5keyCc
這個資源包括一個稱作 PoseNet 的獨立模型,一些 Demo,可在瀏覽器上使用 TensorFlow.js 實時運行人體姿態檢測。
點擊這裡運行 Demo!
https://storage.googleapis.com/tfjs-models/demos/posenet/camera.html
PoseNet 可以用於檢測單個或多個姿勢,意味著有一個版本的演算法可以檢測一幅圖像或視頻中的單個人,而另一個版本的演算法可以檢測視頻或圖像中的多個人。
參考這篇博客(https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5),可以了解 PoseNet 在 Tensorflow.js 運行的更高層級的描述。
為追蹤問題,我們使用 tensorflow/tfjs Github repo。
安裝
你可以將其作為獨立的 ES5 使用,如下:
或者,在 TypeScript/ES6 項目中使用時,可以通過 npm 安裝。
npminstall@tensorflow-models/posenet
使用
我們的多姿勢檢測可以從一副圖像中檢測出每個姿勢。每種方法都有自己的演算法和參數集。
關鍵點
所有的關鍵點都用部位 ID 標記,每個部位和對應的 ID 如下:
載入預先訓練的 PoseNet 模型
在姿勢檢測的第一步,將一幅圖像輸入預先訓練過的模型。PoseNet 有一些不同版本的模型,每一個版本都對應一個擁有特定乘數的 MobileNet v1 架構。 在通過模型提供圖像時,輸出的期望步幅。必須是32、16、8。默認為16。數字越高,速度越快,準確度越低,反之亦然。
constnet =awaitposenet.load(multiplier);
輸入
multiplier - 可選的值是: 1.01, 1.0, 0.75, 或者 0.50。默認選擇 1.01。乘數是所有卷積操作的深度(通道數)。這個值對應於MobileNet 架構和檢查點。值越大,每層的規模越大。犧牲速度的情況下模型精度越高。將這個值設置小,可以提高模型運行速度而犧牲準確性。
默認情況下,PoseNet 載入模型時使用乘數 1.01 。擁有超強 GPU 的計算機建議採用該值。如果計算機擁有中等或低端 GPU,建議乘數採用0.75。移動設備建議使用0.5。
單人姿勢檢測
單人姿勢檢測是兩種演算法中最簡單也是運行最快的。理想的使用場景是圖像中只有一個人的情況。缺點是,如果圖片中有多個人時,來自不同的人的關鍵點有可能會被檢測為一個人的。例如,1# 人的左胳膊和 #2 人的右膝蓋有可能被演算法認為屬於同一個人。
constpose =awaitposeNet.estimateSinglePose(image, imageScaleFactor, flipHorizontal, outputStride);
輸入
image -ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement 輸入網路中的圖像
imageScaleFactor- 數值範圍 0.2 到 1.0,默認 0.50。用於在圖像輸入網路前調整圖像比例。這個值設置得越小將會縮小圖像,增加速度,但是會犧牲準確性。
flipHorizontal -默認為 False。 如果姿勢應該進行水平的翻轉/鏡像 。對於視頻默認水平翻轉的視頻(比如網路攝像頭),如果你希望姿勢回到原來正確的方向,改參數設置為 True。
outputStride -在通過模型提供圖像時,輸出的期望步幅。必須是32、16、8。默認為16。數字越高,速度越快,準確度越低,反之亦然。
返回值
它返回一個帶有置信值的姿勢和一個由部位id索引的關鍵點數組,每一個關鍵點都有一個分值和一個位置信息。
應用範例
通過腳本標記
通過 NPM
產生輸出:
多重姿勢檢測
多重姿態檢測可以解碼圖像中的多個姿勢。比單個姿勢檢測演算法複雜得多,並且運行速度稍慢,但卻在圖像中有多人的情況下很有優勢,檢測到的關鍵點不太可能與錯誤的姿勢相關聯。即使用於檢測單個人的姿勢, 這種演算法也可能更可取。因為當多個人出現在圖像中時,兩個姿勢被連接在一起的意外就不會發生。 它使用快速貪婪解碼演算法,這個演算法來自於 PersonLab 的研究論文:使用 Bottom-Up、Part-Based 和 Geometric Embedding 模型的人體姿勢檢測和實例分割。
constposes =awaitnet.estimateMultiplePoses(image, imageScaleFactor, flipHorizontal, outputStride, maxPoseDetections, scoreThreshold, nmsRadius);
輸入
image -ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement 輸入網路中的圖像
imageScaleFactor -數值範圍 0.2 到 1.0,默認 0.50。用於在圖像輸入網路前調整圖像比例。這個值設置的越小將會縮小圖像比例,增加速度,但是會犧牲準確性。
flipHorizontal -默認為 False。 如果姿勢應該進行水平的翻轉/鏡像 。對於視頻默認水平翻轉的視頻(比如網路攝像頭),如果你希望姿勢回到原來正確的方向,改參數設置為 True。
outputStride -在通過模型提供圖像時,輸出的期望步幅。必須是 32、16、8。默認為 16。數字越高,性能越快,準確度越低,反之亦然。
maxPoseDetections(可選項) - 最大可檢測姿勢數量,默認 5。
scoreThreshold(可選項) - 只返回根部位得分大於或等於這個值的檢測實例。默認為 0.5。
nmsRadius(可選項) - Non-maximum 抑制部位距離。它必須為正。如果兩個部位距離小於 nmsRadius 像素,就會相互抑制。默認為 20。
返回值
它的返回值由姿勢數組構成,每個姿勢包括一個置信值和一組由部位 ID 索引的關鍵點,每一個關鍵點都有一個分值和位置信息。
通過腳本標記
通過 NPM
輸出:
開發 Demo
Demo 的運行細節包含在 demos/文件夾。
關於作者
這段代碼歸 Google 所有。
博客原址:
https://github.com/llSourcell/pose_estimation
新人福利
關注 AI 研習社(okweiwu),回復1領取
【超過 1000G 神經網路 / AI / 大數據資料】
CVPR 2018論文:「隨心所欲」換裝換姿態
※計算機視覺領域的王者與榮耀
※深度學習訓練數據不平衡問題,怎麼解決?
TAG:AI研習社 |