跑跑啦航模

用树莓派跑人脸识别模型

本文将手把手教你如何用树莓派开发板搭建一个的 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)的技术文章*