【进迭时空 K1 MUSE Pi Pro】人脸识别

原创2026-10-22 08:55:19浏览4
4
Star

【进迭时空 K1 MUSE Pi Pro】人脸识别

本文介绍了进迭时空 K1 MUSE Pi Pro 开发板结合 OpenCV 内置 YuNet 算法和 SFace 模型、 USB 摄像头,实现动态画面采集与实时人脸识别的项目设计,包括环境部署、预训练 模型获取、关键代码、板端推理、效果演示等流程。

项目介绍

驱动 USB 摄像头采集实时画面,arcface 模型实现人脸识别。

  • 准备工作:硬件连接、OpenCV 部署、摄像头驱动测试;

  • 人脸识别:模型获取、流程图、代码、实时人脸识别、效果演示。

硬件连接

  • 使用网线连接路由器和 LAN 接口,或连接 Wi-Fi 无线网;

  • 连接鼠标键盘至 USB 端口;

  • 摄像头连接开发板 USB 接口;

  • 使用 5V 直流电源 Type-C 供电;

摄像头

终端执行如下指令,获取 USB 摄像头设备信息

sudo apt install v4l-utils
v4l2-ctl --list-devices # 列出所有视频设备

由输出结果可知,UVC 摄像头对应编号为 20

代码

终端执行 touch cam_usb.py 新建程序文件,并添加如下代码

import cv2

cap = cv2.VideoCapture(20) # 摄像头 ID

while(True):
    ret, frame = cap.read() # 读取一帧图像
    cv2.imshow('frame', frame) # 显示图像
    if cv2.waitKey(1) & 0xFF == ord('q'): # 按 q 键退出
        break

cap.release()
cv2.destroyAllWindows()

保存代码。

效果

终端执行 python cam_usb.py 运行程序,

弹窗显示摄像头实时捕捉画面;

人脸识别

模型获取

终端执行如下指令

cd ./model # 将模型存放在 model 文件夹
wget https://github.com/opencv/opencv_zoo/blob/main/models/face_detection_yunet/face_detection_yunet_2026may.onnx
wget https://github.com/opencv/opencv_zoo/blob/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx

人脸图片

  • 将目标人脸图片裁剪至合适大小;

  • 文件名为对应的人名;

  • 置于 ./face 文件夹;

文件目录

~/face_recognition $ tree
.
├── face # 注册人脸
│   ├── Arnold.jpg
│   ├── ...
│   └── Robert.jpg
├── fr_cam.py # 主程序
├── img # 测试图片
│   ├── terminator.jpg
│   └── friends.jpg
└── model # 模型文件
    ├── face_detection_yunet_2026may.onnx
    └── face_recognition_sface_2021dec.onnx

流程图

代码

终端执行 touch fr_cam.py 新建文件,添加如下代码

#!/usr/bin/env python3
from pathlib import Path
import cv2

DET_MODEL = "./model/face_detection_yunet_2026may.onnx"
REC_MODEL = "./model/face_recognition_sface_2021dec.onnx"
FACE_DIR = "./face"
CAMERA_INDEX = 20
WIDTH, HEIGHT = 640, 480
CONF_TH = 0.8
SIM_TH = 0.3


def build_registry(detector, recognizer):
    regist = {}
    for fp in sorted(Path(FACE_DIR).glob("*.*")):
        img = cv2.imread(str(fp))
        if img is None:
            continue
        h, w = img.shape[:2]
        detector.setInputSize((w, h))
        faces = detector.detect(img)[1]
        if faces is None or len(faces) == 0:
            continue
        regist[fp.stem] = recognizer.feature(
            recognizer.alignCrop(img, faces[0])
        )
    return regist


def main():
    cap = cv2.VideoCapture(CAMERA_INDEX, cv2.CAP_V4L2)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
    cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

    detector = cv2.FaceDetectorYN_create(
        DET_MODEL, "", (WIDTH, HEIGHT), CONF_TH, 0.4, 5000
    )
    recognizer = cv2.FaceRecognizerSF_create(REC_MODEL, "")

    regist = build_registry(detector, recognizer)
    if not regist:
        cap.release()
        return

    while True:
        ok, frame = cap.read()
        if not ok:
            break

        h, w = frame.shape[:2]
        detector.setInputSize((w, h))
        faces = detector.detect(frame)[1]

        if faces is not None:
            for face in faces:
                feat = recognizer.feature(recognizer.alignCrop(frame, face))
                best_score, best_name = -1.0, "Unknown"
                for name, reg_feat in regist.items():
                    score = recognizer.match(
                        feat, reg_feat, cv2.FaceRecognizerSF_FR_COSINE
                    )
                    if score > best_score:
                        best_score, best_name = score, name
                if best_score < SIM_TH:
                    best_name = "Unknown"

                x, y, bw, bh = map(int, face[:4])
                color = (0, 255, 0) if best_name != "Unknown" else (0, 0, 255)
                cv2.rectangle(frame, (x, y), (x + bw, y + bh), color, 2)
                cv2.putText(frame, f"{best_name}:{best_score:.2f}",
                            (x, max(y - 6, 14)),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2)

        cv2.imshow("Face Recognition", frame)
        if cv2.waitKey(1) & 0xFF in (27, ord("q")):
            break

    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

保存代码。

效果

终端执行指令 python fr_cam.py 运行程序;

SSH 弹出窗口,显示实时画面人脸识别结果;

识别更多场景

切换人物

不同年龄段的人脸识别

总结

本文介绍了进迭时空 K1 MUSE Pi Pro 开发板结合 OpenCV 内置 YuNet 算法和 SFace 模型、 USB 摄像头,实现动态画面采集与实时人脸识别的项目设计,包括环境部署、预训练 模型获取、关键代码、板端推理、效果演示等流程,为相关产品在边缘 AI 视觉领域的快速开发和应用设计提供了参考。