iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0

Azure face service: Face recognition- 讓你的機器人認得你

人臉辨識也是 Azure 電腦視覺的其中一個功能,但或許因為其特殊性,人臉辨識的功能又被分出來,獨立成另一個服務- Face。人臉辨識的技術其實發展已久,是個成熟的技術,已經圍繞在一般人的身邊,手機解鎖、門禁管理和海關的自動通關,都是人臉辨識的應用。

人臉辨識的過程可以拆成幾個部分實現,一開始需要 server 端將需要辨識的人臉編碼,取得特徵向量,將特徵向量與人臉的身份配對存入資料庫。而用戶端可透過攝影機取得人臉影像,將人臉轉換成特徵向量,然後與資料庫的特徵向量比對,找出最相近的特徵向量,最後帶出相對應的身份。

再稍微細分一點,人臉辨識的過程,首先會需要偵測人臉,擷取人臉的影像,偵測人臉上的特徵點 (face landmarks),然後將人臉旋轉校正對齊,再將人臉影像的尺寸重新調整成均一大小,最後轉換成特徵向量。其中,偵測人臉的方法、face landmarks的數量、轉換特徵向量的做法,每家做法都不同,各有各的門道。

Azure 臉部服務,大致上分成人臉偵測和人臉辨識,在後續的實作上會先執行人臉偵測,然後再辨識偵測到的人臉是誰。在人臉偵測的部分,除了找出人臉的位置,同時也可以取得臉部特徵點(face landmarks)和臉部屬性(Attribution)。

Face Landmark

這邊拿我的臉示範一下。

Face Attribution

以下列舉目前 Azure 可以偵測的各項臉部屬性。

  • 基本資料

    • age - 年紀
    • gender - 性別
  • 毛髮

    • hair - 是否禿頭;是否露出頭髮;髮色
    • facialHair - 八字鬍、山羊鬍、鬢角
  • 動作與表情

    • headPose - 頭部姿勢,詳細圖解在此
    • smile - 微笑的程度
    • emotion - 偵測快樂、悲傷、中性、生氣、蔑視、厭惡、驚喜和恐懼等情緒,顯示的數值表示預測的信心程度
  • 裝飾

    • glasses - 是否戴眼鏡
    • accessories - 是否有飾品
    • makeup - 是否有眼妝或唇妝
  • 臉部完整程度

    • exposure - 露臉的程度
    • occlusion - 眼睛、額頭、嘴巴是否被擋住
  • 影像品質

    • noise - 照片雜訊多寡
    • blur - 臉部模糊的程度

申請 Azure 臉部服務

  1. 進入https://portal.azure.com/#home 。
  2. 點選建立資源
  3. 搜尋並選擇 face
  4. 自行命名
  5. 找到可以選擇定價層 Free F0 的區域,並選擇 Free F0。
  6. 給予標籤
  7. 檢閱 + 建立

安裝 Python Package

pip3.7 install azure-cognitiveservices-vision-face

金鑰與端點

  • 進入https://portal.azure.com/#home 。
  • 點選所有資源。
  • 點選剛剛建立的臉部服務。
  • 點選金鑰與端點
  • 複製金鑰與端點

示範程式

這邊針對人臉辨識的需求作示範。首先我們會先建立 Person Group ,並且註冊人臉,第二步則是利用建立好的 Person Group 辨識人臉。

註冊人臉

import sys
import time
from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
from azure.cognitiveservices.vision.face.models import TrainingStatusType
KEY = "YOUR KEY"
ENDPOINT = "YOR ENDPOINT"
FACE_CLIENT = FaceClient(
  ENDPOINT, CognitiveServicesCredentials(KEY))

# 先建立 Person Group
PERSON_GROUP_ID = "請自行命名"
FACE_CLIENT.person_group.create(
  person_group_id=PERSON_GROUP_ID, name=PERSON_GROUP_ID)
  
  
# 在 Person Group 中新增一人

person = FACE_CLIENT.person_group_person.create(
  PERSON_GROUP_ID, "YOUR NAME")

# 新增照片給指定之人

my_pic = open("YOUR PHOTO", 'r+b')
FACE_CLIENT.person_group_person.add_face_from_stream(
  PERSON_GROUP_ID, person.person_id, my_pic)

# 開始訓練,一開始放進去的照片量較大的話,會需要較長時間,可以透過 get_training_status 確認當下狀態

FACE_CLIENT.person_group.train(PERSON_GROUP_ID)

while (True):
    training_status = FACE_CLIENT.person_group.get_training_status(PERSON_GROUP_ID)
    print("Training status: {}.".format(training_status.status))
    print()
    if (training_status.status is TrainingStatusType.succeeded):
        break
    elif (training_status.status is TrainingStatusType.failed):
        sys.exit('Training the person group has failed.')
    time.sleep(5)

照片限制

人臉辨識所需要用到的照片需要符合以下需求:

  • 影像格式:JPEG、PNG、GIF、BMP。
  • 影像大小介於 1 KB 和 6 MB 之間。
    • 臉部大小應介於 36x36 和 4096x4096 pixels。
    • 如果臉部大小為 36x36 pixels ,照片不可以超過 1920x1080 pixels。
  • 盡量搜集各種角度、照明程度的照片。
  • 一個人可以有248個臉部照片,每張照片都應該只有一張臉,不可以無臉。
  • 有些照片無法辨識:
    • 太亮的影像,例如嚴重的背光。
    • 眼睛被擋住。
    • 臉型或髮型改變。
    • 臉部外觀因為年齡的變化。
    • 極端臉部表情。
    • 頭部動作太大。

辨識人臉

img = open("YOUR PHOTO", "r+b")
detected_face = FACE_CLIENT.face.detect_with_stream(
    img, detection_model="detection_01"
)
# 臉部服務會給每一張偵測到的臉一個face ID
results = FACE_CLIENT.face.identify([detected_face[0].face_id], PERSON_GROUP_ID)
result = results[0].as_dict()

# 如果在資料庫中有找到相像的人,會給予person ID
# 再拿此person ID去查詢名字
person = FACE_CLIENT.person_group_person.get(
        PERSON_GROUP_ID, result["candidates"][0]["person_id"]
)
print(person.name)

可以辨識人臉之後,就可以做出人臉登入的效果,這會需要把偵測的結果紀錄下來,一般會記錄在資料庫之中。下一篇,介紹一個過去我曾經用過的做法。


上一篇
Day 15 Chatbot integration- 韓文翻譯機器人
下一篇
Day 17 Azure Cosmos DB API for MongoDB- 找個地方放資料
系列文
我不太懂 AI,可是我會一點 Python 和 Azure30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言