【LattePanda Mu 开发套件】AI 视觉应用开发——人脸检测

本文介绍了 LattePanda Mu 开发套件实现 AI 视觉应用开发——人脸检测,包括项目介绍、环境部署、板端推理、动态识别等。

项目介绍

  • 环境部署:包括 Python 安装、OpenCV 库安装、工具链安装等;
  • 模型训练:包括预训练 ONNX 模型、YuNet 模型、置信度显示等;
  • 板端推理:包括流程图、关键代码、本地人脸图片的板端推理等;
  • 实时监测:连接 USB 摄像头捕捉实时画面,并实现人脸动态检测。

环境搭建

包括 Python 安装、OpenCV 库安装、工具链安装等。

Python 安装

  • 下载并安装最新版 Python 软件,勾选添加路径至系统环境变量选项;

  • 安装完成后,Win + R 输入 CMD 回车,进入终端命令行界面;

  • 执行 python --version 指令,获取当前版本信息,验证安装是否完成;

  • 终端执行 pip --version 获取相应的版本号;

OpenCV 部署

  • 终端执行 pip install opencv-python 安装 OpenCV 库;

YuNet 模型

YuNet 是一种轻量级、高效且准确的人脸检测模型,专为边缘设备设计,能够在毫秒级完成推理。该模型采用无锚点(Anchor-free)机制,并优化了损失函数和样本匹配策略,显著提升了检测性能,同时保持了极小的参数量。

在这里插入图片描述

YuNet 广泛应用于人脸识别、表情分析、视频监控等领域,尤其适合资源受限的边缘设备。其高效性还可用于服务器端批量处理,节省计算资源。

详见:YuNet: A Tiny Millisecond-level Face Detector .

板端推理

介绍了基于 OpenCV 的人脸检测项目的实现。

调用训练好的模型实现人脸检测,并标注相应的置信度。

使用 ONNX 模型,下载 并将模型文件置于 model 文件夹路径下;

YuNet 是 Anchor-Free 人脸检测器。

详见开源项目:face_detection_yunet | GitHub .

流程图

开始
读取图片
获取图片尺寸
创建 YuNet 检测器
执行检测
遍历 faces
画矩形框 + 置信度文字
计算显示尺寸
显示结果
关闭窗口
结束

代码

新建 face_detection_confidence.py 文件,添加如下代码

import cv2

def detect_faces_yunet(image_path: str,
                       conf_threshold: float = 0.8,
                       model_path: str = "models/face_detection_yunet_2023mar.onnx") -> None:
    img = cv2.imread(image_path)
    if img is None:
        raise FileNotFoundError(image_path)
    h, w = img.shape[:2]

    # 初始化 YuNet
    detector = cv2.FaceDetectorYN_create(
        model=model_path,
        config="",
        input_size=(w, h),
        score_threshold=conf_threshold,
        nms_threshold=0.4,
        top_k=5000
    )
    detector.setInputSize((w, h))

    faces = detector.detect(img)[1]  # shape: (N, 15)  x,y,w,h,x_reye,...,score
    if faces is None:
        faces = []

    for face in faces:
        x, y, w, h, *_ = face[:4]
        score = face[-1]
        x, y, w, h = map(int, (x, y, w, h))

        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        label = f"{score:.2f}"
        label_size, _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)
        cv2.rectangle(img, (x, y - label_size[1] - 4),
                      (x + label_size[0], y), (0, 255, 0), -1)
        cv2.putText(img, label, (x, y - 2), cv2.FONT_HERSHEY_SIMPLEX,
                    0.5, (0, 0, 0), 1, cv2.LINE_AA)

    # ========== 显示部分开始 ==========
    window_name = "YuNet Face Detection"

    h_img, w_img = img.shape[:2]          # 原图尺寸
    max_h = 500                           # 限制最大高度

    if h_img > max_h:                     # 缩放
        scale = max_h / h_img
        new_w = int(w_img * scale)
        show_img = cv2.resize(img, (new_w, max_h))
    else:                                 # 无需缩放
        show_img = img

    cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE)  # no resize frame
    cv2.imshow("YuNet Face Detection", show_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    detect_faces_yunet(r".\img\friends.jpg")
  • 右键该文件,选择使用 IDLE 编辑;
  • 菜单栏选择 Run - Run Module 选项,运行程序;

或终端执行指令 python E:\Code\fd\face_detection_confidence.py 、双击 *.py 文件运行也可;

效果

运行程序后弹出人脸检测结果,并标注人脸置信度

在这里插入图片描述

  • 调用 ONNX 模型实现人脸检测的方案相对于 Haar 特征识别方案具有更高的精度和置信度,同时提供更多可调控的信息;

在这里插入图片描述

  • 可见该方案在整体识别效果方面有显著提升;

在这里插入图片描述

  • 对于图像分辨率较为一般的场景,也能准确识别人脸;

在这里插入图片描述

动态检测

调用本地 USB 摄像头资源,实时跑 YuNet 模型;

  • 人脸框 + 置信度;
  • q 键退出;
  • 首次运行自动下载 YuNet 权重文件;

在这里插入图片描述

流程图

失败
成功
开始
加载ONNX
打开摄像头
退出
读取帧
创建 YuNet 检测器
主循环
读帧
检测人脸
画框+置信度
显示
按 q?
释放摄像头
关闭窗口
结束

代码

新建 face_detection_CamUSB.py 并添加如下代码

import cv2
from pathlib import Path
import urllib.request
import sys

# ---------- 1. 模型路径 & 下载 ----------
MODEL_URL = (
    "https://github.com/opencv/opencv_zoo/raw/main/models/face_detection_yunet/"
    "face_detection_yunet_2023mar.onnx"
)
MODEL_PATH = Path("models/face_detection_yunet_2023mar.onnx")

if not MODEL_PATH.exists():
    print("首次使用,正在下载 YuNet 权重...")
    urllib.request.urlretrieve(MODEL_URL, MODEL_PATH)
    print("下载完成.")

# ---------- 2. 初始化摄像头 ----------
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)   # CAP_DSHOW 仅 Windows 可删
if not cap.isOpened():
    sys.exit("无法打开摄像头")

# 读取一帧拿到分辨率
ret, frame = cap.read()
if not ret:
    sys.exit("无法读取画面")
h, w = frame.shape[:2]

# ---------- 3. 初始化 YuNet ----------
detector = cv2.FaceDetectorYN_create(
    model=str(MODEL_PATH),
    config="",
    input_size=(w, h),
    score_threshold=0.7,
    nms_threshold=0.4,
    top_k=5000
)

# ---------- 4. 主循环 ----------
print("按 q 退出")
while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 检测
    detector.setInputSize((w, h))
    faces = detector.detect(frame)[1]  # shape: (N, 15)
    if faces is None:
        faces = []

    for face in faces:
        x, y, w_box, h_box = map(int, face[:4])
        score = float(face[-1])

        # 画框
        cv2.rectangle(frame, (x, y), (x + w_box, y + h_box), (0, 255, 0), 2)
        # 写置信度
        label = f"{score:.2f}"
        cv2.putText(frame, label, (x, y - 5),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

    # 显示
    cv2.imshow("YuNet USB Camera", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# ---------- 5. 清理 ----------
cap.release()
cv2.destroyAllWindows()
  • 右键该文件,选择使用 IDLE 编辑;
  • 菜单栏选择 Run - Run Module 选项,运行程序;

或双击 *.py 文件运行。

效果

运行程序后弹出摄像头实时采集画面,自动标注人脸选框和置信度

动态演示

在这里插入图片描述

总结

本文介绍了 LattePanda Mu 开发套件实现 AI 视觉识别类的相关应用,包括环境搭建、模型训练、板端推理、摄像头实时检测和推理识别等,为该产品在 AI 视觉领域的快速开发和应用提供了参考。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐