【Arduino UNO Q】 边缘 AI 视觉部署方案:人脸检测

本文介绍了 Arduino UNO Q 开发板结合 OpenCV 实现人脸检测的项目设计。

项目介绍

Arduino UNO Q 开发板结合 OpenCV 与 HaarCascade 算法实现快速人脸检测。

  • 准备工作:硬件连接、软件更新等;
  • 环境搭建:安装 OpenCV 库、所需软件包等;
  • Haar级联分类:使用 OpenCV 自带的 Haar Cascade 算法实现人脸检测,包括流程图、代码、效果演示等;
  • DNN 模型:使用预训练模型,结合 OpenCV 自带的 DNN 算法,实现高精度人脸检测。

准备工作

包括硬件连接、系统安装、软件更新等。

详见:Arduino UNO Q 介绍、环境搭建、工程测试 .

硬件连接

这里采用 SSH 远程控制,使用 Type-C 数据线供电并 WiFi 联网即可。

在这里插入图片描述

软件更新

更新软件包

sudo apt update
sudo apt upgrade

环境搭建

  • 安装 OpenCV 和 opencv-data 软件包;

    sudo apt install python3-opencv
    sudo apt install opencv-data
    
  • 执行如下指令验证

python3 -c "import cv2,sys;print(cv2.__version__,sys.version)"

终端打印 opencv 版本号

在这里插入图片描述

Haar CasCade

使用 Haar 级联分类器快速实现人脸检测。

  • 使用 opencv-data 软件包的 haarcascade_frontalface_default.xml 权重模型检测人脸;

  • 加载模型 ./model/*.xml 和目标图片 ./img/*.jpg

  • 弹窗显示人脸检测结果。

代码

终端执行指令 touch fd_xml.py 新建文件,并添加如下代码

import numpy as np
import cv2
import argparse

# input image path
parser = argparse.ArgumentParser()
parser.add_argument('--image_path', default='./img/friends.jpg', help='输入指令 python3 fd_xml.py --image_path ./img/friends.jpg')
args = parser.parse_args()

# 实例化人脸分类器
face_cascade = cv2.CascadeClassifier('/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml')
# 读取图片
img = cv2.imread(args.image_path, cv2.IMREAD_COLOR)
# 转换灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸,输出外框
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=1)
# 遍历人脸
for (x,y,w,h) in faces:
    # 画框
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

# 显示结果
cv2.namedWindow('faces', cv2.WINDOW_NORMAL)
cv2.imshow('faces',img)
# 退出键
cv2.waitKey(0)
# 关闭窗口
cv2.destroyAllWindows()

保存代码。

效果

  • 终端执行 python3 fd_xml.py --image_path ./img/friends.jpg
  • 弹窗显示识别结果,按任意键关闭窗口。
  • 识别效果如下

在这里插入图片描述

在这里插入图片描述

使用 Haar 级联分类的方案可以获得较为可信的人脸检测结果,准确度有进一步提升的空间。

DNN

下载预训练模型

wget https://github.com/opencv/opencv/blob/master/samples/dnn/face_detector/deploy.prototxt
wget https://github.com/opencv/opencv_3rdparty/blob/dnn_samples_face_detector_20170830/res10_300x300_ssd_iter_140000.caffemodel

使用 OpenCV 自带的 DNN 工具读取模型文件,加载本地模型和目标图片并弹窗显示检测结果。

流程图

开始

解析参数

加载模型

读取图片

图片预处理

前向推理

遍历

画框

弹窗显示

按键退出

结束

代码

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

#!/usr/bin/env python3
import cv2
import numpy as np
import argparse

# input image path
parser = argparse.ArgumentParser()
parser.add_argument('--image_path', default='./img/friends.jpg', help='输入指令 python3 fd_dnn.py --image_path ./img/friends.jpg')
args = parser.parse_args()

# 加载模型
prototxt = "./model/deploy.prototxt"
caffemodel = "./model/res10_300x300_ssd_iter_140000.caffemodel"
net = cv2.dnn.readNetFromCaffe(prototxt, caffemodel)

# 读取本地图片
img = cv2.imread(args.image_path)
if img is None:
    raise FileNotFoundError("请确认图片路径是否正确")
h, w = img.shape[:2]

# 推理
blob = cv2.dnn.blobFromImage(cv2.resize(img, (300, 300)), 1.0,
                             (300, 300), (104.0, 177.0, 123.0))
net.setInput(blob)
detections = net.forward()

# 画框
for i in range(detections.shape[2]):
    confidence = detections[0, 0, i, 2]
    if confidence < 0.5:
        continue
    # 映射回原图坐标
    box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
    (x1, y1, x2, y2) = box.astype("int")
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
    cv2.putText(img, f"{confidence * 100:.1f}%", (x1, y1 - 5),
                cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

# 弹窗显示
cv2.namedWindow('Face Detection', cv2.WINDOW_NORMAL)
cv2.imshow("Face Detection", img)
cv2.waitKey(0)            # 按任意键关闭
cv2.destroyAllWindows()

保存代码。

效果

  • 终端运行指令 python3 fd_dnn.py --image_path ./img/friends.jpg 弹窗显示识别结果,按任意键关闭窗口;

    效果如下

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

本文介绍了 Arduino UNO Q 开发板结合 OpenCV 与 Haar 级联分类、DNN 模型实现人脸检测,包括OpenCV 部署、Haar 级联分类方案、DNN 算法等方案实现模型调用,给出高精度人脸检测解决方案,为相关产品在边缘 AI 视觉应用的快速开发设计提供了参考。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐