欢迎光临
我们一直在努力

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

【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 工具读取模型文件,加载本地模型和目标图片并弹窗显示检测结果。

流程图

#mermaid-svg-k9Bftm2iKfI19z0V{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-k9Bftm2iKfI19z0V .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-k9Bftm2iKfI19z0V .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-k9Bftm2iKfI19z0V .error-icon{fill:#552222;}#mermaid-svg-k9Bftm2iKfI19z0V .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-k9Bftm2iKfI19z0V .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-k9Bftm2iKfI19z0V .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-k9Bftm2iKfI19z0V .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-k9Bftm2iKfI19z0V .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-k9Bftm2iKfI19z0V .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-k9Bftm2iKfI19z0V .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-k9Bftm2iKfI19z0V .marker{fill:#333333;stroke:#333333;}#mermaid-svg-k9Bftm2iKfI19z0V .marker.cross{stroke:#333333;}#mermaid-svg-k9Bftm2iKfI19z0V svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-k9Bftm2iKfI19z0V p{margin:0;}#mermaid-svg-k9Bftm2iKfI19z0V .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-k9Bftm2iKfI19z0V .cluster-label text{fill:#333;}#mermaid-svg-k9Bftm2iKfI19z0V .cluster-label span{color:#333;}#mermaid-svg-k9Bftm2iKfI19z0V .cluster-label span p{background-color:transparent;}#mermaid-svg-k9Bftm2iKfI19z0V .label text,#mermaid-svg-k9Bftm2iKfI19z0V span{fill:#333;color:#333;}#mermaid-svg-k9Bftm2iKfI19z0V .node rect,#mermaid-svg-k9Bftm2iKfI19z0V .node circle,#mermaid-svg-k9Bftm2iKfI19z0V .node ellipse,#mermaid-svg-k9Bftm2iKfI19z0V .node polygon,#mermaid-svg-k9Bftm2iKfI19z0V .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-k9Bftm2iKfI19z0V .rough-node .label text,#mermaid-svg-k9Bftm2iKfI19z0V .node .label text,#mermaid-svg-k9Bftm2iKfI19z0V .image-shape .label,#mermaid-svg-k9Bftm2iKfI19z0V .icon-shape .label{text-anchor:middle;}#mermaid-svg-k9Bftm2iKfI19z0V .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-k9Bftm2iKfI19z0V .rough-node .label,#mermaid-svg-k9Bftm2iKfI19z0V .node .label,#mermaid-svg-k9Bftm2iKfI19z0V .image-shape .label,#mermaid-svg-k9Bftm2iKfI19z0V .icon-shape .label{text-align:center;}#mermaid-svg-k9Bftm2iKfI19z0V .node.clickable{cursor:pointer;}#mermaid-svg-k9Bftm2iKfI19z0V .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-k9Bftm2iKfI19z0V .arrowheadPath{fill:#333333;}#mermaid-svg-k9Bftm2iKfI19z0V .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-k9Bftm2iKfI19z0V .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-k9Bftm2iKfI19z0V .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-k9Bftm2iKfI19z0V .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-k9Bftm2iKfI19z0V .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-k9Bftm2iKfI19z0V .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-k9Bftm2iKfI19z0V .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-k9Bftm2iKfI19z0V .cluster text{fill:#333;}#mermaid-svg-k9Bftm2iKfI19z0V .cluster span{color:#333;}#mermaid-svg-k9Bftm2iKfI19z0V div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-k9Bftm2iKfI19z0V .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-k9Bftm2iKfI19z0V rect.text{fill:none;stroke-width:0;}#mermaid-svg-k9Bftm2iKfI19z0V .icon-shape,#mermaid-svg-k9Bftm2iKfI19z0V .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-k9Bftm2iKfI19z0V .icon-shape p,#mermaid-svg-k9Bftm2iKfI19z0V .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-k9Bftm2iKfI19z0V .icon-shape rect,#mermaid-svg-k9Bftm2iKfI19z0V .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-k9Bftm2iKfI19z0V .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-k9Bftm2iKfI19z0V .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-k9Bftm2iKfI19z0V :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

开始

解析参数

加载模型

读取图片

图片预处理

前向推理

遍历

画框

弹窗显示

按键退出

结束

代码

终端执行 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 视觉应用的快速开发设计提供了参考。

赞(0)
未经允许不得转载:171主机测评 » 【Arduino UNO Q】 边缘 AI 视觉部署方案:人脸检测
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址