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

最新案例动态,请查阅【案例共创】基于开发者空间通过FRS实现考勤系统人脸匹配功能。小伙伴们快来领取华为开发者空间进行实操吧!

本案例由开发者:DS小龙哥提供

1 概述

1.1 背景介绍

人脸识别服务FRS基于人的脸部特征信息,利用计算机对人脸图像进行处理、分析和理解,用户通过实时访问和调用API获取人脸处理结果,帮助用户自动进行人脸的识别、比对以及相似度查询等。 FRS服务提供了开放API接口,提供人脸识别能力,用户可以直接调用API接口访问华为云人脸识别服务,完成人脸识别后返回的结果为JSON格式,用户通过API接口与人脸识别服务交互,就可以完成项目开发。

本案例主要讲述在开发者空间通过API调用华为云人脸识别服务FRS实现考勤系统的人脸匹配功能。

通过本案例可以学习到如何在开发者空间使用FRS服务,完成人脸库创建,向人脸库添加人脸,在人脸库里搜索匹配的人脸完成人脸对比等几个主要功能。 只要完成了这几个功能,就可以开发成品软件,完成很多需要人脸服务的场景,行业的项目落地。 比如:人脸识别考勤、人脸识别签到、人脸门禁开锁 等等场景。

1.2 适用对象

  • 企业
  • 个人开发者
  • 高校学生

1.3 案例时间

本案例总时长预计90分钟。

1.4 案例流程

说明:

  1. 登录华为云账号后进入开发者空间,领取并配置云主机;
  2. 环境准备,在云主机上安装必要的开发工具和依赖库,比如Python及其相关库requests等,以便调用华为云API;
  3. 获取API凭证,在华为云平台上创建并获取Access Key ID和Secret Access Key,用于身份验证。
  4. 部署与优化,根据实际应用场景将开发完成的人脸识别解决方案部署到生产环境中,并持续优化性能和用户体验。

1.5 资源总览

本案例预计花费总计0元。

资源名称规格单价(元)时长(分钟)
开发者空间—云主机2vCPUs 4GB Ubuntu 22.04090
人脸识别服务FRS按流量计费 月累计调用次数 < 2000次090

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库:

pip install requests --target={package-path}

其中{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:

import requests
import json
\# 主账号用户名
MAIN_USER = "[填你自己的]"
\# IAM 子账户用户名
IAM_USER = "[填你自己的]"
\# IAM 子账户密码
IAM_PASSWORD = "[填你自己的]"
\# 项目 ID
PROJECT_ID = "[填你自己的]"
\# 服务器区域代号
SERVER_ID = "cn-north-4"
\# 保存 TOKEN 的文件路径
TOKEN_FILE_PATH = "token.txt"
def get_token():
"""
功能: 获取 TOKEN 并保存到本地文件
"""
\# 请求地址
request_url = f"https://iam.{SERVER_ID}.myhuaweicloud.com/v3/auth/tokens"
\# 构造请求头
headers = {
"Content-Type": "application/json;charset=UTF-8"
}
\# 构造请求体
payload = {
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": MAIN_USER
},
"name": IAM_USER,
"password": IAM_PASSWORD
}
}
},
"scope": {
"project": {
"name": SERVER_ID
}
}
}
}
\# 发出 POST 请求
try:
response = requests.post(request_url, headers=headers, data=json.dumps(payload))
\# 打印状态码
print(f"状态码: {response.status_code}")
if response.status_code == 201:
\# 读取 X-Subject-Token 响应头
token = response.headers.get("X-Subject-Token")
\# 打印返回的数据和 Token
print(f"反馈的数据: {response.json()}")
print(f"Token: {token}")
\# 保存 TOKEN 到本地文件
if token:
save_token_to_file(token)
print(f"TOKEN 已保存到 {TOKEN_FILE_PATH}")
else:
print("未能获取到 TOKEN")
else:
print(f"获取 TOKEN 失败: {response.text}")
except Exception as e:
print(f"请求发生错误: {e}")
def save_token_to_file(token):
"""
保存 TOKEN 到本地文件
"""
try:
with open(TOKEN_FILE_PATH, "w") as file:
file.write(token)
except Exception as e:
print(f"保存 TOKEN 时发生错误: {e}")
def main():
\# 获取 TOKEN
get_token()
if \__name_\_ == "__main__":
main()

代码说明:

  • **依赖库:**使用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文件内容!):

import requests
\# 项目ID和服务器区域代号
PROJECT_ID = "[填你自己的]"
SERVER_ID = "cn-north-4"
\# 从当前目录下的token.txt文件读取Token
with open('token.txt', 'r') as file:
Token = file.read().strip()
def create_face_database(face_lib_name):
\# 设置请求地址
url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-sets"
\# 构造请求头
headers = {
"Content-Type": "application/json",
"X-Auth-Token": Token
}
\# 构造请求体
payload = {
"external_fields": {
"face_name": {"type": "string"},
"face_phone": {"type": "string"},
"face_class": {"type": "string"}
},
"face_set_name": face_lib_name
}
\# 发送POST请求
response = requests.post(url, json=payload, headers=headers)
\# 输出响应状态码及内容
print(f"Status Code: {response.status_code}")
print(f"Response: {response.json()}")
\# 调用函数创建人脸库
create_face_database("face_1")

代码说明:

以上是用 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文件运行后,接口返回的结果如下:

Response: {'face_set_info': {'face_number': 0, 'face_set_id': 'tKzQuUW4', 'face_set_name': 'face_1', 'create_date': '2024-11-28 08:41:49', 'face_set_capacity': 100000, 'external_fields': {'face_name': {'type': 'string'}, 'face_phone': {'type': 'string'}, 'face_class': {'type': 'string'}}}}

根据返回的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文件内容!):

import requests
import base64
import io
\# 项目ID和服务器区域代号
PROJECT_ID = "[填你自己的]"
SERVER_ID = "cn-north-4"
\# 从当前目录下的token.txt文件读取Token
with open('token.txt', 'r') as file:
Token = file.read().strip()
def to_base64(image_path):
"""将图片转换为Base64编码的字符串"""
with open(image_path, 'rb') as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
def register_face(image_path, face_lib, name):
\# 读取图片并进行Base64编码
img_data = to_base64(image_path)
\# 设置请求地址
url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-sets/{face_lib}/faces"
\# 构造请求头
headers = {
"Content-Type": "application/json",
"X-Auth-Token": Token
}
\# 构造请求体
payload = {
"image_base64": img_data,
"external_fields": {"face_name": name},
"single": True
}
\# 发送POST请求
response = requests.post(url, json=payload, headers=headers)
\# 输出响应状态码及内容
print(f"Status Code: {response.status_code}")
print(f"Response: {response.json()}")
\# 调用函数注册人脸
register_face("/home/developer/image/1.jpeg", "face_1", "xiaolong")

代码说明:

  • 运行代码时,替换替换’/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文件运行后,接口返回的结果如下:

Response: {'face_set_id': 'tKzQuUW4', 'face_set_name': 'face_1', 'faces': [{'face_id': '1cOqkdyg', 'external_image_id': 'JAHIqXTA', 'bounding_box': {'width': 148, 'top_left_x': 358, 'top_left_y': 428, 'height': 188}, 'external_fields': {'face_name': 'xiaolong'}}]}

根据返回的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文件内容!):

import base64
import requests
import io
\# 项目ID
PROJECT_ID = "[填你自己的]"
\# 服务器区域代号
SERVER_ID = "cn-north-4"
\# 从当前目录下的token.txt文件中读取Token
with open('token.txt', 'r') as file:
TOKEN = file.read().strip()
def image_to_base64(image_path):
"""
将图片转换为 Base64 编码
"""
try:
with open(image_path, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
return encoded_string
except Exception as e:
print(f"图片编码为 Base64 时发生错误: {e}")
return None
def to_base64(image):
"""将图片转换为Base64编码"""
buffered = io.BytesIO()
image.save(buffered, format="JPEG")
img_str = base64.b64encode(buffered.getvalue()).decode('utf-8')
return img_str
def find_face(image_path, face_lib, threshold=0.93):
\# 将图片转换为 Base64 编码
img_data = image_to_base64(image_path)
if not img_data:
print("图片无法转换为 Base64,检测失败")
return
\# 设置请求地址
request_url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-sets/{face_lib}/search"
\# 设置数据提交格式及请求头
headers = {
"Content-Type": "application/json",
"X-Auth-Token": TOKEN
}
\# 构造请求体
payload = {
"image_base64": img_data,
"return_fields": ["face_name"],
"threshold": threshold
}
\# 发送POST请求
response = requests.post(request_url, json=payload, headers=headers)
\# 检查响应状态码
if response.status_code == 200:
print("人脸搜索成功:", response.json())
else:
print("人脸搜索失败:", response.status_code, response.text)
\# 调用函数
find_face("/home/developer/image/1.jpeg", "face_1")

代码说明:

  • 替换’/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文件运行后,接口返回的结果如下:

人脸搜索成功: {'faces': [{'face_id': '1cOqkdyg', 'external_image_id': 'JAHIqXTA', 'bounding_box': {'width': 148, 'top_left_x': 358, 'top_left_y': 428, 'height': 188}, 'external_fields': {'face_name': 'xiaolong'}, 'similarity': 1.0}]}

根据返回的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:

sudo apt-get -y install python3-tk

继续在“终端”中执行以下命令,安装Pillow库:

pip3 install Pillow --target={package-path}

其中{package-path}用安装包文件夹路径替换,获取方式同步骤2.1安装requests的安装路径。

7.2 图形化界面设计

在CodeArts IDE for Python中,重新新建一个face_detect_tkinter.py文件。用于编写人脸匹配图形化界面代码。

在face_detect_tkinter.py文件中输入如下代码(复制文档中python代码时,可能会导致格式错误,可以点击下载获取face_detect_tkinter.py文件内容!):

import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
\# 全局变量,保存当前载入的图片路径
current_image_path = None
\# 创建主窗口
window = tk.Tk()
window.title("人脸识别服务工具")
window.geometry("600x400") \# 增大窗口尺寸以显示图片
\# 图片显示标签
image_label = tk.Label(window, text="图片显示区域", width=50, height=20, relief="solid")
image_label.pack(pady=10)
\# 定义功能函数
def load_image():
global current_image_path
file_path = filedialog.askopenfilename(
title="选择图片文件",
filetypes=[("图片文件", "\*.jpg \*.jpeg \*.png \*.bmp")]
)
if file_path:
current_image_path = file_path
display_image(file_path)
def display_image(file_path):
try:
img = Image.open(file_path)
img = img.resize((300, 300)) \# 调整图片尺寸
img_tk = ImageTk.PhotoImage(img)
image_label.config(image=img_tk, text="") \# 显示图片,清除文本
image_label.image = img_tk \# 防止垃圾回收
except Exception as e:
messagebox.showerror("错误", f"无法载入图片:{e}")
def create_face_library():
messagebox.showinfo("功能提示", "创建人脸库功能待实现!")
def add_face_to_library():
if not current_image_path:
messagebox.showwarning("提示", "请先载入图片!")
return
messagebox.showinfo("功能提示", f"向人脸库添加人脸功能待实现!当前图片路径:{current_image_path}")
def search_face():
if not current_image_path:
messagebox.showwarning("提示", "请先载入图片!")
return
messagebox.showinfo("功能提示", f"搜索匹配人脸功能待实现!当前图片路径:{current_image_path}")
\# 创建按钮
btn_load_image = tk.Button(window, text="载入图片", command=load_image, width=20)
btn_create_library = tk.Button(window, text="创建人脸库", command=create_face_library, width=20)
btn_add_face = tk.Button(window, text="添加人脸到库", command=add_face_to_library, width=20)
btn_search_face = tk.Button(window, text="搜索匹配人脸", command=search_face, width=20)
\# 布局按钮
btn_load_image.pack(pady=5)
btn_create_library.pack(pady=5)
btn_add_face.pack(pady=5)
btn_search_face.pack(pady=5)
\# 运行主事件循环
window.mainloop()

代码说明:

以上是用 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实现考勤系统人脸匹配功能实践全部完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值