通過與 Google 創(chuàng)意實(shí)驗(yàn)室的合作,我很高興地宣布 TensorFlow.js 版本的 PoseNet1,2 發(fā)布了,這是一個(gè)允許在瀏覽器中進(jìn)行實(shí)時(shí)人體姿勢判斷的機(jī)器學(xué)習(xí)模型。
PoseNet 可以使用單一姿勢或多種姿勢算法檢測到圖像和視頻中的人物 - 所有這些均來自瀏覽器
那么究竟什么是姿勢判斷呢? 姿勢判斷是指在圖像和視頻中檢測人物形象的計(jì)算機(jī)視覺技術(shù),比如可以確定某個(gè)人的肘部出現(xiàn)在圖像中的位置。 需要澄清的是,這項(xiàng)技術(shù)無法識別圖像中的人物到底是誰 –因?yàn)闆]有任何與識別身份相關(guān)的個(gè)人身份信息。 該運(yùn)算法則僅僅是判斷人體主要關(guān)節(jié)的位置。
好吧,知道為什么這是一個(gè)令人興奮的開始? 姿勢判斷有許多用途,從對身體做出反應(yīng)的交互式裝置到增強(qiáng)現(xiàn)實(shí),動(dòng)畫,健身用途等等。 我們希望此模型的可訪問性能夠激發(fā)更多開發(fā)人員和制造商嘗試將姿態(tài)檢測應(yīng)用到他們自己的項(xiàng)目中去。 雖然許多可選的姿勢檢測系統(tǒng)都已開源,但都需要配備專門的硬件和/或攝像頭,以及繁復(fù)的系統(tǒng)設(shè)置。
PensNet 在 TensorFlow.js 上運(yùn)行后,只要配備適合網(wǎng)絡(luò)攝像頭的 PC 或手機(jī),任何人可以在網(wǎng)絡(luò)瀏覽器中體驗(yàn)這項(xiàng)技術(shù)。 由于我們已經(jīng)開源了該模型,因此 Javascript 開發(fā)人員只要通過幾行代碼就能修補(bǔ)和使用這項(xiàng)技術(shù)。更重要的是,這實(shí)際上還能有助保護(hù)用戶隱私。由于 TensorFlow.js 上的 PoseNet 是在瀏覽器中運(yùn)行,因此任何姿勢數(shù)據(jù)都不會留在用戶的計(jì)算機(jī)上。
在深入研究該如何使用這個(gè)模型之前,對于那些將該項(xiàng)目付諸實(shí)現(xiàn)的人們,讓我們大聲歡呼向他們致敬:發(fā)布在 Wild and PersonLab 上有關(guān)于準(zhǔn)確的多人姿勢判斷的文章《自下而上,基于部分的幾何嵌入模型進(jìn)行人物姿勢判斷及實(shí)例分割》背后的谷歌研發(fā)人員 George Papandreou 和 Tyler Zhu, 以及 TensorFlow.js 庫背后的 Google Brain 團(tuán)隊(duì)的工程師 Nikhil Thorat 和 Daniel Smilkov。
PoseNet 入門
PoseNet 可用于判斷單一姿勢或多個(gè)姿勢, 這就意味著會有一個(gè)檢測圖像/視頻中單人算法版本以及另一個(gè)可以檢測圖像/視頻中多個(gè)人的版本。 為什么有兩個(gè)版本? 單人姿勢檢測器更快更簡單,但是需要圖像中只有一個(gè)主體(稍后會深入探討)。 我們首先來講一講簡單易用的單一姿勢版本。
姿勢判斷在上層會分成兩個(gè)階段進(jìn)行:
1. 輸入 RGB 圖像通過卷積神經(jīng)網(wǎng)絡(luò)饋送。
2. 單一姿勢或多姿勢解碼算法用于從模型輸出解碼姿勢,姿勢置信度得分,關(guān)鍵點(diǎn)位置和關(guān)鍵點(diǎn)置信度得分。
稍等一下,這些關(guān)鍵字的含義是什么? 讓我們回顧一下最重要的內(nèi)容:
姿勢 - 在最高級別,PoseNet 將每個(gè)檢測到的人的關(guān)鍵點(diǎn)列表和實(shí)例級置信度分?jǐn)?shù)反饋給一個(gè)姿勢對象。
PoseNet 反饋檢測到的每個(gè)人的置信度值以及檢測到的每個(gè)姿勢關(guān)鍵點(diǎn)。 Image Credit:“Microsoft Coco:Context Dataset 中的公共對象”,https://cocodataset.org。
姿勢置信度 –這決定了姿勢判斷的整體置信度。 范圍介于 0.0 到 1.0 之間。 它可以用來隱藏那些幅度不夠大的姿勢。
關(guān)鍵點(diǎn) –它是判斷人體姿勢的一部分,例如鼻子,右耳,左膝,右腳等。它包含了位置和關(guān)鍵點(diǎn)置信度分?jǐn)?shù)。 PoseNet 目前可檢測到下圖所示的 17 個(gè)關(guān)鍵點(diǎn):
PoseNet 檢測到的 17 個(gè)姿勢關(guān)鍵點(diǎn)
關(guān)鍵點(diǎn)置信度得分 - 這決定了估計(jì)關(guān)鍵點(diǎn)位置準(zhǔn)確的置信度。 范圍在 0.0 到 1.0 之間。 它可用于隱藏那些不夠強(qiáng)大的關(guān)鍵點(diǎn)。
關(guān)鍵點(diǎn)位置 –檢測到的關(guān)鍵單在原始輸入圖像中的 x 和 y 二維坐標(biāo)。
第1步:導(dǎo)入 TensorFlow.js 和 PoseNet 庫
將模型的復(fù)雜性抽象化并將功能封裝為易于使用的方法,這方面已經(jīng)做了很多的工作。 讓我們回顧一下如何設(shè)置 PoseNet 項(xiàng)目的基礎(chǔ)知識。
該庫可以使用 npm 安裝:
npm install @tensorflow-models/posenet
并使用 es6 模塊導(dǎo)入:
import * as posenet from '@tensorflow-models/posenet';const net = await posenet.load();
或通過頁面中的 bundle:
第 2a 步:單人姿態(tài)判斷
應(yīng)用于圖像的單人姿勢判斷算法示例
Image Credit:“Microsoft Coco:Context Dataset 中的通用對象”,https://cocodataset.org
如前所述,兩個(gè)版本中,單一姿勢判斷算法更簡單,更快速。 它的理想場景是只有一個(gè)人居于輸入圖像或視頻中間。 缺點(diǎn)是,如果圖像中有多個(gè)人,那么來自兩個(gè)人的關(guān)鍵點(diǎn)可能被判斷為同一個(gè)單一姿勢的一部分 –意思就是,例如,第 1 個(gè)人的左臂和第 2 個(gè)人的右膝通過算法被判斷屬于相同的姿勢而被混淆。 如果輸入圖像中包含多人,則應(yīng)該使用多姿勢判斷的算法。
讓我們回顧一下單一姿勢判斷算法的輸入:
輸入圖像元素 - 包含用于預(yù)測姿勢的圖像的 html 元素,例如視頻或圖像標(biāo)簽。 重要的一點(diǎn)是,輸入的圖像或視頻元素必須是方形的。
圖像比例系數(shù) –是介于 0.2 和 1 之間的數(shù)字。默認(rèn)為 0.50。 在輸入到網(wǎng)絡(luò)之前的縮放圖像比例。 將此數(shù)值設(shè)置得較低可以縮小圖像,以犧牲精度為代價(jià)從而提高速度。
水平翻轉(zhuǎn) - 默認(rèn)為 false。 姿勢應(yīng)該是水平翻轉(zhuǎn)/鏡像。 對于視頻默認(rèn)水平翻轉(zhuǎn)的視頻(即網(wǎng)絡(luò)攝像頭),如果您希望姿勢得以正確的方向回饋,應(yīng)將此設(shè)置為 true。
輸出步幅 - 必須為 32,16 或 8。默認(rèn)值為 16。在內(nèi)部,此參數(shù)會影響神經(jīng)網(wǎng)絡(luò)中圖層的高度和寬度。 在上層來看,它會影響姿勢判斷的精度和速度。 輸出值越低,精度越高但速度越慢;輸出值越高,速度越快但精度越低。 查看輸出步幅對輸出質(zhì)量影響的最佳方法是嘗試使用這個(gè)單一姿勢判斷的實(shí)例。
現(xiàn)在讓我們回顧一下單一姿勢判斷算法的輸出:
包含姿勢置信度得分和 17 個(gè)關(guān)鍵點(diǎn)數(shù)組的姿勢。
每個(gè)關(guān)鍵點(diǎn)包含關(guān)鍵點(diǎn)位置和關(guān)鍵點(diǎn)置信度得分。 同樣,所有關(guān)鍵點(diǎn)位置在輸入圖像空間中都有 x 和 y 坐標(biāo),并且可以直接映射到圖像上。
這個(gè)簡短的代碼塊展示了如何使用單一姿勢判斷算法:
const imageScaleFactor = 0.50;const flipHorizontal = false;const outputStride = 16;
const imageElement = document.getElementById('cat');
// load the posenet modelconst 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 }, ... ]}
第 2b 步: 多人姿勢判斷
應(yīng)用于圖像的示例多人姿勢判斷算法
Image Credit: “Microsoft Coco: Common Objects in Context Dataset”,?https://cocodataset.org
多人姿勢判斷算法可以判斷圖像中許多的姿勢/人。 它比單一姿勢算法更為復(fù)雜,且速度稍慢,不過它的優(yōu)點(diǎn)是,如果圖片中出現(xiàn)多個(gè)人,他們檢測到的關(guān)鍵點(diǎn)不太可能與錯(cuò)誤的姿勢相關(guān)聯(lián)。 因此,即使用例是檢測單個(gè)人的姿勢,這個(gè)算法可能更合乎需要。
此外,該運(yùn)算法則一個(gè)引人入勝的特性是其性能不會因輸入圖像中的人數(shù)多少而受到影響。 不管是檢測 15 個(gè)人或 5 個(gè)人,計(jì)算的時(shí)間是相同的。
我們來看一下輸入:
輸入圖像元素 - 與單一姿勢判斷相同
圖像比例系數(shù) - 與單一姿勢判斷相同
水平翻轉(zhuǎn) - 與單一姿勢判斷相同
輸出步幅 - 與單一姿勢判斷相同
幅度最大的姿勢檢測 - 整數(shù)。 默認(rèn)為 5. 要檢測的幅度最大的姿勢數(shù)值。
姿勢置信度得分閾值 - 0.0 到 1.0。 默認(rèn)為 0.5。 在較高級別,這將控制回饋的姿勢最低置信度分?jǐn)?shù)。
非最大抑制(NMS)半徑 –這是一個(gè)以像素為單位的數(shù)字。在上層,它會控制返回姿勢之間的最小距離。其默認(rèn)值為 20,這在大多數(shù)情況下均表現(xiàn)良好。只有在調(diào)整姿勢置信度得分不夠好的情況下,為了過濾掉不太準(zhǔn)確的姿勢,該數(shù)值應(yīng)該增加或減少。
查看這些參數(shù)影響的最佳方法是嘗試一下多姿勢判斷的演示。
讓我們再看一下輸出:
一個(gè)通過一系列姿勢來解決的承諾。
每個(gè)姿勢包含與單人判斷算法中相同描述的信息。
這個(gè)短代碼塊展示了如何使用多姿勢判斷算法:
const imageScaleFactor = 0.50;const flipHorizontal = false;const outputStride = 16;// get up to 5 posesconst maxPoseDetections = 5;// minimum confidence of the root part of a poseconst scoreThreshold = 0.5;// minimum distance in pixels between the root parts of posesconst 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);
姿勢的示例輸出數(shù)組如下所示:
// 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 }, ... ] }, ... ]
如果您已經(jīng)閱讀過這篇文章,那么您就已經(jīng)了解了 PoseNet 演示的全部內(nèi)容。 這也許是一個(gè)很好的停止點(diǎn)。 如果您想深入了解有關(guān)模型和實(shí)施的技術(shù)細(xì)節(jié)的更多信息,我們邀請您繼續(xù)閱讀下文。
致孜孜不倦的鉆研者:技術(shù)深潛
在本節(jié)中,我們將詳細(xì)介紹單一姿勢判斷算法。在上層,該過程如下所示:
使用 PoseNet 的單人姿勢探測器通道
需要注意的一個(gè)重要細(xì)節(jié)是,研究人員同時(shí)訓(xùn)練了 PoseNet 上的一個(gè) ResNet 模型和一個(gè) MobileNet 模型。 雖然 ResNet 模型具有更高的準(zhǔn)確性,但對于實(shí)時(shí)應(yīng)用程序來說,其大尺寸和多層面使頁面加載時(shí)間和推理時(shí)間變得不太理想。我們使用 MobileNet 模型,因?yàn)樗菍橐苿?dòng)設(shè)備上運(yùn)行而設(shè)計(jì)的。
注:ResNet 模型鏈接
https://arxiv.org/abs/1512.03385
MobileNet 模型鏈接
https://arxiv.org/abs/1704.04861
再看一下單一姿勢判斷算法
處理模型輸入:輸出步幅的解釋
首先,我們將討論如何通過輸出步幅來獲得 PoseNet 模型輸出(主要是熱圖和偏移矢量)。
PoseNet 模型可以方便地保持圖像大小恒定,意思是不管圖像是否縮小,它能夠以與原始圖像相同的比例預(yù)測姿勢位置。 這就意味著通過設(shè)置我們在運(yùn)行上面提到的輸出步幅時(shí),在犧牲了性能的情況下,可以將 PoseNet 配置成更高的精度。
輸出步幅決定了我們相對于輸入圖像大小縮小輸出的程度。 它會影響圖層的大小和模型輸出。 輸出步幅越高,網(wǎng)絡(luò)中的層的分辨率和輸出越小,相應(yīng)地它們的精度也越高。 在此應(yīng)用中,輸出步幅可以取值 8,16 或 32。換句話說,在輸出步幅為 32 的情況下,能夠取得最快的表現(xiàn)但是精度卻是最低,而 8 則相反,精度最高但表現(xiàn)最慢。 我們建議從 16 開始。
輸出步幅決定了我們相對于輸入圖像大小縮小輸出的程度。 輸出步幅更高,表現(xiàn)更快,但精度更低
在后臺中,當(dāng)輸出步幅設(shè)置為 8 或 16 時(shí),減少層中步幅的輸入量就能創(chuàng)建更大的輸出分辨率。 然后使用帶孔卷積核使后續(xù)層中的卷積濾波器具有更寬的視場(當(dāng)輸出步幅為 32 時(shí)不適用帶孔卷積核)。 雖然 Tensorflow 支持帶孔卷積核,但 TensorFlow.js 卻不支持,為此我們添加了一個(gè) PR 來包含它。
模型輸出: 熱圖和偏移矢量
當(dāng) PoseNet 處理圖像時(shí),實(shí)際上反饋的是熱圖以及偏移矢量,可以對其進(jìn)行解碼,用以在圖像中找到與姿勢關(guān)鍵點(diǎn)對應(yīng)的高置信度區(qū)域。 我們可以快速討論其中每一個(gè)意味著什么,但眼下我們在高級別情況下捕獲的如下圖演示了每個(gè)姿勢關(guān)鍵點(diǎn)如何與一個(gè)熱圖張量和偏移矢量張量相關(guān)聯(lián)。
PoseNet 反饋的 17 個(gè)姿勢關(guān)鍵點(diǎn)中的每一個(gè)都與一個(gè)熱圖張量和一個(gè)偏移矢量張量相關(guān)聯(lián),用于確定關(guān)鍵點(diǎn)的確切位置
這兩個(gè)輸出都是具有高度和寬度的 3D 張量,我們將其稱為分辨率。 分辨率根據(jù)以下公式由輸入圖像大小和輸出步幅決定:
Resolution = ((InputImageSize - 1) / OutputStride) + 1
// Example: an input image with a width of 225 pixels and an output// stride of 16 results in an output resolution of 15// 15 = ((225 - 1) / 16) + 1
熱圖
每個(gè)熱圖是尺寸為分辨率 x 分辨率 x 17 的 3D 張量,因?yàn)?17 是 PoseNet 檢測到的關(guān)鍵點(diǎn)的數(shù)量。 例如,圖像大小為 225,輸出步幅為 16,那么就是 15x15x17。 第三維(17)中的每個(gè)切片與特定關(guān)鍵點(diǎn)的熱圖對應(yīng)。 該熱圖中的每個(gè)位置都有一個(gè)置信度分?jǐn)?shù),即該關(guān)鍵點(diǎn)類型的一部分存在于該位置的概率。 可以視作原始圖像被分解成 15x15 網(wǎng)格,而熱圖分?jǐn)?shù)將對每個(gè)網(wǎng)格方塊中每個(gè)關(guān)鍵點(diǎn)存在的可能性進(jìn)行分類。
偏移矢量
每個(gè)偏移矢量是尺寸分辨率 x 分辨率 x 34 的 3D 張量,其中 34 是關(guān)鍵點(diǎn)的數(shù)量 * 2。圖像尺寸為 225,輸出步幅為 16,那么就是 15x15x34。 由于熱圖是關(guān)鍵點(diǎn)所在的近似值,因此偏移矢量在位置上對應(yīng)于熱圖點(diǎn),并用于通過沿相應(yīng)熱圖點(diǎn)的矢量行進(jìn)來預(yù)測關(guān)鍵點(diǎn)的確切位置。 偏移矢量的前 17 個(gè)切片包含矢量的 x,最后的 17 個(gè) y。 偏移矢量大小與原始圖像的比例相同。
從模型的輸出判斷姿勢
圖像通過模型后,我們會執(zhí)行一系列計(jì)算來判斷輸出的姿勢。 例如,單一姿勢判斷算法會回饋?zhàn)藙葜眯哦鹊梅?,其本身包含關(guān)鍵點(diǎn)陣列(由部件 ID 索引),每個(gè)關(guān)鍵點(diǎn)具有置信度得分和 x,y 位置。
要獲得姿勢的關(guān)鍵點(diǎn):
在熱圖上進(jìn)行 S 形激活以獲得分?jǐn)?shù)。得分= heatmap.sigmoid()
argmax2d 在關(guān)鍵點(diǎn)置信度得分上完成,以獲得熱圖中的x和y索引,每個(gè)部分的得分最高,這實(shí)際上是該部分最可能存在的位置。這會產(chǎn)生一個(gè)大小為 17x2 的張量,每一行都是熱圖中的 y 和 x 索引,每個(gè)部分的得分最高。heatmapPositions = scores.argmax(y,x)
通過從對應(yīng)于該部件的熱圖中的 x 和 y 索引的偏移量獲取 x 和 y 來檢索每個(gè)部件的偏移矢量。這會產(chǎn)生一個(gè)大小為 17x2 的張量,每行是相應(yīng)關(guān)鍵點(diǎn)的偏移量。例如,對于索引 k 處的部分,當(dāng)熱圖位置為 y 和 d 時(shí),偏移矢量為:offsetVector = [offsets.get(y,x,k),offsets.get(y,x,17 + k)]
為了得到關(guān)鍵點(diǎn),每個(gè)部件的熱圖 x 和 y 乘以輸出步幅,然后加到它們相應(yīng)的偏移矢量,該矢量與原始圖像的比例相同。keypointPositions = heatmapPositions * outputStride + offsetVectors
最后,每個(gè)關(guān)鍵點(diǎn)置信度得分是其熱圖位置的置信度得分。姿勢置信度得分是關(guān)鍵點(diǎn)得分的平均值。
多人姿勢判斷
多姿勢判斷運(yùn)算法則的詳細(xì)內(nèi)容就不在本文中一一贅述。 大體來說,該運(yùn)算法則的不同之處在于它使用了貪婪過程,通過沿著基于部分的圖形來跟隨位移矢量來將關(guān)鍵點(diǎn)分組成姿勢。 確切地說,就是它使用了研究論文 PersonLab 中的快速貪婪解碼算法:人物姿勢判斷和實(shí)例分割與自下而上,基于部分的幾何嵌入模型。 有關(guān)多姿勢運(yùn)算法則的更多信息,請閱讀完整的研究論文或查看代碼。
注:代碼鏈接
https://github.com/tensorflow/tfjs-models/tree/master/posenet/src
最后
我們希望隨著越來越多的模型被移植導(dǎo)入到 TensorFlow.js,機(jī)器學(xué)習(xí)的世界變得對新的編碼員和制造者來說更容易接近,更受歡迎,更有趣。 TensorFlow.js 上的 PoseNet 是一個(gè)小嘗試,使之成為可能。 我們將很樂意看到你的制作 - 并且不要忘記使用 #tensorflowjs 和 #posenet 來分享你的精彩項(xiàng)目!
-
瀏覽器
+關(guān)注
關(guān)注
1文章
1040瀏覽量
35998 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8481瀏覽量
133879 -
tensorflow
+關(guān)注
關(guān)注
13文章
330瀏覽量
60951
原文標(biāo)題:有了 TensorFlow.js,瀏覽器中就能進(jìn)行實(shí)時(shí)人體姿勢判斷
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
11個(gè)你應(yīng)當(dāng)使用FIREFOX瀏覽器的理由
Web瀏覽器,Web瀏覽器是什么意思
四大瀏覽器續(xù)航對決,結(jié)果Chrome瀏覽器完勝
開發(fā)一個(gè)VR網(wǎng)絡(luò)瀏覽器需要注意以下這些事項(xiàng)
用TensorFlow.js在瀏覽器中構(gòu)建了一個(gè)使用任意圖像進(jìn)行風(fēng)格化的demo
iOS 14的功能揭秘:允許用戶用Chrome瀏覽器替代Safari
Google正在其Chrome瀏覽器中測試一項(xiàng)備受期待的新功能
如何制作一個(gè)通過本地WiFi網(wǎng)絡(luò)瀏覽器進(jìn)行控制的恒溫器

瀏覽器需要支持javascript怎么解決
js腳本怎么在瀏覽器中運(yùn)行
微軟推出ONNX Runtime Web,利用WebGPU優(yōu)化瀏覽器機(jī)器學(xué)習(xí)性能
英碼科技EA500I基于昇騰Mind SDK實(shí)現(xiàn)實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測

英碼科技EA500I基于昇騰Mind SDK實(shí)現(xiàn)實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測

Opera瀏覽器引領(lǐng)潮流,全球首接端側(cè)AI大模型
寫一個(gè)Chrome瀏覽器插件

評論