拍照時怎樣擺姿勢好看?前端玩轉AI之posenet指南

  • 2019 年 10 月 7 日
  • 筆記

我們在網上可以看到大量優秀的攝影作品,如何利用機器從網上獲取大量的圖片,從中提取出最佳的擺拍姿勢供拍照時參考?首先我們得有大量的優秀攝影圖片。然後,需要思考如何獲得攝影作品中人物姿勢的數據?待下文慢慢道來:

閱讀難度:★★★☆☆

技能要求:機器學習、前端基礎

字數:1250字

閱讀時長:5分鐘

STEP1

爬蟲獲取大量的圖片

此項技能,可查閱:技能之谷歌Chrome爬蟲

STEP2

獲取人體姿勢數據

使用tensorflowJS(下文簡寫為tfjs)的posenet擴展庫提取圖片中人體的姿勢數據

關於posenet擴展庫,可查閱:

10行代碼用tensorflowJS實現人體關鍵點檢測

在html可以很方便地引用tfjs及posenet庫:

html

<script src="https://unpkg.com/@tensorflow/tfjs"></script>

<script src="https://unpkg.com/@tensorflow-models/posenet"></script>

posenet的調用也非常簡單:

js

posenet.load().then(function (net) { //這裡把圖片傳入net return net.estimateMultiplePoses(img)

}).then(function (_pose) { var keyPoints = getKeypoints(_pose); //這裡把keyPoints保存下來,傳入pose2vec函數 var vec= pose2vec(); //把vec都保存下來,最後用餘弦相似度進行計算

});

獲取的大量圖片的姿勢數據:

不熟悉tfjs?不要緊,這裡給出一個入門路徑供參考:

T1

熟悉JS的基本代碼

T2

熟悉圖像分類、姿勢識別、文本分類

採用html引用tfjs包的形式,熟悉加載已訓練好的模型進行練習。

T3

會用tfjs寫線性回歸、cnn、lstm等

T4

熟悉使用tfjs的遷移學習

經過4個基本的練習,整個tfjs的使用就差不多可以掌握了,剩下的遇到問題再查詢tfjs的官方api文檔即可,根據實際情況再選擇深入了解機器學習相關的知識。

STEP3

pose2vec

把坐標點按照順序轉化為向量

這裡不知大家還記得之前文章提到的word2vec嗎?一個把文本映射到向量空間的算法,通過向量運算,可以用於發現化學元素、英文單詞的近義詞、推薦歌曲、挖掘影視劇的人物關係、挖掘作家文章觀點、提煉色彩搭配關係等等。這裡類似的道理,把人體姿勢的關鍵點映射到向量空間,然後就可以方便我們進行一些向量運算(例如加減乘除)。

不記得word2vec,可以點擊以下卡片回顧:

轉化為向量的時候注意,每個關鍵點都是固定的位置,向量的長度也是固定的。若不存在此關鍵點,則對應的值取0。

function pose2vec(keypoints){ var kpObj = {

"nose": 0,

"leftEye": 1,

"rightEye": 2,

"leftEar": 3,

"rightEar": 4,

"leftShoulder": 5,

"rightShoulder": 6,

"leftElbow": 7,

"rightElbow": 8,

"leftWrist": 9,

"rightWrist": 10,

"leftHip": 11,

"rightHip": 12,

"leftKnee": 13,

"rightKnee": 14,

"leftAnkle": 15,

"rightAnkle": 16 };

var res = []; for (let i = 0; i < keypoints.length; i++) { const ks = keypoints[i];

var kps = new Array(17);

for (let j = 0; j < ks.length; j++) {

const k = ks[j];

//只框選出人,size是這個人的區域所在

var p = [(k.position.x – size.x),

(k.position.y – size.y)];

kps[kpObj[k.part]] = p;

};

kps = kps.toString().split(',');

res.push(kps);

};

};

STEP4

如何找出相似的攝影姿勢?

大家可以思考下,有什麼方法?

在機器學習和數據挖掘中,我們經常需要知道個體間差異的大小,進而評價個體的相似性和類別。相似性我們一般通過距離來判斷,類別我們有分類聚類算法,如 K 最近鄰(KNN)和 K 均值(K-Means)等。而距離度量,常見的有:

閔可夫斯基距離

歐幾里得距離

曼哈頓距離

切比雪夫距離

馬氏距離

餘弦相似度

皮爾遜相關係數

漢明距離

傑卡德相似係數

編輯距離

DTW 距離

KL 散度

本文採用餘弦相似度(Cosine similarity):

餘弦相似度與向量的幅值無關,只與向量的方向相關,在文檔相似度(TF-IDF)和圖片相似性(histogram)計算上都有它的身影。需要注意一點的是,餘弦相似度受到向量的平移影響,為了消除平移影響我們可以引入皮爾遜相關係數(Pearson correlation)皮爾遜相關係數具有平移不變性和尺度不變性。

餘弦相似度相關的文章可以點擊查看:

如何找出相似的文章

餘弦相似度,用tfjs實現下:

x=tf.tensor1d([0,1,1,1]);

y=tf.tensor1d([1,2,3,4]);

p1=tf.sqrt(x.mul(x).sum());

p2=tf.sqrt(y.mul(y).sum());

p12=x.mul(y).sum();

score=p12.div(p1.mul(p2));

score.print();

根據實際情況進行封裝即可。

STEP5

產品原型

把這一過程最終寫成一個web應用,點擊圖片即可找到其相似的攝影姿勢,作為拍照時的參考,是不是蠻好的 ?

一些計算結果:

以上為全文,本文是mixlab無界社區超級節點MLN-003的指南:

前端玩轉AI之Tensorflow.JS workshop

我們會在本節點開展包括基礎的JS練習指南,進階的各種應用指南,還有線下的workshop活動。

如何加入,微信公眾號回復:超級節點