拍照時怎樣擺姿勢好看?前端玩轉AI之posenet指南
- 2019 年 10 月 7 日
- 筆記

我們在網上可以看到大量優秀的攝影作品,如何利用機器從網上獲取大量的圖片,從中提取出最佳的擺拍姿勢供拍照時參考?首先我們得有大量的優秀攝影圖片。然後,需要思考如何獲得攝影作品中人物姿勢的數據?待下文慢慢道來:
閱讀難度:★★★☆☆
技能要求:機器學習、前端基礎
字數:1250字
閱讀時長:5分鐘
STEP1
爬蟲獲取大量的圖片
此項技能,可查閱:技能之谷歌Chrome爬蟲
STEP2
獲取人體姿勢數據
使用tensorflowJS(下文簡寫為tfjs)的posenet擴展庫提取圖片中人體的姿勢數據

關於posenet擴展庫,可查閱:
在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活動。
如何加入,微信公眾號回復:超級節點。