这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 【树莓派5】人脸检测与物体识别

共1条 1/1 1 跳转至

【树莓派5】人脸检测与物体识别

工程师
2025-12-10 13:58:39   被打赏 100 分(兑奖)     打赏

【树莓派5】人脸检测与物体识别

本文介绍了树莓派 5 结合 OpenCV 实现人脸检测与物体识别的板端推理的项目设计。


项目介绍

树莓派 5 板端部署 OpenCV 软件包,结合 Haar 级联分类和 YuNet 算法实现人脸检测、结合 YOLO 算法实现物体识别。

  • 环境搭建:OpenCV 安装、Ultralytics 软件包安装等;

  • 人脸检测:采用 Haar 级联分类器和 YuNet 算法两种方案实现人脸检测的板端推理;

  • 物体识别:采用 YOLOv8 算法及模型实现物体识别的本地推理;


环境搭建

为了快速实现人脸检测和物体识别,需完成 OpenCV 部署和 Ultralytics 软件包的安装等操作。

OpenCV 安装

OpenCV 是一个开源的计算机视觉库,广泛应用于图像处理、视频分析和机器学习等领域。

opencv_logo.jpg

为了避免影响系统 Python,这里采用创建虚拟环境的方案

  • 创建并激活虚拟环境

 mkdir ~/cv && cd ~/cv    # 创建 cv 文件夹,便于管理
 python3 -m venv venv     # 创建虚拟环境 venv
 source venv/bin/activate # 激活虚拟环境 venv
  • 升级 pip 并安装 NumPy + OpenCV 全家桶

 pip install -U pip numpy                          # 安装 numpy
 pip install opencv-python opencv-contrib-python   # opencv 主模块及 contrib
  • 验证安装

python -c "import cv2,sys,numpy;print('OpenCV:',cv2.__version__,'NumPy:',numpy.__version__)"
  • 输出版本号

opencv_version.jpg

详见:OpenCV .


Ultralytics 部署

Ultralytics 基于多年在计算机视觉和人工智能领域的基础研究,打造出尖端、先进的YOLO 模型

具有 速度快、精度高、操作简便 等特点。

目标检测跟踪实例分割图像分类姿态估计等任务中表现出色。

ultralytics_curves.jpg

  • 使用系统或第三方轮子,安装 ultralytics 软件包

 # 升级系统工具
 sudo apt update && sudo apt install -y python3-dev python3-pip libopenblas-dev
 # 安装 numpy 轮子
 python3 -m pip install -U pip
 pip install --only-binary=numpy numpy==1.26.4     # 不编译
 # 安装 ultralytics
 pip install ultralytics
  • 验证安装

python -c "import ultralytics, sys, torch; print('✅ ultralytics', ultralytics.__version__, '| torch', torch.__version__, '| Python', sys.version.split()[0])"
  • 输出相应版本号

ultralytics_print.jpg

详见:ultralytics) .


人脸检测

这里给出 Haar 级联分类和 YuNet 算法两种实现人脸检测的解决方案。

Haar Casecade

使用 OpenCV 自带的 Haar Casecade 方案实现人脸检测。

代码

  • 终端执行 source ~/cv/venv/bin/activate 激活虚拟环境;

  • 执行 touch fd_xml.py 新建程序文件,并添加如下代码

 #!/usr/bin/env python3
 import cv2
 
 # 1. 读图
 img = cv2.imread('./img/friends.jpg')
 if img is None:
     raise FileNotFoundError('找不到 ./img/*.jpg,请确认路径!')
 
 # 2. 加载 Haar 人脸检测模型(OpenCV 自带)
 cascade_path = cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
 face_cascade = cv2.CascadeClassifier(cascade_path)
 
 # 3. 灰度化 + 检测
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 faces = face_cascade.detectMultiScale(
     gray,
     scaleFactor=1.1,
     minNeighbors=5,
     minSize=(30, 30)
 )
 
 # 4. 画框
 for (x, y, w, h) in faces:
     cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
 
 # 5. 弹窗显示
 cv2.imshow('Face Detection - press any key to quit', img)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

保存代码。

效果

  • 终端运行 python fd_xml.py ;

  • 弹窗显示人脸检测结果

fd_friends.jpg

  • 按任意键即可关闭窗口;

YuNet

通过 YuNet 算法实现高精度人脸检测,并给出置信度。

代码

  • 终端执行 source ~/cv/venv/bin/activate 激活虚拟环境;

  • 执行 touch fd_onnx.py 新建程序文件,并添加如下代码

 #!/usr/bin/env python3
 import cv2
 import argparse
 
 def detect_faces_yunet(image_path: str,
                        conf_threshold: float = 0.8,
                        model_path: str = "./model/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))
 
     # detect 返回 (status, faces)  取第 1 个元素
     faces = detector.detect(img)[1]
     if faces is None:
         faces = []
 
     for face in faces:
         x, y, w_box, h_box, *_ = map(int, face[:4])
         score = face[-1]
         cv2.rectangle(img, (x, y), (x + w_box, y + h_box), (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)
 
     # 树莓派小屏:允许鼠标拖拽缩放
     cv2.namedWindow("YuNet Face Detection", cv2.WINDOW_NORMAL)
     cv2.imshow("YuNet Face Detection", img)
     cv2.waitKey(0)
     cv2.destroyAllWindows()

保存代码。

效果

  • 终端执行 python fd_onnx.py -i ./img/test.jpg 启动人脸检测程序;

  • 终端打印检测结果;

  • fd_yunet_print.jpg

  • 弹窗显示

fd_yunet_friends

fd_yunet_TBBT

物体识别

通过 YOLO 算法实现高精度的物体识别,包括关键代码和效果演示。

代码

  • 终端执行 source ~/cv/venv/bin/activate 激活虚拟环境;

  • 执行 touch or_yolo.py 新建程序文件,并添加如下代码

 #!/usr/bin/env python3
 import cv2
 import numpy as np
 from ultralytics import YOLO
 
 # ---------- 1. 加载模型 ----------
 model = YOLO('./model/yolov8n.pt') # 加载模型
 names = model.names          # 动态获取标签
 
 # ---------- 2. 颜色方案(基于 model.names) ----------
 def generate_distinct_colors(name_dict):
     """name_dict: {0:'person', 1:'bicycle', ...}"""
     base_colors = [
         (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0),
         (255, 0, 255), (0, 255, 255), (255, 128, 0), (128, 0, 255),
         (0, 255, 128), (128, 255, 0), (255, 0, 128), (0, 128, 255)
     ]
     fixed_colors = {
         'person': (255, 0, 0),        'car': (0, 255, 0),
         'truck': (255, 255, 0),       'bus': (255, 128, 0),
         'bicycle': (255, 0, 255),     'motorcycle': (128, 0, 255),
         'traffic light': (0, 0, 255), 'stop sign': (0, 0, 255),
         'parking meter': (0, 255, 255)
     }
     colors = []
     for idx in range(len(name_dict)):
         name = name_dict[idx]
         if name in fixed_colors:
             colors.append(fixed_colors[name])
         else:
             color_idx = (idx - len(fixed_colors)) % len(base_colors)
             colors.append(base_colors[color_idx])
     return colors
 
 def get_contrast_text_color(bg):
     r, g, b = bg
     return (0, 0, 0) if 0.2126*r + 0.7152*g + 0.0722*b > 128 else (255, 255, 255)
 
 # 生成颜色表
 colors = generate_distinct_colors(names)
 txt_colors = [get_contrast_text_color(c) for c in colors]
 
 # ---------- 3. 读图 ----------
 img_path = './img/desktop.jpg'
 img = cv2.imread(img_path)
 if img is None:
     raise FileNotFoundError(img_path)
 
 # ---------- 4. 推理 ----------
 results = model(img, conf=0.3, iou=0.45)
 
 # ---------- 5. 绘制 ----------
 font_scale = 0.5
 thickness = 1
 for r in results:
     for b in r.boxes:
         x1, y1, x2, y2 = map(int, b.xyxy[0])
         conf = float(b.conf[0])
         cls  = int(b.cls[0])
         label = f'{names[cls]} {conf:.2f}'
 
         color = colors[cls]
         # 半透明填充
         overlay = img.copy()
         cv2.rectangle(overlay, (x1, y1), (x2, y2), color, -1)
         img = cv2.addWeighted(overlay, 0.25, img, 0.75, 0)
 
         # 标签背景
         (tw, th), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, font_scale, thickness)
         cv2.rectangle(img, (x1, y1-th-8), (x1+tw, y1), color, -1)
         # 文字(自动黑/白)
         cv2.putText(img, label, (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX,
                     font_scale, txt_colors[cls], thickness)
 
 # ---------- 6. 等比例放大显示 ----------
 disp_h = 480
 h, w = img.shape[:2]
 img_show = cv2.resize(img, (int(w * disp_h / h), disp_h),
                       interpolation=cv2.INTER_LINEAR)
 
 cv2.imshow('Colorful YOLO Detection', img_show)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

保存代码。

效果

  • 终端运行 python or_yolo.py ;

  • 弹窗显示物体识别结果

or_desktop

or_fruits

总结

本文介绍了树莓派 5 结合 OpenCV 实现人脸检测与物体识别的板端推理的项目设计,包括 OpenCV 部署、YOLO 算法及 YuNet 算法模型的应用与实现,为树莓派在边缘AI视觉领域的开发设计和快速应用提供了参考。




关键词: 树莓派     OpenCV     YOLO     YuNet     人脸检    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]