当前位置: 首页 > news >正文

嵌入式人工智能(OpenCV-基于树莓派的人脸识别与入侵检测)

1、人脸识别

人脸识别是一种技术,通过检测、跟踪和识别人脸上的关键特征,以确认人脸的身份。它通常用于安保系统、身份验证、社交媒体和人机交互等领域。

人脸识别技术的基本原理是先通过图像处理和计算机视觉算法,提取人脸的特征点和特征描述。然后将这些特征与事先录入的人脸数据库进行比对,以确定人脸的身份。

在人脸识别技术中,一般包含以下步骤:人脸检测、人脸对齐、特征提取和特征匹配。人脸检测是指在图像或视频中检测到人脸的位置;人脸对齐是为了使得人脸特征点在后续处理中更容易提取;特征提取是指将人脸图像转换为具有辨识度的特征向量;特征匹配是将提取出的特征与数据库中的特征进行比对。

目前人脸检测的方法主要有两大类:基于知识和基于统计。

  • 基于知识的方法:主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。主要包括模板匹配、人脸特征、形状与边缘、纹理特性、颜色特征等方法。
  • 基于统计的方法:将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。主要包括主成分分析与特征脸、神经网络方法、支持向量机、隐马尔可夫模型、Adaboost算法等。

人脸识别技术的应用非常广泛,包括但不限于身份识别、门禁系统、公安系统、智能手机解锁、相册分类、人机交互等。随着深度学习的快速发展,人脸识别技术的准确率和效果得到了显著提升,越来越多的领域开始应用这项技术。然而,人脸识别技术也涉及到一些隐私和安全问题,需要合理的使用和管理。

2、OpenCV之Haar级联检测器

人脸识别在OpenCV上也有专门的算法实现,OpenCV使用基于Haar特征的级联分类器,对级联分类器进行特定的训练可以使OpenCV自带的检测器在检测时的结果更加准确。这里的检测器即OpenCV包中的haarcascades文件夹下的XML文件。这些文件可以检测静止的图像或摄像头中得到的人脸。

opencv中内置了已经训练好的级联人脸、眼睛、嘴部等检测器,以.XML格式存储,可以将它们应用于图片及实时视频流的检测。opencv的人脸检测级联检测器是最稳定和准确的,但在许多情况下眼睛检测和嘴巴检测的效果要差上许多。如果要对眼睛和嘴巴进行检测,可以尝试python、dlib、opencv工作流,它的效果更好、速度更快。
Haar级联算法是OpenCV最流行的目标检测算法,主要优点是速度快,尽管许多算法(如HOG+线性SVM、SSDs、更快的R-CNN、YOLO等等)比Haar级联算法更精确。但如果需要纯粹的速度,就是无法打败OpenCV的Haar cascades。Haar级联的缺点是容易出现假阳性检测,应用于推理/检测时需要进行参数调整。

haarcascade_frontalface_default.xml:检测面部
haarcascade_eye.xml:检测左眼和右眼
haarcascade_smile.xml:检测面部是否存在嘴部
haarcascade_eye_tree_eyeglasses.xml:检测是否带墨镜
haarcascade_frontalcatface.xml:检测猫脸
haarcascade_frontalcatface_extended.xml:检测猫脸延伸
haarcascade_frontalface_alt.xml:检测人脸属性
haarcascade_frontalface_alt_tree.xml
haarcascade_frontalface_alt2.xml
haarcascade_fullbody.xml:检测全身
haarcascade_lefteye_2splits.xml:检测左眼
haarcascade_licence_plate_rus_16stages.xml:检测证件
haarcascade_lowerbody.xml:检测下半身
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml:检测右眼
haarcascade_russian_plate_number.xml:检测俄罗斯字母车牌号
haarcascade_upperbody.xml:检测上半身

3、在检测的人脸上绘制矩形

import cv2 as cvdef StaticDetect(filename):"""静态图像"""# 创建一个级联分类器 加载一个 .xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器.face_cascade = cv.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')# 加载图像img = cv.imread(filename)# 转换为灰度图gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 进行人脸检测,传入scaleFactor,minNeighbors,分别表示人脸检测过程中每次迭代时图像的压缩率以及# 每个人脸矩形保留近似数目的最小值# 返回人脸矩形数组faces = face_cascade.detectMultiScale(gray_img, 1.3, 5)for (x, y, w, h) in faces:# 在原图像上绘制矩形img = cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)cv.namedWindow('Face Detected!')cv.imshow('Face Detected!', img)# 使程序停留,等待任意键按下,参数表示停留的时间,0表示无限长k = cv.waitKey(0)# 按下ESC键(ASCII码为27)后,销毁所有窗口,终止程序if k == 27:cv.destroyAllWindows()if __name__ == '__main__':filename = 'face.png'StaticDetect(filename)

单人和多人脸均可检测。

4、MediaPipe

Mediapipe 由 Google Research 于 2020 年推出,旨在为计算机视觉研究人员和开发者提供一个易于使用、高性能的框架。Mediapipe 提供了多种预训练模型和算法,涵盖了人脸检测、手势识别、姿态估计等领域。

MediaPipe是用于构建多模态(例如视频、音频或任何时间序列数据)、跨平台(即eAndroid、IOS、web、边缘设备)应用ML管道的框架。

以上2个模块都可以实现人脸检测,经过在树莓派上的实验发现,使用MediaPipe较OpenCV速度快,本文将利用MediaPipe实现检测人脸功能,并将检测到的人脸图像保存下来。

5、实验代码

本实验将检测到人脸信息,并将实时检测到的图像保存到image文件夹内,以时间戳命名,每秒一个文件。

"""
Face Detection Module
By: Computer Vision Zone
Website: https://www.computervision.zone/
"""import cv2,os,time
import mediapipe as mp
from datetime import datetimeclass FaceDetector:"""Find faces in realtime using the light weight model provided in the mediapipelibrary."""def __init__(self, minDetectionCon=0.5):""":param minDetectionCon: Minimum Detection Confidence Threshold"""self.minDetectionCon = minDetectionConself.mpFaceDetection = mp.solutions.face_detectionself.mpDraw = mp.solutions.drawing_utilsself.faceDetection = self.mpFaceDetection.FaceDetection(self.minDetectionCon)def findFaces(self, img, draw=True):"""Find faces in an image and return the bbox info:param img: Image to find the faces in.:param draw: Flag to draw the output on the image.:return: Image with or without drawings.Bounding Box list."""imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)self.results = self.faceDetection.process(imgRGB)bboxs = []if self.results.detections:for id, detection in enumerate(self.results.detections):bboxC = detection.location_data.relative_bounding_boxih, iw, ic = img.shapebbox = int(bboxC.xmin * iw), int(bboxC.ymin * ih), \int(bboxC.width * iw), int(bboxC.height * ih)cx, cy = bbox[0] + (bbox[2] // 2), \bbox[1] + (bbox[3] // 2)bboxInfo = {"id": id, "bbox": bbox, "score": detection.score, "center": (cx, cy)}bboxs.append(bboxInfo)if draw:img = cv2.rectangle(img, bbox, (255, 0, 255), 2)cv2.putText(img, f'{int(detection.score[0] * 100)}%',(bbox[0], bbox[1] - 20), cv2.FONT_HERSHEY_PLAIN,2, (255, 0, 255), 2)return img, bboxsdef Timestamp_Get():now = datetime.now()datetime_str = now.strftime('%Y-%m-%d %H:%M:%S').replace(':','-').replace(' ','_')datetime_str = datetime_str+'.jpg'return datetime_strdef main():cap = cv2.VideoCapture(0)detector = FaceDetector()file_path='./image'while True:success, img = cap.read()img, bboxs = detector.findFaces(img)if bboxs:time.sleep(0.02)if bboxs:# bboxInfo - "id","bbox","score","center"center = bboxs[0]["center"]cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)file_name = os.path.join(file_path,Timestamp_Get())cv2.imwrite(file_name,img)time.sleep(1)cv2.imshow("Image", img)if cv2.waitKey(20)  == ord('q'):breakcap.release()cv2.destroyAllWindows()elif cv2.waitKey(20)  == ord('s'):time.sleep(1)file_name = os.path.join('./image',Timestamp_Get())cv2.imwrite(file_name,img)print(file_name+'保存成功')time.sleep(1)if __name__ == "__main__":main()

(1)人脸检测类FaceDetector的findFaces方法可以检测人脸在整个图像的位置,经试验,不光是人脸,人手也可以被检测。还有检测的概率,以及人脸的中心像素点的位置。

(2)Timestamp_Get,获取当前的时间戳,作为文件名保存。

file_name = os.path.join(file_path,Timestamp_Get())
cv2.imwrite(file_name,img)

(3)人脸检测的情况可能会出现误检、抖动的情况,我们通过得分和消抖来进行局部调整。

score的类型是google._upb._message.RepeatedScalarContainer,它 是 Protocol Buffers 中的一个内部类,用于表示重复的标量值(即,一个数组)。要将此容器转换为浮点数列表,再转成float

这样检测目标低于60%概率的人脸就不会被保存。

(4)该程序支持自动保存,也支持手动保存。

随便在手机上找个美女试试效果吧

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AI学习指南深度学习篇-卷积神经网络(CNN)简介
  • unity自动添加头部注释脚本
  • 机器学习——支持向量机(SVM)(1)
  • 用Manim创建条形图【BarChart】
  • IPSec之数据封装协议
  • 【practise】逆波兰表达式求值
  • 2024年大家最爱的翻译工具大盘点
  • cmake基于语法和应用
  • 【Go】 HTTP编程3-路由httprouter
  • VisionPro二次开发学习笔记12-使用CogToolGroup控件进行图像检测
  • 五. TensorRT API的基本使用-custom-trt-plugin
  • js入门经典学习小结
  • 【Python】PyWebIO 初体验:用 Python 写网页
  • 006 | 资本资产定价模型 (CAPM)
  • MySQL学习(20):InnoDB引擎逻辑架构、物理架构
  • canvas 绘制双线技巧
  • echarts的各种常用效果展示
  • Flex布局到底解决了什么问题
  • iOS小技巧之UIImagePickerController实现头像选择
  • js中forEach回调同异步问题
  • magento 货币换算
  • mysql_config not found
  • Vue2 SSR 的优化之旅
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 分布式事物理论与实践
  • 回顾 Swift 多平台移植进度 #2
  • 聊聊redis的数据结构的应用
  • 前言-如何学习区块链
  • 实战|智能家居行业移动应用性能分析
  • 微服务核心架构梳理
  • 我的zsh配置, 2019最新方案
  • 我看到的前端
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 第二十章:异步和文件I/O.(二十三)
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • # centos7下FFmpeg环境部署记录
  • # 数仓建模:如何构建主题宽表模型?
  • #git 撤消对文件的更改
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C++17) optional的使用
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (学习日记)2024.01.19
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)用.Net的File控件上传文件的解决方案
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .cn根服务器被攻击之后
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net dataexcel 脚本公式 函数源码