嵌入式人工智能(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)该程序支持自动保存,也支持手动保存。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397113.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ML】Pre-trained Language Models及其各种微调模型的实现细节和特点

Pre-trained Language Models及其各种微调模型的实现细节和特点 1. Pre-trained Language Models2. semi-supervised Learning3. zero-shot4. Parameter-Efficient Fine-Tuning4.1 含义:4.2 实现方式: 5. LoRA5.1 LoRA 的主要特点:5.2 LoRA 的…

Pytorch人体姿态骨架生成图像

ControlNet是一个稳定扩散模型,可以复制构图和人体姿势。ControlNet解决了生成想要的确切姿势困难的问题。 Human Pose使用OpenPose检测关键点,如头部、肩膀、手的位置等。它适用于复制人类姿势,但不适用于其他细节,如服装、发型和…

Linux中apache服务安装与mysql安装

目录 一、apache安装 二、MySQL安装 一、apache安装 准备环境:一台虚拟机、三个安装包(apr-1.6.2.tar.gz、apr-util-1.6.0.tar.gz、httpd-2.4.29.tar.bz2) 安装过程: tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar xf http…

Burp Suite的使用和文件上传漏洞靶场试验

第一步:分析如何利用漏洞,通过对代码的查阅发现,代码的逻辑是先上传后删除,意味着,我可以利用webshell.php文件在上传到删除之间的间隙,执行webshell.php的代码,给上级目录创建一个shell.php木马…

IDEA右键新建时没有Java Class选项

项目场景: IDEA右键新建时没有Java Class选项 问题描述 IDEA右键新建时没有Java Class选项 原因分析: 提示:这里填写问题的分析: 例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()和 Ha…

【扒代码】ope.py

文件目录: 引用方式 if not self.zero_shot: # 非零样本情况下,计算边界框的宽度和高度 box_hw torch.zeros(bboxes.size(0), bboxes.size(1), 2).to(bboxes.device) box_hw[:, :, 0] bboxes[:, :, 2] - bboxes[:, :, 0] # 宽度 box_hw[:, :, 1] bbox…

Docker in 100 Seconds

Docker a tool that can package software into containers that run reliably in any environment, but what is a container and why do you need one? Let’s imagine you built up an app with cobalt that runs some weird flavor of Linux. You want to share this app…

idea中好用的插件

输入法自动切换插件 自动切换输入法插件:Smart Input。编写代码时自动切换到英文输入法,注释代码自动切换为中文输入法。极大的提升我们的编码效率。 MyBatisX插件 MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。主要用于XML映射配…

吴恩达机器学习COURSE2 WEEK2

COURSE2 WEEK2 模型训练的细节 定义模型,即指定如何在给定输入特征 x x x 以及参数 w w w 和 b b b 的情况下计算输出 指定损失函数 L ( f w ⃗ , b ( x ⃗ ) , y ) L(f_{\vec w, b}(\vec x),y) L(fw ,b​(x ),y) 指定成本函数 J ( w ⃗ , b ) 1 m ∑ i 1 …

Linux系统驱动(十三)Linux内核定时器

文章目录 一、内核定时器原理二、定时器API三、使用定时器让LED灯闪烁四、使用定时器对按键进行消抖 一、内核定时器原理 内核当前时间通过jiffies获取,它是内核时钟节拍数,在linux内核启动的时候,jiffies开始(按照一定频率&…

【数据结构】顺序结构实现:特殊完全二叉树(堆)+堆排序

二叉树 一.二叉树的顺序结构二.堆的概念及结构三.堆的实现1.堆的结构2.堆的初始化、销毁、打印、判空3.堆中的值交换4.堆顶元素5.堆向上调整算法:实现小堆的插入6.堆向下调整算法:实现小堆的删除7.堆的创建1.堆向上调整算法:建堆建堆的时间复…

CentOS 安装Redis

在 CentOS 安装 Redis 操作系统:centos-7.9.2009-Core 1. 更新系统 首先,确保你的系统是最新的: sudo yum update -y2. 安装 EPEL 仓库 Redis 可能不在默认的 CentOS 仓库中,因此你需要安装 EPEL(Extra Packages f…

TCP详解及其在音视频传输中的应用

传输控制协议(TCP,Transmission Control Protocol)是互联网协议栈中至关重要的传输层协议。它提供了可靠、面向连接的数据传输服务,广泛应用于各种网络应用中。对于音视频传输,虽然TCP协议并不是最常用的传输协议&…

LVS实验——部署DR模式集群

目录 一、实验环境 二、配置 1、LVS 2、router 3、client 4、RS 三、配置策略 四、测试 1.Director服务器采用双IP桥接网络,一个是VPP,一个DIP 2.Web服务器采用和DIP相同的网段和Director连接 3.每个Web服务器配置VIP 4.每个web服务器可以出外网…

《Advanced RAG》-11-RAG查询分类和细化

总结 文章介绍了两种高级的检索增强生成(RAG)技术:自适应 RAG 和 RQ-RAG,以及它们在问题复杂性学习和查询细化方面的应用和优势,以及如何通过小型模型的训练来提高这些技术的性能。 摘要 传统 RAG 技术虽然能够减少大型…

「MyBatis」数据库相关操作2

🎇个人主页 🎇所属专栏:Spring 🎇欢迎点赞收藏加关注哦! #{} 和 ${} 我们前面都是采用 #{} 对参数进行赋值,实际上也可以用 ${} 客户端发送⼀条 SQL 给服务器后,大致流程如下: 1.…

51单片机之动态数码管显示

一、硬件介绍 LED数码管是一种由多个发光二极管(LED)封装在一起,形成“8”字型的显示器件。它广泛用于仪表、时钟、车站、家电等场合,用于显示数字、字母或符号。 通过控制点亮a b c d e f g dp来显示数字,本实验开发板…

前端八股文笔记【三】

JavaScript 基础题型 1.JS的基本数据类型有哪些 基本数据类型:String,Number,Boolean,Nndefined,NULL,Symbol,Bigint 引用数据类型:object NaN是一个数值类型,但不是…

十三、代理模式

文章目录 1 基本介绍2 案例2.1 Sortable 接口2.2 BubbleSort 类2.3 SortTimer 类2.4 Client 类2.5 Client 类的运行结果2.6 总结 3 各角色之间的关系3.1 角色3.1.1 Subject ( 主体 )3.1.2 RealObject ( 目标对象 )3.1.3 Proxy ( 代理 )3.1.4 Client ( 客户端 ) 3.2 类图 4 动态…

Java网络编程、TCP、UDP、Socket通信---初识版

标题 InetAddress----IP地址端口号协议(UDP/TCP)JAVA操作-UDP一发一收模式多发多收 JAVA操作-TCP一发一收多发多收 实现群聊功能BS架构线程池优化 InetAddress----IP地址 端口号 协议(UDP/TCP) JAVA操作-UDP 一发一收模式 多发多收…