【树莓派5】人脸检测与物体识别
本文介绍了树莓派 5 结合 OpenCV 实现人脸检测与物体识别的板端推理的项目设计。
项目介绍
树莓派 5 板端部署 OpenCV 软件包,结合 Haar 级联分类和 YuNet 算法实现人脸检测、结合 YOLO 算法实现物体识别。
环境搭建:OpenCV 安装、Ultralytics 软件包安装等;
人脸检测:采用 Haar 级联分类器和 YuNet 算法两种方案实现人脸检测的板端推理;
物体识别:采用 YOLOv8 算法及模型实现物体识别的本地推理;
环境搭建
为了快速实现人脸检测和物体识别,需完成 OpenCV 部署和 Ultralytics 软件包的安装等操作。
OpenCV 安装
OpenCV 是一个开源的计算机视觉库,广泛应用于图像处理、视频分析和机器学习等领域。


为了避免影响系统 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 .
Ultralytics 部署
Ultralytics 基于多年在计算机视觉和人工智能领域的基础研究,打造出尖端、先进的YOLO 模型;
具有 速度快、精度高、操作简便 等特点。
在目标检测、跟踪、实例分割、图像分类和姿态估计等任务中表现出色。


使用系统或第三方轮子,安装 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) .
人脸检测
这里给出 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 ;
弹窗显示人脸检测结果


按任意键即可关闭窗口;
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 启动人脸检测程序;
终端打印检测结果;


弹窗显示






物体识别
通过 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 ;
弹窗显示物体识别结果









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