人脸辨识也是 Azure 电脑视觉的其中一个功能,但或许因为其特殊性,人脸辨识的功能又被分出来,独立成另一个服务- Face。人脸辨识的技术其实发展已久,是个成熟的技术,已经围绕在一般人的身边,手机解锁、门禁管理和海关的自动通关,都是人脸辨识的应用。
人脸辨识的过程可以拆成几个部分实现,一开始需要 server 端将需要辨识的人脸编码,取得特徵向量,将特徵向量与人脸的身份配对存入资料库。而用户端可透过摄影机取得人脸影像,将人脸转换成特徵向量,然後与资料库的特徵向量比对,找出最相近的特徵向量,最後带出相对应的身份。
再稍微细分一点,人脸辨识的过程,首先会需要侦测人脸,撷取人脸的影像,侦测人脸上的特徵点 (face landmarks),然後将人脸旋转校正对齐,再将人脸影像的尺寸重新调整成均一大小,最後转换成特徵向量。其中,侦测人脸的方法、face landmarks的数量、转换特徵向量的做法,每家做法都不同,各有各的门道。
Azure 脸部服务,大致上分成人脸侦测和人脸辨识,在後续的实作上会先执行人脸侦测,然後再辨识侦测到的人脸是谁。在人脸侦测的部分,除了找出人脸的位置,同时也可以取得脸部特徵点(face landmarks)和脸部属性(Attribution)。
Face Landmark
这边拿我的脸示范一下。
Face Attribution
以下列举目前 Azure 可以侦测的各项脸部属性。
基本资料
毛发
动作与表情
装饰
脸部完整程度
影像品质
pip3.7 install azure-cognitiveservices-vision-face
这边针对人脸辨识的需求作示范。首先我们会先建立 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)
人脸辨识所需要用到的照片需要符合以下需求:
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)
可以辨识人脸之後,就可以做出人脸登入的效果,这会需要把侦测的结果纪录下来,一般会记录在资料库之中。下一篇,介绍一个过去我曾经用过的做法。
实作之前准备: 一个在 Heroku 的基本 rails 专案 阅读:实作开发模式 Action M...
前面提到 我在python上面可以很快的去控制GPIO 可是C呢? 在这Linux的环境下,没有ID...
infrastructure 也可以 for each 之一 课程内容与代码会放在 Github 上...
一般在使用资料库新增资料的时候,都会看到新建资料的日期跟时间,今天会再sqllite上加入日期。 我...
更改 state 有其风险,State manipulation 有赚有赔(?),更改前应详阅官方文...