一、接入阿里云
https://vision.aliyun.com/
点击“人脸搜索1:N”
点击"立即开通":
使用阿里云APP/支付宝/钉钉扫码登录:
购买“人脸搜索1:N”能力,第一次购买,可以有5000次的免费使用:
开通完后, 在”工作台->开发能力->人脸人体->人脸数据库管理 " 添加人脸照片样本 :
上传数据库后,安装阿里云人脸识别SDK:
pip install alibabacloud_facebody20191230
导入ALIBABA_CLOUD_ACCESS_KEY_ID和 ALIBABA_CLOUD_ACCESS_KEY_SECRET环境变量:
vi ~/.bashrc #最后的结尾添加
export ALIBABA_CLOUD_ACCESS_KEY_ID="你的KEY_ID"
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="你的KEY_SECRECT"
可以拿同一人的照片和不同人的照片用官方python代码进行对比:
# -*- coding: utf-8 -*-
# 引入依赖包
# pip install alibabacloud_facebody20191230
import os
import io
from urllib.request import urlopen
from alibabacloud_facebody20191230.client import Client
from alibabacloud_facebody20191230.models import SearchFaceAdvanceRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
config = Config(
# 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
# 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
# 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
# 访问的域名
endpoint='facebody.cn-shanghai.aliyuncs.com',
# 访问的域名对应的region
region_id='cn-shanghai'
)
def alibaba_face():
search_face_request = SearchFaceAdvanceRequest()
#场景一:文件在本地
stream0 = open(r'/tmp/SearchFace.jpg', 'rb')
search_face_request.image_url_object = stream0
#场景二:使用任意可访问的url
#url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/facebody/SearchFace1.png'
#img = urlopen(url).read()
#search_face_request.image_url_object = io.BytesIO(img)
search_face_request.db_name = 'default'
search_face_request.limit = 5
runtime_option = RuntimeOptions()
try:
# 初始化Client
client = Client(config)
response = client.search_face_advance(search_face_request, runtime_option)
print(response.body)
match_list = response.body.to_map()['Data']['MatchList']
Scores = [item['Score'] for item in match_list[0]['FaceItems']] #set集合,无序不重复的数据集合
max_score = max(Scores)
# 获取整体结果
value = round(max_score,2)
return value
except Exception as error:
# 获取整体报错信息
print(error)
# 获取单个字段
print(error.code)
return 0.0
# tips: 可通过error.__dict__查看属性名称
#关闭流
#stream0.close()
if __name__ == "__main__":
alibaba_face()
一般比对成功的Python字典数据里的score会有大于0.6的值,而比对失败score普遍低于0.1。
例如下面是比对成功的数据:
{'Data': {'MatchList': [{'FaceItems': [{'Confidence': 80.54945, 'DbName':
'default', 'EntityId': 'sfms', 'FaceId': '88665949', 'Score':
0.7572572231292725}, {'Confidence': 77.51004, 'DbName': 'default', 'EntityId':
'sfms', 'FaceId': '88665951', 'Score': 0.7193253040313721}, {'Confidence':
74.420425, 'DbName': 'default', 'EntityId': 'sfms', 'FaceId': '88665946',
'Score': 0.6665557622909546}, {'Confidence': 11.461451, 'DbName': 'default',
'EntityId': 'lyf', 'FaceId': '88657431', 'Score': 0.0663260966539383},
{'Confidence': 5.28706, 'DbName': 'default', 'EntityId': 'lyf', 'FaceId':
'88657429', 'Score': 0.030595608055591583}], 'Location': {'Height': 527, 'Width':
405, 'X': 136, 'Y': 123}, 'QualitieScore': 99.3521}]}, 'RequestId': '6DE302BB-
130A-5D3C-B83D-0937D5A257FD'}
因此,就可以利用获取的最大score的值判断是否大于0.6来判断是否比对成功。
返回数据的说明:
•Data:这是一个对象,其中包含了匹配列表的信息。
•MatchList:这是一个数组,其中包含了匹配的结果。每个元素都是一个对象,代表一个匹配项。
•FaceItems:这是一个数组,其中包含了匹配项中所有人脸的信息。每个元素都是一个对象,包含了一些关于该人脸的信息,如自信度(Confidence)、数据库名(DbName)、实体ID(EntityId)、面部ID(FaceId)和分数(Score)。
•Location:这是一个对象,包含了人脸在原始图像中的位置信息,包括宽度(Width)、高度(Height)、左上角的x坐标(X)和y坐标(Y)。
•QualitieScore:这是一个浮点数,表示了整个匹配过程的质量得分。
二、C语言调用阿里云人脸识别接口
face.c
#include <Python.h>
void face_init(void)
{
Py_Initialize();
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyUnicode_FromString("."));
}
void face_final(void)
{
Py_Finalize();
}
double face_category(void)
{
PyObject *pModule = PyImport_ImportModule("face"); //加载face.py
if (!pModule){
PyErr_Print();
printf("Error: failed to load face.py\n");
goto FAILED_MODULE;
}
PyObject *pFunc = PyObject_GetAttrString(pModule, "alibaba_face"); //加载alibaba_face函数
if (!pFunc){
PyErr_Print();
printf("Error: failed to load alibaba_face\n");
goto FAILED_FUNC;
}
PyObject *pValue = PyObject_CallObject(pFunc, NULL); //调用alibaba_face函数
if (!pValue){
PyErr_Print();
printf("Error: function call failed\n");
goto FAILED_VALUE;
}
double result = 0.0;
if (!PyArg_Parse(pValue, "d", &result)){ //解析获取调用alibaba_face函数返回值,装换成C语言格式
PyErr_Print();
printf("Error: parse failed");
goto FAILED_RESULT;
}
printf("result=%.2lf\n",result);
FAILED_RESULT:
Py_DECREF(pValue);
FAILED_VALUE:
Py_DECREF(pFunc);
FAILED_FUNC:
Py_DECREF(pModule);
FAILED_MODULE:
return result;
}
face.h
#ifndef __FACE__H
#define __FACE__H
void face_init(void);
void face_final(void);
double face_category(void);
#endif
main.c
#include <stdio.h>
#include <Python.h>
#include "face.h"
int main(int argc,char *argv)
{
double face_result = 0.0;
face_init();
face_result = face_category();
printf("face_result=%.2lf\n",face_result);
face_final();
}
运行结果:(-0.06因为本地照片和数据库存储的照片不是同一个人)