谷歌發布人體圖像分割工具BodyPix 2.0,支持多人識別,可在iPhone上流暢運行
曉查 發自 凹非寺
量子位 報道 | 公眾號 QbitAI
今天,Google官方推出了使用TensorFlow.js的人體圖像分割工具BodyPix 2.0,對該工具進行了一次重大升級,加入多人支持,并提高了準確率。
BodyPix能將圖像分割為屬于人的和不屬于人的像素,屬于人的部分可以進一步分類為二十四個身體部位之一。
BodyPix可以直接在瀏覽器中運行,開發者只需加入幾行代碼,即可與電腦或手機的攝像頭配合使用。
在使用默認設置的情況下,BodyPix可以在15寸MacBook Pro上以25 fps的速度估計,并渲染人和身體部位的分割。而在iPhone X上,BodyPix能以21 fps的速度進行估計。
BodyPix于今年2月推出,本次2.0版的主要更新有:對多人圖像的支持、增加基于ResNet-50的模型、新的API、權重量化以及對不同尺寸圖像的支持。
功能演示
在項目的GitHub主頁上,TensorFlow給出了BodyPix 2.0軟件的一些基本用法演示,還有網頁版Demo供用戶體驗。
人像分割
對于給定具有一個或多個人的圖像,人像分割可預測所有人的分割。segmentPerson返回PersonSegmentation,對應于圖像中人物分割的對象。
segmentPerson默認不會在不同的個人之間消歧義。因此如果您需要對不同的人進行區分,請使用segmentMultiPerson,不過引入此方法會導致運行速度變慢。
以上結果返回的是一組0和1的數組,用于表示該像素點是否屬于人。
身體部位細分
BodyPix的segmentPersonParts方法可以預測所有人的24個身體部位分割。
PartSegmentation會所有合并的人,返回值是每個像素與身體部位相對應的編碼。同樣的,如果需要區分多人,請使用segmentMultiPersonParts。
身體不同部位對應的編碼如下表所示:
把結果輸出到圖像上
BodyPix還包含其他實用程序功能,可以將輸出結果與原始圖像合成,得到你所需的渲染圖像。
bodyPix.toMask可以給人和背景加上一層蒙版,指定渲染像素的顏色和不透明度。
bodyPix.toColoredPartMask可以給人體部位分割加上一個24色的顏色數組,每個身體部位都對應著數組中的一個顏色。
以上是BodyPix的基礎功能的用法。
既然BodyPix可以區分出人體和背景 ,我們就可以用它實現實時的背景虛化,調用的API方法是bodyPix.drawBokehEffect。
利用BodyPix識別出身體不同部位的功能,可以調用bodyPix.blurBodyPart給人臉打上馬賽克。
此外還有更多的圖像繪制API,在此就不一一列舉了。
安裝方法
BodyPix使用非常簡便,用戶可以將其與腳本標簽一起嵌入HTML使用:
<html>
<body>
<!-- Load TensorFlow.js -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.3"></script>
<!-- Load BodyPix -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/body-pix"></script>
bodypix.load().then(function(net) {
// BodyPix model loaded
});
</script>
</body>
</html>
或者通過npm方式安裝:
npm install @tensorflow-models/body-pix
然后使用es6模塊導入:
import * as bodyPix from '@tensorflow-models/body-pix';
async function loadAndUseBodyPix() {
const net = await bodyPix.load();
// BodyPix model loaded
}
如何讓BodyPix運行更快
BodyPix帶有不同尺寸的模型,具有不同的性能。通過設定模型的大小和輸出步長,可以在運行速度和準確性之間進行權衡。
默認情況下,BodyPix加載的是0.75倍的MobileNetV1架構,適合中低端GPU的計算機使用,而導入0.50倍的模型可以用于移動設備。
const net = await bodyPix.load({
architecture: 'MobileNetV1',
outputStride: 16,
multiplier: 0.75,
quantBytes: 2
});
倍率的數值越大,神經網絡中層的尺寸也越大,準確率更高、推理速度更慢。不同倍率模型的性能對比如下:
對于具有更強大GPU的計算機,官方建議使用ResNet架構,這一部分也是2.0版加入的新功能。
const net = await bodyPix.load({
architecture: 'ResNet50',
outputStride: 32,
quantBytes: 2
});
原理簡介
BodyPix的核心是執行人體分割的算法,對輸入圖像的每個像素執行二進制決策,以估計該像素是否屬于某個人。
圖像通過MobileNet網絡饋送,并且使用S型激活函數將輸出轉換為0到1之間的值。
為了估計身體部位的分割,BodyPix使用相同的MobileNet表示,但是這次通過預測額外的24個通道輸出張量P來重復上述過程,其中二十四是身體部位的數量。每個通道編碼身體某部位是否存在的概率。
輸出張量P中有24個通道,因此需要在24個通道中找到最佳部分。在推斷期間,對于輸出身體部位張量P的每個像素位置(u,v),body_part_id使用以下公式選擇屬于第i個部位概率最高的像素:
這將產生一個二維圖像,每個像素都包含一個整數,該整數表示該像素屬于哪個身體部位。通過將值設置為-1,可以把不屬于人體的部分剔除掉。
傳送門
試玩Demo:
https://storage.googleapis.com/tfjs-models/demos/body-pix/index.html
官方博客:
https://blog.tensorflow.org/2019/11/updated-bodypix-2.html
GitHub地址:
https://github.com/tensorflow/tfjs-models/tree/master/body-pix
- 腦機接口走向現實,11張PPT看懂中國腦機接口產業現狀|量子位智庫2021-08-10
- 張朝陽開課手推E=mc2,李永樂現場狂做筆記2022-03-11
- 阿里數學競賽可以報名了!獎金增加到400萬元,題目面向大眾公開征集2022-03-14
- 英偉達遭黑客最后通牒:今天必須開源GPU驅動,否則公布1TB機密數據2022-03-05




