【案例共创】基于开发者空间通过 FRS 实现考勤系统人脸匹配功能

最新案例动态,请查阅【案例共创】基于开发者空间通过FRS实现考勤系统人脸匹配功能。小伙伴们快来领取华为开发者空间进行实操吧!
本案例由开发者:DS 小龙哥提供
1 概述
1.1 背景介绍
人脸识别服务FRS基于人的脸部特征信息,利用计算机对人脸图像进行处理、分析和理解,用户通过实时访问和调用 API 获取人脸处理结果,帮助用户自动进行人脸的识别、比对以及相似度查询等。 FRS 服务提供了开放 API 接口,提供人脸识别能力,用户可以直接调用 API 接口访问华为云人脸识别服务,完成人脸识别后返回的结果为 JSON 格式,用户通过 API 接口与人脸识别服务交互,就可以完成项目开发。
本案例主要讲述在开发者空间通过 API 调用华为云人脸识别服务 FRS 实现考勤系统的人脸匹配功能。
通过本案例可以学习到如何在开发者空间使用 FRS 服务,完成人脸库创建,向人脸库添加人脸,在人脸库里搜索匹配的人脸完成人脸对比等几个主要功能。 只要完成了这几个功能,就可以开发成品软件,完成很多需要人脸服务的场景,行业的项目落地。 比如:人脸识别考勤、人脸识别签到、人脸门禁开锁 等等场景。
1.2 适用对象
企业
个人开发者
高校学生
1.3 案例时间
本案例总时长预计 90 分钟。
1.4 案例流程
说明:
登录华为云账号后进入开发者空间,领取并配置云主机;
环境准备,在云主机上安装必要的开发工具和依赖库,比如 Python 及其相关库 requests 等,以便调用华为云 API;
获取 API 凭证,在华为云平台上创建并获取 Access Key ID 和 Secret Access Key,用于身份验证。
部署与优化,根据实际应用场景将开发完成的人脸识别解决方案部署到生产环境中,并持续优化性能和用户体验。
2 开发者空间环境准备
2.1 配置云主机
本案例中,需要调用人脸识别服务 FRS 的接口来实现对应的功能,需要安装 requests 库。
说明:
requests 库是一个非常强大的工具,它允许你发起 HTTP 请求,这个模块可以让你用简单的代码完成大部分的 HTTP 操作。
登录华为开发者空间,登录后页面如下:
点击“配置云主机”,会弹出对话框,进行云主机配置。
按如规格下配置云主机:
云主机名称:默认/自定义
CPU 架构:X86
规格:2 vCPUs 4 GB
操作系统:Ubuntu
系统镜像:公共镜像 Ubuntu 22.04 server 64bit (xfce4 desktop)
确认以上配置无误,点击“安装”,进行云主机操作系统安装。安装完毕之后,点击“进入桌面”。
环境准备中,大约需要 3-5 分钟,请您耐心等待…
进入桌面后的默认效果如下:
点击左下角的“所有应用程序”->“开发”->“CodeArts IDE for Python”,打开 IDE。
CodeArts IDE for Python 启动后,在弹框界面,选择“新建工程”。
在新建工程页面,自定义输入工程名称,点击“创建”。
在 CodeArts IDE for Python 中,在新建的工程文件目录中,选择“venv/lib/python3.10/site-packages”路径下的任一文件,单击鼠标右键后,选择“打开所在文件夹”。
复制被打开的文件夹路径。
在 CodeArts IDE for Python 中,点击下方的“终端”,输入以下命令后回车,安装 requests 库:
其中{package-path}用上一步中复制的文件夹路径替换。
到此,云主机的开发环境配置完成。
2.2 开通人脸识别服务
进入人脸识别服务控制台,区域选择“华北-北京四”,分别点击下图中所示产品的“开通服务”。
开通后,如下图所示:
点击对应的“接口文档”,可已快速查阅对应产品的接口使用说明。
3 获取 Token 鉴权
华为云人脸识别服务 FRS 服务的 API 调用,需要通过用户 Token 进行用户鉴权,所以接口调用前,需要先获取用户的 Token。
获取 Token 鉴权,同样需要接口调用,详细请参考:获取IAM用户Token(使用密码)。
获取的 Token 有效性说明:
Token 的有效期为 24 小时。建议进行缓存,避免频繁调用。使用 Token 前请确保 Token 离过期有足够的时间,防止调用 API 的过程中 Token 过期导致调用 API 失败。重新获取 Token,不影响已有 Token 有效性。
3.1 编写获取 Token 代码
在 CodeArts IDE for Python 中,点击“文件”->“新建”->“文件”。
点击“文件”->“保存”。
输入文件名称为“get_token.py”,点击“保存”。
在 get_token.py 文件中输入以下代码(复制文档中 python 代码时,可能会导致格式错误,可以点击下载获取 get_token.py 文件内容!),用于获取用户 Token:
代码说明:
依赖库:使用 requests 库发起 HTTP 请求。 如果没有安装,在运行代码前,请参考步骤 2.1 安装依赖库。
主要逻辑:构造请求头和请求体。发起 POST 请求,获取响应。从响应头中提取 X-Subject-Token 并保存到本地文件。
TOKEN 保存: TOKEN 被保存到 token.txt 文件中,方便后续直接读取使用。
参数值填写:代码运行前,请将参数代码中的参数值设置为真实的账号信息,获取方式:进入我的凭证页面,参数:“MAIN_USER”、“IAM_USER”、“PROJECT_ID”的值按下图所示进行获取,参数“IAM_PASSWORD”的值为该账号的登录密码。
注意:本案例中使用“华北-北京四”对应的项目 ID。
3.2 调试运行获取 Token 代码
按上述步骤编写好代码后,在 CodeArts IDE for Python 中,get_token.py 文件页面,点击右上角的绿色三角形按钮,运行代码。 得到了 Token 然后保存到本地文件里。
4 创建人脸库
如果我们要做考勤系统、签到系统,那么设计之前需要创建人脸库,录入每个人员的人脸信息,才可以设计后面的考勤,签到的人脸对比识别功能。创建人脸库的 API 调用可参考:创建人脸库。
4.1 准备测试图片
打开文件管理器,在/home/developer 目录下创建一个 image 文件夹。
然后打开浏览器,搜索图片。
下载 2 张图片到/home/developer/image/路径下,并将图片重命名为“1.jpeg”和“2.jpeg”。
4.2 编写创建人脸库代码
在 CodeArts IDE for Python 中,重新新建一个 face-set.py 文件。用于编写创建人脸库代码。
在 face-set.py 文件中输入如下代码(复制文档中 python 代码时,可能会导致格式错误,可以点击下载获取 face-set.py 文件内容!):
代码说明:
以上是用 Python 实现的创建人脸库代码,使用 requests 库来发出 HTTP 请求。
PROJECT_ID 替换为实际账号的项目 ID,可参考 3.1。
代码从本地文件 token.txt 中读取认证 Token。
face_1 是创建的人脸库名称,可自定义修改。
4.3 终端运行调试
按上述步骤编写好代码后,在 CodeArts IDE for Python 中,face-set.py 文件页面,点击右上角的绿色三角形按钮,运行代码。
face-set.py 文件运行后,接口返回的结果如下:
根据返回的 JSON 响应数据以及华为云人脸识别服务 FRS 的文档说明,下面是 JSON 数据信息的总结:
face_set_info:包含了创建的人脸库的具体信息。
face_number:人脸库中已有的人脸特征数量。当前值为 0,表示刚刚创建的人脸库还没有添加任何人脸特征。
face_set_id:人脸库的唯一标识符,随机生成的字符串。这里的 ID 是 tKzQuUW4。
face_set_name:用户指定的人脸库名称。这里命名为 face_1。
create_date:人脸库的创建时间。这里是 2024-11-28 08:41:49(UTC+08:00)。
face_set_capacity:人脸库的最大容量。默认情况下为 100,000 个人脸特征,这里显示的也是 100,000。
external_fields:用户自定义字段的信息。
face_name:类型为 string,用于存储人脸名称。
face_phone:类型为 string,用于存储电话号码。
face_class:类型为 string,用于存储人脸分类信息。
JSON 响应表明成功创建了一个名为 face_1 的人脸库,该库的 ID 是 tKzQuUW4,创建于 2024 年 11 月 28 日 08:41:49,并且设置了三个自定义字段(face_name、face_phone 和 face_class),每个字段的类型都是 string。目前该人脸库尚未添加任何人脸特征。
5 向人脸库添加人脸
添加人脸到人脸库中,是将单张图片中的人脸添加至人脸库中,支持添加最大人脸或所有人脸。添加人脸到人脸库中的 API 调用可参考:添加人脸。
5.1 编写添加人脸代码
在 CodeArts IDE for Python 中,重新新建一个 face-sets_lib.py 文件。用于编写添加人脸代码。
在 face-sets_lib.py 文件中输入如下代码(复制文档中 python 代码时,可能会导致格式错误,可以点击下载获取 face-sets_lib.py 文件内容!):
代码说明:
运行代码时,替换替换'/home/developer/image/1.jpeg',"face_1"和"xiaolong"为你实际的图片地址,人脸库名称和自定义字段值。
PROJECT_ID 替换为实际账号的项目 ID,可参考 3.1。
代码从本地文件 token.txt 中读取认证 Token,并从指定路径读取图片进行 Base64 编码。
5.2 终端运行调试
按上述步骤编写好代码后,在 CodeArts IDE for Python 中,face-sets_lib.py 文件页面,点击右上角的绿色三角形按钮,运行代码。
face-sets_lib.py 文件运行后,接口返回的结果如下:
根据返回的 JSON 响应数据以及华为云人脸识别服务 FRS 的文档,以下是 JSON 数据信息的总结:
face_set_id:人脸库的唯一标识符。这里的 ID 是 tKzQuUW4。
face_set_name:人脸库的名称。这里是 face_1。
faces:一个数组,包含了成功添加到人脸库中的人脸信息。
face_id:系统生成的唯一标识符,用于标识该人脸。这里的 ID 是 1cOqkdyg。
external_image_id:用户指定的图片外部 ID,与当前图像绑定。这里的 ID 是 JAHIqXTA。
bounding_box:描述了人脸在图像中的位置。
width:矩形框的宽度。这里是 148 像素。
top_left_x:矩形框左上角的横坐标。这里是 358 像素。
top_left_y:矩形框左上角的纵坐标。这里是 428 像素。
height:矩形框的高度。这里是 188 像素。
external_fields:用户自定义字段的信息。
face_name:自定义字段 face_name 的值,这里是 xiaolong。
这个 JSON 响应表明成功将一张包含人脸的图片添加到了名为 face_1 的人脸库中。人脸库的 ID 是 tKzQuUW4。添加的人脸具有以下特征:
人脸 ID 为 1cOqkdyg。
图片外部 ID 为 JAHIqXTA。
人脸在图片中的位置由矩形框表示,宽度为 148 像素,高度为 188 像素,左上角坐标为(358, 428)。
自定义字段 face_name 的值为 xiaolong。
6 从人脸库匹配人脸
人脸搜索是指在已有的人脸库中,查询与目标人脸相似的一张或者多张人脸,并返回相应的置信度。如果图片中包含多个人脸,选取图片中检测到的最大尺寸人脸作为检索的输入。 支持传入图片或者 faceID 进行人脸搜索。从人脸库匹配人脸的 API 调用可参考:搜索人脸。
6.1 编写匹配人脸代码
在 CodeArts IDE for Python 中,重新新建一个 face-sets_search.py 文件。用于编写匹配人脸代码。
在 face-sets_search.py 文件中输入如下代码(复制文档中 python 代码时,可能会导致格式错误,可以点击下载获取 face-sets_search.py 文件内容!):
代码说明:
替换'/home/developer/image/1.jpeg'和'face_1'为实际的图片路径和人脸库名称。
确保在调用此脚本之前,已正确配置好 token.txt 文件,并且该文件位于与脚本相同的目录下。
PROJECT_ID 替换为实际账号的项目 ID,可参考 3.1。
6.2 终端运行调试
按上述步骤编写好代码后,在 CodeArts IDE for Python 中,face-sets_search.py 文件页面,点击右上角的绿色三角形按钮,运行代码。
face-sets_search.py 文件运行后,接口返回的结果如下:
根据返回的 JSON 响应数据以及华为云人脸识别服务 FRS 的文档,以下是 JSON 数据信息的总结:
faces:一个数组,包含了搜索到的人脸信息。
face_id:系统生成的唯一标识符,用于标识该人脸。这里的 ID 是 1cOqkdyg。
external_image_id:用户指定的图片外部 ID,与当前图像绑定。这里的 ID 是 JAHIqXTA。
bounding_box:描述了人脸在图像中的位置。
width:矩形框的宽度。这里是 148 像素。
top_left_x:矩形框左上角的横坐标。这里是 358 像素。
top_left_y:矩形框左上角的纵坐标。这里是 428 像素。
height:矩形框的高度。这里是 188 像素。
external_fields:用户自定义字段的信息。
face_name:自定义字段 face_name 的值,这里是 xiaolong。
similarity:人脸搜索时的相似度分数。这里的值为 1.0,表示完全匹配。
这个 JSON 响应表明成功搜索到了一张人脸,并且该人脸与人脸库中的一张人脸完全匹配。
人脸 ID 为 1cOqkdyg。
图片外部 ID 为 JAHIqXTA。
人脸在图片中的位置由矩形框表示,宽度为 148 像素,高度为 188 像素,左上角坐标为(358, 428)。
自定义字段 face_name 的值为 xiaolong。
相似度分数为 1.0,表示完全匹配。
7 图形化项目开发
为了更方便直观的展示项目的整体功能,接下来进行图形化界面的开发。
7.1 安装 Tkinter 和 Pillow 库
说明:
Pillow 是 PIL(Python Imaging Library)的一个分支,它提供了广泛的文件格式支持、强大的图像处理能力,主要包括图像存储、图像显示、格式转换以及基本的图像处理操作等。
在 Python 中, Tkinter 用于创建图形用户界面(GUI)。这是 Python 的标准 GUI 库。
在 CodeArts IDE for Python 中,点击下方的“终端”,输入以下命令后回车,安装 Tkinter:
继续在“终端”中执行以下命令,安装 Pillow 库:
其中{package-path}用安装包文件夹路径替换,获取方式同步骤 2.1 安装 requests 的安装路径。
7.2 图形化界面设计
在 CodeArts IDE for Python 中,重新新建一个 face_detect_tkinter.py 文件。用于编写人脸匹配图形化界面代码。
在 face_detect_tkinter.py 文件中输入如下代码(复制文档中 python 代码时,可能会导致格式错误,可以点击下载获取 face_detect_tkinter.py 文件内容!):
代码说明:
以上是用 Python 实现的人脸库创建、添加人脸到库及匹配人脸的图形化界面代码,使用 tkinter 库来实现图形化界面。
依赖库:
使用 tkinter 图形化界面。
使用 PIL 实现图像显示、格式转换。
确保安装了依赖库:pip3 install Pillow --target={package-path}。
确保安装了依赖库:sudo apt-get -y install python3-tk。
待实现代码:
点击“创建人脸”、“添加人脸到库”和“搜索匹配人脸”按钮,会提示“XXX 功能待实现!”。
开发者可结合步骤 4,5,6 中实现的对应功能来实现该功能,案例中不再扩展。
代码补齐后,实现效果如下图所示:
按上述步骤编写好代码后,在 CodeArts IDE for Python 中,face_detect_tkinter.py 文件页面,点击右上角的绿色三角形按钮,运行代码。运行效果如下图所示:
至此,基于开发者空间通过 FRS 实现考勤系统人脸匹配功能实践全部完毕。







评论