16.阿里云人脸识别方案

阿里云人脸识别方案

阿里云方案官网: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=<access_key_id> 
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<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"Score0.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 <Python.h>
#include <string.h>
#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 <stdio.h>
#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
posted @ 2025-05-29 11:39  站着说话不腰疼  阅读(178)  评论(0)    收藏  举报