【案例共创】基于开发者空间通过FRS实现图片中的人脸检测功能

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

1 概述

1.1 背景介绍

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

1.2 适用对象

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

1.3 案例时间

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

1.4 案例流程

36797f3036889a37b54999c7ce6100d9.png{{{width="70%" height="auto"}}}

说明:

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

1.5 资源总览

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

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

2 开发者空间环境准备

2.1 配置云主机

本案例中,需要调用人脸识别服务FRS的接口来实现对应的功能,需要安装requests库。

说明:

  • requests库是一个非常强大的工具,它允许你发起HTTP请求,这个模块可以让你用简单的代码完成大部分的HTTP操作。

登录开发者空间,登录后页面如下:

16c147973ad05fddbb521ad0e6f17c31.png

点击“配置云主机”,会弹出对话框,进行云主机配置。

  • 按如规格下配置云主机:
  • 云主机名称:默认/自定义
  • CPU架构:X86
  • 规格:2 vCPUs 4 GB
  • 操作系统:Ubuntu
  • 系统镜像:公共镜像 Ubuntu 24.04 Server 定制版

确认以上配置无误,点击“安装”,进行云主机操作系统安装。

image.png

安装完毕之后,点击“打开云主机 > 进入桌面”。 image.png

环境准备中,大约需要3-5分钟,请您耐心等待…

8512603b375e7b733959192670a7ed57.png

进入桌面后的在桌面点击打开 “CodeArts IDE for Python”。 image.png

CodeArts IDE for Python 启动后,在弹框界面,选择“新建工程”。

a2143b0d40f3e65df071c538e6edfa68.png

在新建工程页面,自定义输入工程名称,点击“创建”。

f8432908487101cb2220e1037b57905c.png

在CodeArts IDE for Python 中,在新建的工程文件目录中,选择“venv/lib/python3.10/site-packages”路径下的任一文件,鼠标右键后,选择“打开所在文件夹”。

ad470ae264695620db5a2b9734edd260.png

复制被打开的文件夹路径。

2b700dcda9b7dd1355220ece07982f76.png

在CodeArts IDE for Python 中,点击下方的“终端”,输入以下命令后回车,安装requests库:

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

其中{package-path}用上一步中复制的文件夹路径替换。

63f12d00f080c7796496a8e5f1fa36b7.png

到此,云主机的开发环境已经配置完成。

2.2 开通人脸识别服务

进入人脸识别服务控制台,区域选择“华北-北京四”,分别点击下图中所示“人脸检测”产品的“开通服务”。

d9f2cf8b1efa09309f73790e64fcc90a.png

开通后,如下图所示:

1865056375786ef6cfccadcc89f8d1cd.png

点击对应的“接口文档”,可已快速查阅对应产品的接口使用说明。

6274bf3423ae4d17f2514606b19c5dd1.png

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的 “资源管理器”中右键,选择“新建 > 文件”。

image.png

文件名是“get_token.py”。

image.png

在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。

2d73cdfd2763c9eea61aef2042430bc0.png

3.2 调试运行获取Token代码

按上述步骤编写好代码后,在CodeArts IDE for Python中,get_token.py文件页面,点击右上角的绿色三角形按钮,运行代码。 得到了Token然后保存到本地文件里。

image.png

4 实现人脸检测功能

人脸检测是在图像中准确识别出人脸的位置和大小。用户通过该服务,可以同时识别出图片中包含的不同倾角正脸及侧脸。人脸检测API调用可参考:人脸检测

4.1 准备测试图片

打开文件管理器,在/home/developer目录下创建一个image文件夹。

003db3acd28b76bdbc4f281ac0e6efdc.png

然后打开浏览器,搜索图片。

1b51f19d9064d78817bb8a1292ac78ac.png

下载两张图片到/home/developer/image/路径下,并将图片重命名为“1.jpeg”和“2.jpeg”。

8f085efdc9f5a48c43ecbb4002d7856d.png

4.2 编写人脸检测代码

在CodeArts IDE for Python中,新建一个face_detect.py文件。用于编写测试人脸检测代码。

image.png

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

import requests
import base64
import json

# 项目 ID 和服务器区域代号
PROJECT_ID = "[填你自己的]"
SERVER_ID = "cn-north-4"

# TOKEN 文件路径
TOKEN_FILE_PATH = "token.txt"

def read_token_from_file():
    """
    从文件中读取 TOKEN
    """
    try:
        with open(TOKEN_FILE_PATH, "r") as file:
            token = file.read().strip()
        return token
    except Exception as e:
        print(f"读取 TOKEN 文件时发生错误: {e}")
        return None

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 face_detect(image_path):
    """
    人脸检测功能
    """
    # 获取 TOKEN
    token = read_token_from_file()
    if not token:
        print("TOKEN 无法加载,检测失败")
        return

    # 请求地址
    request_url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-detect"

    # 将图片转换为 Base64 编码
    img_data = image_to_base64(image_path)
    if not img_data:
        print("图片无法转换为 Base64,检测失败")
        return

    # 构造请求头
    headers = {
        "Content-Type": "application/json",
        "X-Auth-Token": token
    }

    # 构造请求体
    payload = {
        "image_base64": img_data,
        "attributes": "1,2,4,6,7,8"  # 自定义返回字段
    }

    # 发送 POST 请求
    try:
        response = requests.post(request_url, headers=headers, data=json.dumps(payload))

        # 打印状态码
        print(f"状态码: {response.status_code}")

        # 解析和打印返回结果
        if response.status_code == 200:
            print("人脸检测成功,结果如下:")
            print(json.dumps(response.json(), indent=4, ensure_ascii=False))
        else:
            print(f"人脸检测失败: {response.text}")

    except Exception as e:
        print(f"请求发生错误: {e}")

def main():
    # 图片路径,替换为你要检测的图片路径
    image_path = "/home/developer/image/1.jpeg"

    # 执行人脸检测
    face_detect(image_path)

if __name__ == "__main__":
    main()

代码说明:

以上是用 Python 实现的人脸检测功能代码,使用 requests 库来发出 HTTP 请求,并从本地的 token.txt 文件中读取 TOKEN。代码也包含将图片转换为 Base64 编码的逻辑。

  • 依赖库:
  • 使用 requests 进行 HTTP 请求。如果没有安装,在运行代码前,请参考步骤2.1安装依赖库。
  • 使用 base64 将图片转换为 Base64 编码。
  • 主要逻辑:
  • 读取 TOKEN:从 token.txt 文件中读取 TOKEN。
  • 图片编码:将输入图片文件转为 Base64 格式。
  • 构造请求:设置请求头和请求体,指定自定义返回字段。
  • 发送请求:调用 API 完成人脸检测,打印响应结果。
  • 错误处理:
  • 捕获文件读取、图片编码以及 HTTP 请求的异常,方便排查问题。
  • 运行方式:
  • 将代码保存为 face_detect.py。
  • 替换 image_path 为本地图片的实际路径。
  • 替换PROJECT_ID 为实际账号的项目ID,可参考3.1。
  • 输出:
  • 成功时,打印 API 返回的 JSON 数据。
  • 失败时,打印错误状态码及返回信息。

4.3 终端运行测试

按上述步骤编写好代码后,在CodeArts IDE for Python中,face_detect.py文件页面,点击右上角的绿色三角形按钮,运行代码。

c89b6e94bc938793bfc381bcdd84454c.png

代码中调试的图片是: bafe039880617f182f072331ce6c9467.png

face_detect.py文件运行后,接口返回的结果如下:

{
    "faces": [
        {
            "bounding_box": {
                "width": 150,
                "top_left_y": 431,
                "top_left_x": 192,
                "height": 182
            },
            "attributes": {
                "gender": "female",
                "age": 25,
                "dress": {
                    "glass": "none",
                    "hat": "none"
                },
                "mask": "none",
                "hair": "long",
                "beard": "none"
            }
        },
        {
            "bounding_box": {
                "width": 148,
                "top_left_y": 428,
                "top_left_x": 358,
                "height": 188
            },
            "attributes": {
                "gender": "female",
                "age": 26,
                "dress": {
                    "glass": "none",
                    "hat": "none"
                },
                "mask": "none",
                "hair": "long",
                "beard": "none"
            }
        }
    ]
}

JSON数据表示的含义如下:

检测到了两张人脸。

  • 第一张人脸:

    位置:左上角坐标(192, 431),宽度150像素,高度182像素。

    属性:女性,年龄25岁,未戴眼镜和帽子,长发,无胡须,未戴口罩。

  • 第二张人脸:

    位置:左上角坐标(358, 428),宽度148像素,高度188像素。

    属性:女性,年龄26岁,未戴眼镜和帽子,长发,无胡须,未戴口罩。

这些信息提供了每张人脸的位置以及一些基本属性如性别、年龄、是否佩戴眼镜或帽子等。

到此,人脸检测接口就已经调用成功了。

5 图形化项目开发

为了更方便直观的展示项目的整体功能,接下来进行图形化界面的开发。

5.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

2071b021182c03708fbf2d6dac86138a.png

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

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

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

0179833030985532f4e197c6b0b5b2d8.png

5.2 图形化界面设计

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

image.png

在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 face_detection():
    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_face_detection = tk.Button(window, text="人脸检测", command=face_detection, width=20)

# 布局按钮
btn_load_image.pack(pady=5)
btn_face_detection.pack(pady=5)

# 运行主事件循环
window.mainloop()

代码说明:

以上是用 Python 实现的人脸检测图形化界面代码,使用 tkinter 库来实现图形化界面。

  • 依赖库:
    • 使用 tkinter 图形化界面。
    • 使用 PIL 实现图像显示、格式转换。
    • 确保安装了依赖库:pip3 install Pillow --target={package-path}。
    • 确保安装了依赖库:sudo apt-get -y install python3-tk。
  • 待实现代码:
    • 点击“人脸检测”按钮,会提示“人脸检测功能待实现!”。
    • 开发者可结合步骤4中实现的人脸检测功能来实现该功能,案例中不再扩展。
    • 代码补齐后,实现效果如下图所示:

bce4fae0e3c2dedb9a6c91fcd786fa5f.png

按上述步骤编写好代码后,在CodeArts IDE for Python中,face_detect_tkinter.py文件页面,点击右上角的绿色三角形按钮,运行代码。运行效果如下图所示:

af1572ac31f0fc358a2d87ecdacc13b8.png

至此,基于开发者空间通过FRS实现图片中的人脸检测功能实践全部完毕。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值