以 Azure Face API 實作臉部辨識

Ashe Liao
Ashe’s tech talks
8 min readMar 22, 2019

前言

臉部辨識也是近幾年非常紅的大數據議題之一, Microsoft 推出的 Azure Face API 是一項認知服務,可提供演算法來偵測、辨識和分析影像中的人臉。 處理人臉資訊的能力在許多不同的軟體案例中都有其重要性,例如安全性、自然使用者介面、影像內容分析和管理、行動應用程式及機器人。

針對 Face API,目前一共有五種不同的功能。

  1. 偵測臉部 (Detect)
  2. 尋找相似臉部 (Find Similar)
  3. 群組 (Group)
  4. 識別 (Identify)
  5. 驗證 (Verify)

以上的資訊會藉由 json file 回送,接著會逐一介紹五個 API 的使用時機和方式。

偵測臉部 (Detect)

最基礎的 Face API,使用者傳入一張圖片後,會自動偵測圖片中出現的人臉,並回傳臉部框架 (face rectangle),將會給定框架的左上角以及長寬,以及可以自選以下的特徵。

  1. FaceId
  2. FaceLandmarks
  3. FaceAttributes

FaceId 就像是臉部的身分證,Face API 會產生一組獨一無二的亂碼作為識別這張臉的數位簽章,並會在最後一次呼叫 Face API 的 24 小時後過期。

FaceLandmarks 將回傳一個陣列,包含這張臉的27個重要的點。

FaceAttributes 則包含 13 種的特徵,包含年紀、性別、微笑強度 (0–1)、鬍鬚強度(0–1, 分為兩鬢鬍鬚 sideburns、髭 moustache、以及鬍子 beard)、頭部傾角、眼鏡種類(未戴眼鏡、閱讀眼鏡、太陽眼鏡、泳鏡)、情緒強度(0–1, 分為中立、憤怒、輕視、厭惡、恐懼、高興、悲傷、驚訝)、髮型 (是否頭髮可見,髮色為何)、化妝 (眼妝、口紅)、配件(髮圈、眼鏡、口罩)、模糊量值及強度([弱中強, 0–1])、曝光程度(良好、過曝、不足)、臉部像素雜訊([弱中強, 0–1])

尋找相似臉部 (Find Similar)

從上一個 API 我們可以知道,把臉部送入 Face API 後,將會回傳一個會在 24 小時後過期的 FaceId。透過尋找相似臉部 API,會把這個 FaceId 送入透過 FacelList 創造的陣列中去尋找相似的臉部,FacelList 中的 FaceId 並不會在 24 小時後過期。

尋找相似臉部 API有兩種不同的工作模式,人像配對模式和臉部配對模式。人像配對模式是默認的工作模式,會將一張臉送入 FaceList 後,搜尋 FaceList 中同一個人的其他臉部,常用在搜尋已知人員的其他臉部圖像。另一個則是臉部配對模式,臉部配對模式會忽略同一個人的限制,直接在 FaceList 中尋找相似的臉部,常用在名人臉部相似度排序。

回送的 json file 則會包含最相似的臉部的 FaceId以及信心值[0, 1]。

群組 (Group)

根據臉部的相似程度,把許多人的臉部照片自動分類,群組數目會根據臉部特徵而有不同。

在群組 API 中,有可能發生相同臉部但因為光線陰影面積不同,造成特徵不相同,而被分類到不同的群組中。

回送的 json file 會將群組分為兩種回傳,一種是具有相同特徵的 groups,一種則是臉部特徵在所有群組中皆找不到適合的群組放入,就會被放進 messygroup。

Face API 的相關功能非常多,因為剩下的功能(創造或索引 PersonGroup)較為複雜,屬於較進階的應用,因此我打算先介紹最常用的偵測臉部 API,這也是專案或是 Hackathon 最常用到的。之後有機會再和大家分享剩下的 :)

開始使用 Face API

# 建立資源

  1. 登入 Azure Portal
  2. 按下左側的建立資源,在搜尋框中搜尋 Face

3. 選擇第一個 “臉部” 資源並建立

輸入建立資源的必要資訊後,點選建立

# 開始使用

  1. 資源部屬完成後,可以從右上角的鈴鐺形狀通知點選,進入剛剛建立完成的資源群組
  2. 在建立完成的資源群組中,會有一個 Cognitive Services 的資源,點選進入

進入並在右邊選單點選 Overview 後,我們就進到臉部辨識的概覽頁面中,我們需要取得右邊的 Endpoint 以及 Manage Keys 以使用 Face API

# 以 Postman 示範 - 前置作業

  1. 首先,Face API 是能夠識別人臉資訊的認知服務。也就是說,我們需要找到一張有人臉的照片讓 Face API 來判斷。
  2. 以下這張是我找的照片,在寒戰中飾演警務處副處長的 M.B Lee(梁家輝),請右鍵點選複製圖片位置

# 以 Postman 示範 - URL

  1. 打開 Postman,在 API 方法中選擇 Post
  2. 旁邊的 Request URL 請貼上在開始使用第三步取得的 endpoint
  3. 由於我們要實作人臉偵測,想要回傳的值包含臉部位置、年齡、性別和情緒,我們需要小小改動 Endpoint
  4. 本來的 Endpoint 應該長這樣
https://[在建立資源時選取的地點 會自動生成不用更改ex:westus2].api.cognitive.microsoft.com/face/v1.0

需要改成

https://[在建立資源時選取的地點  會自動生成不用更改ex:westus2].api.cognitive.microsoft.com/face/v1.0/detect?returnFaceAttributes=age,gender,emotion

這樣才能夠回傳我們想要的 FaceAttributes ,如果要顯示更多特徵,或是想要改成上面介紹的幾種功能,請參考這篇官方教學文章

# 以 Postman 示範 - Header & Body

  1. Header 要放的是剛剛在開始使用第三步取得的 Manage keys,點選 Show access keys 可以看到兩把 Key 可以選擇,請隨意選取一把並複製。
  2. 接著,請在 Postman 中選取 Headers,並在 Key 值填入 Ocp-Apim-Subscription-Key,Value 填上剛剛複製好的 Key。
  3. 切換到 Body,選擇 raw ,以及在右邊的下拉選單中選擇 JSON(application/json) 格式
  4. 在以下的程式碼中,貼上剛剛複製的圖片位置並複製整段程式碼貼上 Postman
{ 
"url": "[改成剛剛複製的圖片位置 要留意最後必須為.jpg 或是 .png]"

}

Header 設定完應該長這樣

Body 設定完應該長這樣

# 以 Postman 示範 - 取得結果

按下右邊的藍色 Send 按鈕,就可以看到 FaceAPI 回送的結果。回送的結果會以 json 格式返回。

剛剛發送的圖片 URL 中的人臉是寒戰 2 的李文彬,飾演者梁家輝在 2012 時的年紀應該是 54 歲左右,劇中的設定是 51 歲,相差不太大。李文彬是男性也沒錯,這張臉的情緒也蠻中立的。因此可以說,Face API 在辨別這張臉的時候,準確性相當高。

常常被問到的問題是,為何 Face API 回送的年齡都比較老?

如果大家還記得幾年前風行一時的 howold.net 的話,微軟就是利用其中的臉部資料庫來訓練 Face API,而當時資料庫較多的臉部為西方人臉孔,造成東方人普遍臉部辨識的會較實際年長一點。

# 結論

這篇文章一開始,我們先簡介了何謂 Face API、Face API 幾種常用的功能。接著介紹如何在 Azure Portal 建立 Face API 資源,最後利用 Postman 實做臉部的年紀、性別、情緒等偵測。

如果你覺得這系列的文章對你有幫助的話,請不吝拍手或留言,你的支持是我寫 Medium 的最大動力。

--

--

Ashe Liao
Ashe’s tech talks

Azure Solution Specialist, Microsoft Taiwan | Microsoft 15th MTC TAI | NTU BDSRC RA, DSSI TA