以 Azure Face API 實作臉部辨識
前言
臉部辨識也是近幾年非常紅的大數據議題之一, Microsoft 推出的 Azure Face API 是一項認知服務,可提供演算法來偵測、辨識和分析影像中的人臉。 處理人臉資訊的能力在許多不同的軟體案例中都有其重要性,例如安全性、自然使用者介面、影像內容分析和管理、行動應用程式及機器人。
針對 Face API,目前一共有五種不同的功能。
- 偵測臉部 (Detect)
- 尋找相似臉部 (Find Similar)
- 群組 (Group)
- 識別 (Identify)
- 驗證 (Verify)
以上的資訊會藉由 json file 回送,接著會逐一介紹五個 API 的使用時機和方式。
偵測臉部 (Detect)
最基礎的 Face API,使用者傳入一張圖片後,會自動偵測圖片中出現的人臉,並回傳臉部框架 (face rectangle),將會給定框架的左上角以及長寬,以及可以自選以下的特徵。
- FaceId
- FaceLandmarks
- 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
# 建立資源
- 登入 Azure Portal
- 按下左側的建立資源,在搜尋框中搜尋 Face
3. 選擇第一個 “臉部” 資源並建立
輸入建立資源的必要資訊後,點選建立
# 開始使用
- 資源部屬完成後,可以從右上角的鈴鐺形狀通知點選,進入剛剛建立完成的資源群組
- 在建立完成的資源群組中,會有一個 Cognitive Services 的資源,點選進入
進入並在右邊選單點選 Overview 後,我們就進到臉部辨識的概覽頁面中,我們需要取得右邊的 Endpoint 以及 Manage Keys 以使用 Face API
# 以 Postman 示範 - 前置作業
- 首先,Face API 是能夠識別人臉資訊的認知服務。也就是說,我們需要找到一張有人臉的照片讓 Face API 來判斷。
- 以下這張是我找的照片,在寒戰中飾演警務處副處長的 M.B Lee(梁家輝),請右鍵點選複製圖片位置
# 以 Postman 示範 - URL
- 打開 Postman,在 API 方法中選擇 Post
- 旁邊的 Request URL 請貼上在開始使用第三步取得的 endpoint
- 由於我們要實作人臉偵測,想要回傳的值包含臉部位置、年齡、性別和情緒,我們需要小小改動 Endpoint
- 本來的 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
- Header 要放的是剛剛在開始使用第三步取得的 Manage keys,點選 Show access keys 可以看到兩把 Key 可以選擇,請隨意選取一把並複製。
- 接著,請在 Postman 中選取 Headers,並在 Key 值填入 Ocp-Apim-Subscription-Key,Value 填上剛剛複製好的 Key。
- 切換到 Body,選擇 raw ,以及在右邊的下拉選單中選擇 JSON(application/json) 格式
- 在以下的程式碼中,貼上剛剛複製的圖片位置並複製整段程式碼貼上 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 的最大動力。