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

news2024/9/22 4:12:32

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 cv

def 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 datetime

class FaceDetector:
    """
    Find faces in realtime using the light weight model provided in the mediapipe
    library.
    """

    def __init__(self, minDetectionCon=0.5):
        """
        :param minDetectionCon: Minimum Detection Confidence Threshold
        """

        self.minDetectionCon = minDetectionCon
        self.mpFaceDetection = mp.solutions.face_detection
        self.mpDraw = mp.solutions.drawing_utils
        self.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_box
                ih, iw, ic = img.shape
                bbox = 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, bboxs


def Timestamp_Get():
    now = datetime.now()
    datetime_str = now.strftime('%Y-%m-%d %H:%M:%S').replace(':','-').replace(' ','_')
    datetime_str = datetime_str+'.jpg'
    return datetime_str

def 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'):
            break
            cap.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.coloradmin.cn/o/1994290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代理模式Proxy

一、代理模式(Proxy) 1.代理模式的定义 代理模式给某一个对象提供一个代理对象,并由代理对象控制对真实对象的访问,起到对代理对象已有功能的增强 通俗的来讲代理模式就是我们生活中常见的中介。 2.作用 中介隔离作用&#x…

2024 年的 Node.js 生态系统

数据来源于 Node.js Toolbox,网站展示了 Node.js 生态系统中积极维护且流行的库。

在 Duo S 上使用 TDL SDK 高效部署人脸检测模型

TDL SDK 是一款集成算法开发包,提供了便捷的编程接口,使开发者们能够更快、高效地将各种深度学习技术应用于自己的产品和服务中。无论开发者是否是深度学习领域的专家,有了TDL SDK作为助手,都能轻松构建智能应用。 Milk-V DuoS 是…

7.4.分支限界法概率算法近似算法数据挖掘算法智能优化算法

了解,没有考过,基本上不会考 分支限界法 分支限界法:与回溯法类似,同样是在问题的解空间树上搜索问题解的一种算法,它常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。回溯…

【AI大模型】LangChain框架:示例选择器与输出解析器携手,编织NLP高效精准之网

文章目录 前言一、示例选择器1.介绍及应用2.自定义示例选择器案例:AI点评姓名 3.基于长度的示例选择器案例:对输入内容取反 4.基于最大边际相关性(MMR)的示例选择器案例:得到输入的反义词 5.基于n-gram重叠的示例选择器6.综合案例 二、输出解…

深入探索String AOP想详情

一.AOP的概述 AOP是Spring框架的第⼆⼤核⼼(第⼀⼤核⼼是IoC) Q:什么是AOP? A:Aspect Oriented Programming(⾯向切⾯编程) 什么是⾯向切⾯编程呢? 切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程. 什么是⾯向特…

鸿蒙HarmonyOS开发:@Observed装饰器和@ObjectLink装饰器:监听嵌套类对象属性变化

文章目录 一、装饰器二、概述三、限制条件四、装饰器说明五、Toggle组件1、子组件2、接口3、ToggleType枚举4、事件 六、示例演示1、代码2、效果 一、装饰器 State装饰器:组件内状态Prop装饰器:父子单向同步Link装饰器:父子双向同步Provide装…

Linux云计算 |【第二阶段】NETWORK-DAY1

主要内容: 计算机网络概述、网络拓扑结构、OSI参考模型、eNSP、交换机及原理 一、计算机网络概述 计算机网络是指将多台计算机或设备通过通信线路连接起来,以便它们能够相互交换信息和共享资源的系统。计算机网络的目的是实现数据通信和资源共享&#…

生成式人工智能安全评估体系构建

文章目录 前言一、人工智能安全治理的现状1.1 国际安全治理现状1.2 国内安全治理现状二、构建人工智能安全评估体系1.1 需要对生成式人工智能技术的安全性、可靠性、可控性、公平性等维度进行全面的考量。1.2 应对生成式人工智能全维度风险。1.3 在体系化应对框架中,应明确法律…

[Meachines] [Easy] Traverxec Nostromo RCE+SSH-私钥RSA解密+journalctl权限提升

信息收集 IP AddressOpening Ports10.10.10.165TCP:22,80 $ nmap -p- 10.10.10.165 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION …

nfc苹果手机怎么开启?3招就教会你

在数字化时代,nfc技术已成为智能手机的一项重要功能,它让我们的设备能够进行无线数据交换,实现便捷的移动支付、文件传输等操作。那么,nfc苹果手机怎么开启呢?如果你想要充分利用这一技术,那么本文将为你提…

git推送错误-->远程分支比本地的分支更新,无法直接推送

每次上传本地修改好的代码的时候,十次有八次都会出现这样的问题!!(暴躁!!!) 现在写个帖子记录一下,这个问题目前我还没有解决,欢迎懂的佬指点一下. 情景: 我在本地仓库做了一些代码的修改,准备上传到远程仓库上,下边是上传步骤: git add . # 将所有的修改都提交到缓冲区git …

免费获取!Windows10 32位纯净版:无捆绑更安全!

今日,系统之家小编给大家分享2024最新的Windows10纯净版32位系统,该版本系统不包含任何捆绑软件,系统资源占用少,运作流畅,适合老旧电脑安装。系统安装起来特别简单,推荐大家使用硬盘安装,即便是…

大黄蜂能飞的起来吗?

Bumblebee argument 虽然早期的空气动力学证明大黄蜂不能飞行——因为体重太重,翅膀太薄,但大黄蜂并不知道,所以照飞不误。 背景 在20世纪初,‌科学家们通过研究发现,‌大黄蜂的身体与翼展的比例失调,‌按照…

OpenAI Embedding效果表现不佳:那如何评估选择Embedding?

OpenAI Embedding效果表现不佳 对文本进行Embedding是大模型应用中必不可少的一步, 虽然大模型OpenAI是最好的, 但OpenAI的Embedding却不是。本文Embedding评估的具体流程, 代码, 以及结论。 如果仅关心代码 & 结论&#xf…

软件项目质量管理体系,软件评审,资质认证,安全建设及项目管理匹配资料(原件参考)

软件项目质量管理体系是指一套系统化的管理方法、流程、工具和文档,旨在确保软件项目从需求分析、设计、开发、测试到部署和维护的整个生命周期中,都能达到预定的质量标准和客户期望。该体系通过明确的角色和责任、标准化的工作流程、有效的质量控制和持…

NC 找到搜索二叉树中两个错误的节点

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 一棵二叉树原…

Windows系统下的MATLAB 虚拟机中Ubuntu系统的ROS通讯

在Windows系统下的MATLAB与虚拟机中Ubuntu系统的ROS进行通讯,主要涉及到网络配置、环境变量设置以及MATLAB与ROS的接口调用。以下是一个详细的步骤说明: 一、网络配置 设置虚拟机网络: 确保虚拟机(Ubuntu系统)的网络…

7-3 单机多卡并行

一台机器可以安装多个GPU(1-16)在训练和预测时,我们将一个小批量计算切分到多个GPU上来达到加速的目的 同样一个小批量,让用多个GPU同时运行来一起完成这个计算梯度的过程常用的切分方案有 数据并行 模型并行 通道并行&#xff…

中国中医科学院某医院:监控易7.0开启一体化运维新篇章

在首都北京的医疗领域中,中国中医科学院某医院作为佼佼者,一直致力于为患者提供高质量的医疗服务。然而,随着医院业务的不断扩展和IT系统的日益复杂,如何确保IT基础资源的稳定运行,成为了医院面临的一大挑战。为了应对…