Face AI
Source
https://docs.microsoft.com/zh-tw/azure/cognitive-services/face
Face API Document
Sample API in Postman
Guide
What is Face API
Face Api 主要分為兩大服務
- Face Detection - 用來識別圖片裡面的人臉的位置以及人臉的一些相關信息,例如年紀、性別、情緒…
- Face Recognition
- Verify - 用來驗證兩個圖片的人臉是不是同一個人
- Find Similar - 從一堆圖片裡面找出和這個圖片人臉有關的圖片
- Group - 把一堆圖片的人臉做分類
- Identity - 判別圖片的人臉是誰
名詞釐清
- Face ID: 照片中取出臉部特徵的 ID(一張臉),將在 24hr 被刪除
- Person Group: 一群人的合集(ex: My Friends)
- Person: 一個人(某個 Group 中的人,對應到好幾張照片)
- Model: 建好 Person Group、Person、Add Face 之後,需要訓練(train) 這個 Group 才能夠用來識別
- 在 2019/03 之後,recognitionModel 多了 recognition_02 參數可以選,準確性提高很多
- 在 2019/05 之後,Detect(create Face ID) 時,detectionModel 多了 detection_02 可以選,增加圖片人臉辨識能力(增加非常多),但是將無法使用某些參數(Face attributes、landmarks)
Verify vs Identify
- Verify: 比較兩張照片或是某張照片是否和某個人相同
- Identify: 找出某張臉的主人
Use Group
- 建立 Person Group
- 建立 Person
- 把人臉加入到 Person
- 訓練 Person Group 產生 Model
回傳值
Face Detect
回傳照片裡面所有能辨識到的人臉(max: 100)
- 在辨識時須注意 detectionModel 01、02 辨識效果差很多(但 02 無法回傳特徵屬性,若不需要知道年齡、性別、情緒…則沒差)
- recognitionModel 要與後續識別之群組相同
Get Person Group List
取得所有建立的群組
Get Person List
取得所有建立的 Person
Identity
人臉識別,request 一次要辨識的人臉(FaceID)最多只能10張
request
response 結果可設定信心指數多少才會回傳,以及回傳信心指數內識別出的人數(1~100個)
response
Webcam
Repo
架構圖


- Person 的 Table 需要把 PersonId 改成員工編號(EmpId),因為一個人在多個群組的 PersonId 不一樣,故其對應的人所屬群組也需要增加員工編號。
- Person Photo 的 Table 也需要把 PersonId 改為員工編號。

流程
- Webcam 截圖(使用 OpenCV)
- 避免浪費 API 資源,local 端先辨識人臉(Face-api.js)
- 辨識出的影格(Frame)傳 Azure AI 識別
- 識別一次只能帶上 10 張臉,如果超過需要分好幾次 request 來識別
- 收到結果後傳給 Server
- 前端顯示識別到的人的資料(照片、姓名…etc)
問題
Q1: 在即時辨識下,就算設定截圖的時間間隔,若遇到人物在畫面中定點,該如何避免大量傳送照片?
local 在偵測到人臉時,透過相似度比對一定時間內(ex: 3min)是否有相似的人臉,有則不送 Azure AI。
但是 Face-api.js 的相似度比對需要一張臉比對一張臉
- 截圖時需要把辨識到的人臉切出來暫存,好用來比對相似度
採用此方法,辨識流程若改:
- local 暫存所有切出來的臉
- 若該次截圖中發現在暫存中有找到類似的人臉,則採一次辨識一張臉(Azure AI),只辨識新臉孔
- 承 (2),若否,則直接傳送截圖,同時辨識多張臉
此方法不可行
- 雖然減少相同人臉的辨識次數,以及解決相同的人長時間在畫面中,但不確定是否反而增加辨識的 API 消耗次數
- 若使用這種區間暫存的概念,會無法即時得知畫面中的人物離開的訊息,只能知道 ex: 3分鐘內,此畫面有誰曾經出現過,但無法在他離開畫面後短時間內得知,只能等暫存 3 分鐘後清空,才能夠比對得知
若是即時偵測(ex: 3秒偵測一次),則可以知道短時間內的變化,但是有人物定點時,將會以最小間隔(3秒)使用 Azure API
註: 免費額度一分鐘最多使用 20 次 => 3 秒一次
Q2: 免費額度(30000/month)大約可以怎麼用?
((一個月-周末)*上班時間)/30000
((30 - 8) * 10 * 60 * 60) / 30000 ~= 26(per/sec)
識別之前還需要先辨識,故只能將近一分鐘識別一次
Try
測試 Face-api.js 中距離人臉辨識效果
大約 4.5m,辨識效果良好(兩人同時入鏡也有辨識到)


找個幾張照片建立人物
識別的照片
識別結果
- ChiMi 訓練的照片&識別的照片都是網路找解析度還不錯,故識別信心度達 0.9
- Ryan 的辨識效果不好,陸續加了三張清楚的臉部照片訓練,最後才達到 0.65
- Mom 的訓練照片只有一張臉部照片,但識別出來的信心度卻有達到 0.82
- 檢討: Ryan 識別信心度太低應該是識別的照片頭髮太長太厚