在瀏覽器中使用tensorflow.js進行人臉識別的JavaScript API

在瀏覽器中使用tensorflow.js進行人臉識別的JavaScript API

作者 | Vincent Mühle

編譯 | 姍姍

【導讀】隨著深度學習方法的應用,瀏覽器調用人臉識別技術已經得到了更廣泛的應用與提升。在實際過程中也具有其特有的優勢,通過集成與人臉檢測與識別相關的API,通過更為簡單的coding就可以實現。今天將為大家介紹一個用於人臉檢測、人臉識別和人臉特徵檢測的 JavaScript API,通過在瀏覽器中利用 tensorflow.js 進行人臉檢測和人臉識別。大家不僅可以更快速學習這個,對有人臉識別技術需求的 JS 開發者來說更是一件值得開心的事。

▌前言

對於 JS 開發者來說這將是一件很開心的事,那就是終於可以在瀏覽器中進行人臉識別了!通過接下來的這篇文章,將為大家介紹 face-api.js,一個構建在 tensorflow.js core 上的 javascript 模塊,實現了人臉檢測、人臉識別和人臉特徵檢測三種 CNNs (卷積神經網絡)。

我們將通過研究一個簡單的代碼示例,只用幾行代碼就可以試著使用這個包。

▌第一個人臉識別包 face-recognition.js,現在又來了一個包?

如果讀過我的另一篇關於人臉識別的文章 Node.js + face-recognition.js : Simple and Robust Face Recognition using Deep Learning,你可能會了解到在不久前,我組裝了一個類似的包, face-recognition.js,用 nodejs 來進行人臉識別。

起初,我沒有想到在 javascript 社區對人臉識別包的需求會如此之高。對很多人來說,face-recognition.js 就像微軟或亞馬遜所提供的,似乎是一個不錯的可免費使用且開源的替代付費服務的人臉識別服務。但我經常也會被問到一個問題,在瀏覽器中是或否可以完全運行完整的人臉識別管道。

對此要感謝 tensorflow.js !我使用 tfjs-core 實現了部分類似的工具,得到與 face-recognition.js 幾乎相同的結果,但,是在瀏覽器中實現的!而最棒的一點是,它不需要設置任何外部依賴關係,就可以直接使用。還有一個意外的獎勵 —— 在 WebGL 上運行操作 ,GPU 的加速。

這足以讓我相信,javascript 社區需要這樣一個包!這也將留給你們足夠的想象空間,你們可以用它來構建各種各樣的應用。

如何用深度學習解決人臉識別問題

如果你是希望儘快開始,你可以跳過這一部分,直接跳到編碼中。但是為了更好地理解 face-api.js 使用的方法。要實現人臉識別,強烈建議參與一起學習,因為我經常會被問到這個問題。

簡單來說,我們實際上想要實現的是,識別給出的一個人的面部圖像,用作輸入圖像(input image)。

我們的方法是,給出想識別的那個人的一張或多張圖片,並給此人的名字打上標籤,用作參考數據(reference data)。現在將輸入圖片與引用數據進行對比並找出最相似的參考圖片。如果兩個圖像足夠相似,我們將會輸出此人的名字,否則我們輸出結果為 “unknow”。

聽起來不錯吧!然而這其中還存在兩個問題。首先,如果一張照片中有多人並且我們想把所有人都識別出來該怎麼辦?其次,我們需要能夠計算出兩張人臉圖像的相似度度量,以便比較它們。

▌人臉檢測

對於第一個問題的答案是通過人臉檢測來解決。簡單地說,我們首先定位輸入圖像中的所有面孔。人臉檢測,face-api.js 實現了一個 SSD 算法,它基本上是基於 MobileNetV1 的 CNN,在網絡的頂部有一些額外的盒預測層。

網絡返回每張面孔的邊界框與相應的分數,即顯示面孔的每個邊界框的概率。這些分數用於篩選邊界區域,因為圖像中可能根本不包含任何面孔。注意,即使只有一個人要檢索邊界框,人臉檢測也應該執行。

在瀏覽器中使用tensorflow.js進行人臉識別的JavaScript API


▌人臉特徵檢測和人臉對齊

第一個問題解決了!但是,我們想要對齊邊界框,這樣我們就可以在傳遞給人臉識別網絡之前,在每個區域的人臉中心提取出圖像,這將使人臉識別更加準確!

為此 face-api.js 實現了一個簡單的 CNN 網絡,此網絡返回給定人臉圖像的 68 個點的面部特徵。

在瀏覽器中使用tensorflow.js進行人臉識別的JavaScript API

根據特徵點的位置,邊界區域可以集中在面部中心。在下圖中你可以看到人臉檢測的結果(左)與對齊的人臉圖像(右)

在瀏覽器中使用tensorflow.js進行人臉識別的JavaScript API


▌人臉識別

現在我們可以將提取和對齊的人臉圖像輸入到人臉識別網絡中,該網絡是基於類似 ResNet-34 的架構,基本上對應於 dlib 中實現的架構。該網絡已經被訓練學習將人臉的特徵映射到人臉描述符(一個有128個值的矢量)中,通常也被稱為人臉嵌入。

現在回到比較兩個人臉時的原始問題:我們將使用提取的每張人臉圖像的描述符,並將它們與參考數據的人臉描述符進行比較。更準確地說,我們可以計算兩張人臉描述符之間的歐式距離,根據閾值判斷兩個人臉是否相似(對於 150×150 幅人臉圖像,0.6 是一個很好的閾值)。使用歐幾里得距離方法非常有效,當然你也可以選擇任意類型的分類器。下面的 gif 圖像例子就是通過歐幾里得距離來比較的兩張人臉圖像:

在瀏覽器中使用tensorflow.js進行人臉識別的JavaScript API

在學過了人臉識別的理論之後,我們開始 coding ~~


▌編碼

在這個簡短的示例中,我們將逐步看到如何在下面這張多人的輸入圖像上進行人臉識別:

在瀏覽器中使用tensorflow.js進行人臉識別的JavaScript API

▌腳本

首先,從 dist / face - api .js上或者 dist/face-ap.min.js 的minifed版本中獲取 latest build ,包括腳本:

-->
            

            


分享到:


相關文章: