阿里云人脸识别方案
阿里云方案官网:https://vision.aliyun.com/
人脸识别:https://vision.aliyun.com/experience/detail?spm=a2cvz.27717767.J_4147124680.37.66cd34cf4gh9Xn&tagName=facebody&children=SearchFace
1.搜索选择人脸搜索 1:N方案
选择立即开通
2.打开技术文档
https://help.aliyun.com/zh/viapi/developer-reference/face-search-1-n-2/
点击人脸搜索,根据指引完成
3.人脸人体开发平台
https://vision.console.aliyun.com/cn-shanghai/detail/facebody
购买人脸人体->人脸搜索服务
增加人脸识别数据库
增加样品,添加合适的人脸照片
4.查询人脸样本
4.1选择人脸搜索1:N
https://help.aliyun.com/zh/viapi/use-cases/face-search-1-n?spm=a2c4g.11186623.0.i5#undefined
4.2.SDK安装
https://help.aliyun.com/zh/viapi/developer-reference/the-sdk-overview?spm=a2c4g.11186623.0.0.495afe313sIG1B
选择自己要接入的语言,这里选python接入
安装SDK
生成专区:pip install alibabacloud_aigen20240111
人脸人体:pip install alibabacloud_facebody20191230
文字识别:pip install alibabacloud_ocr20191230
商品理解:pip install alibabacloud_goodstech20191230
内容审核:pip install alibabacloud_imageaudit20191230
图像识别:pip install alibabacloud_imagerecog20190930
图像生产:pip install alibabacloud_imageenhan20190930
分割抠图:pip install alibabacloud_imageseg20191230
目标检测:pip install alibabacloud_objectdet20191230
图像分析处理:pip install alibabacloud_imageprocess20200320
视觉搜索:pip install alibabacloud_imgsearch20200320
视频理解:pip install alibabacloud_videorecog20200320
视频生产:pip install alibabacloud_videoenhan20200320
视频分割:pip install alibabacloud_videoseg20200320
异步任务管理:pip install alibabacloud_viapi20230117
人脸核身服务端20200910专用版本:pip install alibabacloud_facebody20200910
这里选择的是人脸人体
pip install alibabacloud_facebody20191230
4.3.环境变量配置
将创建好的ACCESS_KEY配置到上面
export ALIBABA_CLOUD_ACCESS_KEY_ID=
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=
export查看是否配置上去
配置全局的:
vi ~/.bashrc 和 /etc/profile #然后在末尾输入上面两行后保存
4.4.示例代码
https://help.aliyun.com/zh/viapi/use-cases/the-face-of-a-search-1?spm=a2c4g.11186623.0.0.75515e90bacsqO
选择文件在上海地域OSS
是通过本地照片,所以开启场景一,屏蔽场景二
数据库实例是default,修改成search_face_request.db_name = 'default'
face.py:
# -*- 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'
)
search_face_request = SearchFaceAdvanceRequest()
#场景一:文件在本地
stream0 = open(r'/tmp/SearchFace.jpg', 'rb')
search_face_request.image_url_object = stream0
#场景二:使用任意可访问的url
#url = 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/facebody/SearchFace/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)
except Exception as error:
# 获取整体报错信息
print(error)
# 获取单个字段
print(error.code)
# tips: 可通过error.__dict__查看属性名称
#关闭流
#stream0.close()
4.5.上传图片测试
python3.10 face.py
返回值:
{'Data': {'MatchList': [{'FaceItems': [{'Confidence': 89.856094, 'DbName': 'default', 'EntityId': 'lyf', 'FaceId': '259542194', 'Score': 0.8734040260314941}, {'Confidence': 84.14077, 'DbName': 'default', 'EntityId': 'lyf', 'FaceId': '259542199', 'Score': 0.8020768165588379}, {'Confidence': 27.265448, 'DbName': 'default', 'EntityId': 'ysy', 'FaceId': '259542245', 'Score': 0.15778201818466187}, {'Confidence': 25.78278, 'DbName': 'default', 'EntityId': 'ysy', 'FaceId': '259542248', 'Score': 0.14920198917388916}, {'Confidence': 22.197176, 'DbName': 'default', 'EntityId': 'ysy', 'FaceId': '259542278', 'Score': 0.12845250964164734}], 'Location': {'Height': 540, 'Width': 397, 'X': 845, 'Y': 397}, 'QualitieScore': 99.468575}]}, 'RequestId': '21432012-9F5A-5319-A257-D75CF9E341B4'}
(1)FaceItems(匹配到的人脸信息)
每个 FaceItems 表示数据库中和当前人脸相似的结果,按相似度(Score)降序排列:
字段
示例值
说明
Confidence
89.856094
置信度(百分比,越高越可信)
DbName
"default"
匹配的人脸所属的数据库名
EntityId
"lyf"
人员ID(如用户注册时提交的ID)
FaceId
"259542194"
人脸在数据库中的唯一ID
Score
0.873404
相似度得分(0~1,越接近1越相似)
示例解读:
第一项 "lyf" 的 Score 是 0.873(87.3% 相似),置信度 89.85%,很可能是同一个人。
后三项 "ysy" 的 Score 均低于 0.2,可能是误匹配。
(2)Location(人脸位置)
表示人脸在图片中的位置(像素坐标):
"Location": {
"Height": 540, // 人脸区域高度
"Width": 397, // 人脸区域宽度
"X": 845, // 左上角X坐标(距图片左侧)
"Y": 397 // 左上角Y坐标(距图片顶部)
}
可通过该信息在图片上绘制人脸框。
(3)QualitieScore(人脸质量)
99.468575 表示人脸质量很高(清晰度、光照、角度等均较好)。
(4)官网返回值说明:
返回数据
名称
类型
示例值
描述
名称
类型
示例值
描述
RequestId
String
4159e64a-0fe8-436c-a8de-ee531555db3c
请求ID。
Data
Object
返回的结果数据内容。
MatchList
Array of MatchList
匹配的结果列表,如果输入图像中多个人脸,则这里会返回多个数据。
FaceItems
Array of FaceItems
匹配的人脸数据列表。
EntityId
String
U1
实体ID,用来标识用户的唯一性,如用户ID、员工ID等。每个实体可包含多张人脸图片。支持大小写字母、数字、下划线和减号的组合,长度为2~64。
FaceId
String
001
人脸图片数据ID,需要全局唯一,不可重复。支持小写字母、数字和下划线的组合。长度为1~64。
Score
Float
0.892133
人脸的相似度,取值范围-1.0~1.0,取小数点后6位,数值越大相似度越高。建议的三个参考阈值为0.35,0.45和0.6,分别对应千分之一,万分之一和十万分之一的误识率。阈值设置越高,误识率越低,通过率也越低,对安全性要求越高的场合,可以设置越高的阈值。
ExtraData
String
王小二
自定义信息(字符串)。支持字母、数字、标点符号和汉字。不超过512个字符。
DbName
String
default
数据库名称。
Confidence
Float
36.820168
转换后的置信度 ,取值范围0.0~100.0,数值越大相似度越高,建议的三个参考阈值为60.48,67.87和72.62,分别对应千分之一,万分之一和十万分之一的误识率,阈值设置越高,误识率越低,通过率也越低,对安全性要求越高的场合,可以设置越高的阈值。
Location
Object
输入图像中的人脸坐标信息。
Width
Integer
200
宽度,单位像素。
Height
Integer
200
高度,单位像素。
Y
Integer
6
左上角y坐标。
X
Integer
5
左上角x坐标。
QualitieScore
Float
71.7349
输入图像中的人脸质量分。
5.C语言对接python
face.py
# -*- 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 = 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/facebody/SearchFace/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)
print("======================")
match_list = response.body.to_map()['Data']['MatchList']
scores = [item['Score'] for item in match_list[0]['FaceItems']] #set集合,无序不重复
maxScores = max(scores)
print(f"最大 Score 值: {maxScores}")
value = round(maxScores,2)
print(value)
print("======================")
return value;
except Exception as error:
# 获取整体报错信息
print(error)
# 获取单个字段
print(error.code)
# tips: 可通过error.__dict__查看属性名称
return 0.0
#关闭流
#stream0.close()
if __name__ == "__main__":
alibaba_face()
face.c
#include
#include
#include "face.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_identify(void)
{
PyObject *pModule = PyImport_ImportModule("face");
if(!pModule)
{
PyErr_Print();
printf("Error:failed to load face.py\n");
goto FAILED_MODULE;
}
PyObject *pFunc = PyObject_GetAttrString(pModule,"alibaba_face");
if(!pFunc)
{
PyErr_Print();
printf("Error:failed to load func alibaba_face\n");
goto FAILED_FUNC;
}
PyObject *pValue = PyObject_CallObject(pFunc,NULL);
if(!pValue){
PyErr_Print();
printf("Error:function call failed\n");
goto FAILED_VALUE;
}
double result = 0.0;
if(!PyArg_Parse(pValue,"d",&result)){
PyErr_Print();
printf("Error: parse failed");
goto FAILED_VALUE;
}
printf("result:%lf\n",result);
FAILED_VALUE:
Py_DECREF(pValue);
FAILED_FUNC:
Py_DECREF(pFunc);
FAILED_MODULE:
Py_DECREF(pModule);
return result;
}
face.h
#ifndef __FACE__H
#define __FACE__H
void face_init(void);
void face_final(void);
double face_identify(void);
#define WGET_CMD "wget http://127.0.0.1:8080/?action=snapshot -O /tmp/SearchFace.jpg"
#define CATEGORY_FILE "/tmp/SearchFace.jpg"
#endif
main.c
#include
#include "face.h"
int main(int argc, char *argv[])
{
double face_result = 0.0;
face_init();
face_result = face_identify();
printf("face_result: %0.2lf \n",face_result);
face_final();
return 0;
}
编译:
gcc -o face *.c *.h -I /usr/include/python3.10 -l python3.10