用树莓派跑人脸识别模型

本文将手把手教你如何用树莓派开发板搭建一个的 AI 人脸检测系统,从准备工作到模型识别、代码讲解,再到最终效果展示,你还可以自己外接摄像头模块,基于此来实现一个人脸识别系统。
一、项目简介
利用树莓派开发板搭建AI人脸检测系统,从准备工作到模型识别、代码讲解。
使用方案:
- Haar级联:使用OpenCV自带的级联分类器实现实时人脸检测
- ONNX模型:使用RetinaFace、YuNet等轻量化模型实现板端推理
二、准备工作

硬件清单:
- 树莓派开发板(建议4B/5/CM0均可)
- 树莓派摄像头模块
- 稳定的电源适配器
- microSD卡(建议32GB以上)
软件环境:
```bash
# 安装OpenCV
sudo apt update
sudo apt install python3-opencv
# 补全OpenCV数据
sudo apt install opencv-data
# 下载Haar级联模型
cd ~
mkdir model
cd model
wget
```

@@IMG@@b16-4.jpg@@/IMG@@
三、方法一:Haar级联人脸检测
使用OpenCV自带的级联分类器实现实时人脸检测。
```python
import cv2
def detect_faces(image_path):
img = cv2.imread(image_path)
if img is None:
print(f"无法读取图片: {image_path}")
return
h0, w0 = img.shape[:2]
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载分类器
cascade_path = "/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(cascade_path)
# 检测人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=7,
minSize=(60, 60)
)
# 绘制结果
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow("Face Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
detect_faces("test.jpg")
```
四、效果展示

终端执行 `python fd_xml.py` 弹窗显示人脸检测结果,绿色框会标记出检测到的人脸区域。
五、方法二:ONNX模型(更高精度)

ONNX(Open Neural Network Exchange)是一个开放的AI模型生态系统格式。这里使用轻量化的RetinaFace、YuNet等ONNX模型实现更精确的人脸检测。
安装ONNX运行时:
```bash
sudo pip3 install onnxruntime --break-system-packages
```
下载模型:
```bash
cd ~/model
wget
```

@@IMG@@b16-8.jpg@@/IMG@@
ONNX模型推理代码:
```python
import cv2
import numpy as np
import onnxruntime as ort
def detect_faces_onnx(model_path, image_path):
# 加载ONNX模型
session = ort.InferenceSession(model_path, providers=['CPUExecutionProvider'])
input_name = session.get_inputs()[0].name
image = cv2.imread(image_path)
orig_h, orig_w = image.shape[:2]
# 预处理
resized = cv2.resize(image, (320, 240))
input_tensor = resized.astype(np.float32) / 255.0
input_tensor = input_tensor.transpose(2, 0, 1)
input_tensor = np.expand_dims(input_tensor, axis=0)
# 推理
outputs = session.run(None, {input_name: input_tensor})
scores, boxes = outputs
# 处理结果
for i in range(scores.shape[1]):
face_score = scores[0, i, 1]
if face_score > 0.7:
box = boxes[0, i]
x1 = int(box[0] * orig_w)
y1 = int(box[1] * orig_h)
x2 = int(box[2] * orig_w)
y2 = int(box[3] * orig_h)
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(image, f"{face_score:.2f}", (x1, y1-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1)
cv2.imshow("ONNX Face Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
六、实时摄像头检测
```python
import cv2
# 初始化摄像头
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier(
"/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml"
)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Camera Face Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```

@@IMG@@b16-10.jpg@@/IMG@@ @@IMG@@b16-11.jpg@@/IMG@@ @@IMG@@b16-12.jpg@@/IMG@@ @@IMG@@b16-13.png@@/IMG@@
七、代码下载
完整代码打包下载:
*本文整理自树莓派实验室(shumeipai.nxez.com)的技术文章*

微信联系
淘宝联系