Day 16 Azure cognitive service: Face recognition- 让你的机器人认得你

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)

可以辨识人脸之後,就可以做出人脸登入的效果,这会需要把侦测的结果纪录下来,一般会记录在资料库之中。下一篇,介绍一个过去我曾经用过的做法。


<<:  Day2 跟着官方文件学习Laravel-环境设定

>>:  Day 03 - 任你存S3

Day 26 -- 3 Steps 部署Sidekiq 背景任务在 Heroku

实作之前准备: 一个在 Heroku 的基本 rails 专案 阅读:实作开发模式 Action M...

文书编辑器_vi

前面提到 我在python上面可以很快的去控制GPIO 可是C呢? 在这Linux的环境下,没有ID...

Day 14-for (i=0; i < 100; i++) createVM(i); infrastructure 也可以 for each 之一

infrastructure 也可以 for each 之一 课程内容与代码会放在 Github 上...

android studio 30天学习笔记-day 21 -获得日期

一般在使用资料库新增资料的时候,都会看到新建资料的日期跟时间,今天会再sqllite上加入日期。 我...

Day 18-更改 state 有其风险,State manipulation 有赚有赔(?),更改前应详阅官方文件说明书

更改 state 有其风险,State manipulation 有赚有赔(?),更改前应详阅官方文...