基于树莓派的安保巡逻机器人--(一、快速人脸录入与精准人脸识别)

目录

零、前言

一、人脸检测

 二、人脸识别

1、采集人脸

 2、训练人脸识别模型

 3、人脸识别应用

零、前言

        随着智能安防需求的增长,基于人工智能和物联网的安保系统逐渐成为趋势。树莓派因其低成本、高扩展性等特点,成为很多AI项目的理想平台。本文将为大家介绍如何使用树莓派打造一款智能安保巡逻机器人。本篇是系列的第一部分,将聚焦于“快速人脸录入与精准人脸识别”的实现步骤。

        本篇文章旨在通过搭建基于树莓派的安保巡逻机器人,实现人脸录入和识别功能。巡逻机器人将通过摄像头捕捉人脸信息,进行实时识别和数据存储,以实现自动化安保监控

树莓派5B作为一款小巧、功能强大的计算机设备,为快速人脸录入和精准识别提供了一个理想的硬件平台。本文将通过详细的代码示例,讲解如何利用树莓派5B与Python实现一个高效的人脸检测和识别系统。该系统可以实时捕捉人脸信息,进行边缘检测与处理,适用于智能安防、出入控制等多种场景。

一、人脸检测

由于不同需求,首先我们先进行一下人脸检测功能

我们将利用Python的Mediapipe和OpenCV库来完成图像处理,Picamera2库驱动树莓派的摄像头。(Mediapipe库是Google开源的多媒体处理框架,适用于多种机器学习任务;而OpenCV则是一个强大的计算机视觉库,广泛应用于图像处理、模式识别等领域。)以下是主要代码片段及其实现细节。

#!/usr/bin/env python3
# encoding: utf-8import mediapipe as mp
import cv2 as cv
from picamera2 import Picamera2

为了简化人脸检测的实现,我们定义了一个FaceDetector类。该类使用Mediapipe的人脸检测模块,并在初始化时设置最小检测置信度参数minDetectionCon,以控制检测的灵敏度。

class FaceDetector:def __init__(self, minDetectionCon=0.5):# 初始化人脸检测模块,并设置最小检测置信度self.mpFaceDetection = mp.solutions.face_detectionself.facedetection = self.mpFaceDetection.FaceDetection(min_detection_confidence=minDetectionCon)
  • findFaces方法中,首先将捕获的图像从BGR格式转换为RGB格式。这样做是因为Mediapipe库使用的是RGB格式的图像输入。随后,调用self.facedetection.process(img_RGB)来检测人脸。

    def findFaces(self, frame):# 将图像从BGR转换为RGB,因为MediaPipe使用的是RGB格式img_RGB = cv.cvtColor(frame, cv.COLOR_BGR2RGB)# 处理图像,检测人脸results = self.facedetection.process(img_RGB)# 如果检测到人脸,则在图像上绘制矩形框if results.detections:for detection in results.detections:# 获取人脸的边界框相对坐标bboxC = detection.location_data.relative_bounding_boxih, iw, _ = frame.shape  # 获取图像的高度和宽度# 将相对坐标转换为绝对坐标bbox = int(bboxC.xmin * iw), int(bboxC.ymin * ih), \int(bboxC.width * iw), int(bboxC.height * ih)# 在图像上绘制人脸矩形框cv.rectangle(frame, (bbox[0], bbox[1]), (bbox[0] + bbox[2], bbox[1] + bbox[3]), (255, 0, 255), 2)return frame
    

    在主程序中,我们通过Picamera2捕获视频流,将YUYV格式的图像转换为BGR格式,使用findFaces方法来检测人脸,并将检测到的人脸信息实时显示在窗口中

    if __name__ == '__main__':picam2 = Picamera2()config = picam2.create_preview_configuration(main={"format": 'YUYV', "size": (320, 240)})picam2.configure(config)picam2.start()face_detector = FaceDetector(0.75)while True:frame = picam2.capture_array()# 将YUYV格式的图像转换为BGRframe = cv.cvtColor(frame, cv.COLOR_YUV2BGR_YUYV)# 检测人脸并水平翻转图像frame = face_detector.findFaces(cv.flip(frame, 1))cv.imshow('frame', frame) if cv.waitKey(1) & 0xFF == ord('q'): breakcv.destroyAllWindows()
    

完整代码如下:

#!/usr/bin/env python3
# encoding: utf-8
import mediapipe as mp
import cv2 as cv
from picamera2 import Picamera2class FaceDetector:def __init__(self, minDetectionCon=0.5):# 初始化人脸检测模块,并设置最小检测置信度self.mpFaceDetection = mp.solutions.face_detectionself.facedetection = self.mpFaceDetection.FaceDetection(min_detection_confidence=minDetectionCon)def findFaces(self, frame):# 将图像从BGR转换为RGB,因为MediaPipe使用的是RGB格式img_RGB = cv.cvtColor(frame, cv.COLOR_BGR2RGB)# 处理图像,检测人脸results = self.facedetection.process(img_RGB)# 如果检测到人脸,则在图像上绘制矩形框if results.detections:for detection in results.detections:# 获取人脸的边界框相对坐标bboxC = detection.location_data.relative_bounding_boxih, iw, _ = frame.shape  # 获取图像的高度和宽度# 将相对坐标转换为绝对坐标bbox = int(bboxC.xmin * iw), int(bboxC.ymin * ih), \int(bboxC.width * iw), int(bboxC.height * ih)# 在图像上绘制人脸矩形框cv.rectangle(frame, (bbox[0], bbox[1]), (bbox[0] + bbox[2], bbox[1] + bbox[3]), (255, 0, 255), 2)return frameif __name__ == '__main__':picam2 = Picamera2()config = picam2.create_preview_configuration(main={"format": 'YUYV', "size": (320, 240)})picam2.configure(config)picam2.start()face_detector = FaceDetector(0.75)while True:frame = picam2.capture_array()# 将YUYV格式的图像转换为BGRframe = cv.cvtColor(frame, cv.COLOR_YUV2BGR_YUYV)# 检测人脸并水平翻转图像frame = face_detector.findFaces(cv.flip(frame, 1))cv.imshow('frame', frame) if cv.waitKey(1) & 0xFF == ord('q'): breakcv.destroyAllWindows()

 二、人脸识别

1、采集人脸

在实现人脸识别前,我们需要采集用户的人脸图像样本,建立一个基本的人脸数据库。为确保系统的高效和准确性,需采集多张人脸图像以便后续的人脸识别模型可以更好地学习每个用户的特征。

在本部分中,我们将利用OpenCV库采集人脸样本,并将这些图像存储在本地文件夹中。代码如下:

#利用opencv采集人脸(拍照)
import cv2
import os
import time
# 初始化摄像头
cam = cv2.VideoCapture(0)
cam.set(3, 640) # 设置视频宽度为640像素
cam.set(4, 480) # 设置视频高度为480像素# 加载人脸检测的分类器
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 输入用户ID,用于标识不同的用户
face_id = input('\n 输入用户ID并按回车 ==> ')print("\n [信息] 初始化人脸采集。看向摄像头等待...")
# 初始化单独采样人脸计数
count = 0while(True):# 读取摄像头的一帧图像ret, img = cam.read()# 将图像上下翻转img = cv2.flip(img, 1) # 垂直翻转视频图像# 将图像转换为灰度图,以提高处理速度gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测图像中的人脸faces = face_detector.detectMultiScale(gray, 1.3, 5)# 对于检测到的每一个人脸for (x,y,w,h) in faces:# 在图像上绘制矩形框cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)     # 增加人脸计数count += 1# 将捕捉到的人脸保存到datasets文件夹中cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])# 显示处理后的图像cv2.imshow('image', img)print("ok")time.sleep(0.2)# 按ESC退出视频k = cv2.waitKey(100) & 0xff if k == 27:break# 如果采集了30个样本,则停止视频elif count >= 30: break# 清理工作
print("\n [信息] 退出程序并清理资源")
cam.release() # 释放摄像头
cv2.destroyAllWindows() # 关闭所有OpenCV窗口

运行代码,输入用户ID:

按下回车进行人脸信息采集:

 保存数据如下:

 2、训练人脸识别模型

在完成了人脸图像的采集之后,接下来我们需要对这些图像进行训练,以便系统能够识别不同的用户。我们将使用OpenCV的LBPH(局部二值模式直方图)人脸识别算法进行训练。

LBPH (Local Binary Patterns Histogram) 是一种常用于人脸识别的特征提取方法,主要基于局部纹理信息来描述图像特征。它通过分析图像局部区域内像素的灰度关系,提取出具有高度差异性的特征,从而能够在光照、表情变化等方面取得较为鲁棒的识别效果。LBPH 是一种经典且有效的人脸识别方法。

以下是训练模型的代码实现:

import cv2
import numpy as np
from PIL import Image
import os# 人脸图像数据库的路径
path = 'dataset'# 创建LBPH人脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 使用Haar特征分类器进行人脸检测
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");# 函数:获取图像和标签数据
def getImagesAndLabels(path):# 获取数据库中所有图像的路径imagePaths = [os.path.join(path, f) for f in os.listdir(path)]     faceSamples = []  # 存储人脸样本ids = []  # 存储每张人脸的IDfor imagePath in imagePaths:# 打开图像并将其转换为灰度图PIL_img = Image.open(imagePath).convert('L')# 将灰度图转换为numpy数组img_numpy = np.array(PIL_img, 'uint8')# 获取图像文件名中的ID,假设文件名格式为:User.ID.xxx.jpgid = int(os.path.split(imagePath)[-1].split(".")[1])# 检测人脸位置faces = detector.detectMultiScale(img_numpy)# 遍历检测到的人脸区域,将每个区域保存到样本和标签列表中for (x, y, w, h) in faces:faceSamples.append(img_numpy[y:y+h, x:x+w])ids.append(id)return faceSamples, idsprint ("\n [信息] 训练人脸中,请稍候...")
# 获取所有人脸样本和对应的ID
faces, ids = getImagesAndLabels(path)
# 训练LBPH人脸识别器
recognizer.train(faces, np.array(ids))# 将训练好的模型保存到trainer/trainer.yml
recognizer.write('trainer/trainer.yml')  # recognizer.save()在Mac上可用,但在Pi上不可用# 输出训练的人脸数量并结束程序
print("\n [信息] 训练了 {0} 张人脸。程序结束".format(len(np.unique(ids))))

运行代码进行训练,结果将得到一个trainer.yml文件,此文件保存着用户对应的LBPH相关数值

 3、人脸识别应用

在成功训练完人脸识别模型后,我们将进入实际的识别环节。接下来,我们会使用摄像头实时捕捉视频流,并通过模型识别出画面中的人脸。

以下是实时人脸识别的代码实现:

import cv2
import numpy as np
import os
import time# 创建LBPH人脸识别器并加载训练好的模型
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')# 加载Haar特征分类器用于人脸检测
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)font = cv2.FONT_HERSHEY_SIMPLEX# 初始化ID计数器
id = 0# ID与姓名的对应关系
names = ['None', 'ID=1', 'ID=2', 'ID=3', 'Z', 'W']# 初始化并开始实时视频捕捉
cam = cv2.VideoCapture(0)
cam.set(3, 640)  # 设置视频宽度
cam.set(4, 480)  # 设置视频高度# 定义识别为人脸的最小窗口大小
minW = 0.1 * cam.get(3)
minH = 0.1 * cam.get(4)
frame_count, pTime, cTime = 0, 0, 0 while True:ret, img = cam.read()  # 从摄像头读取图像img = cv2.flip(img, 1)  # 垂直翻转图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图# 检测人脸faces = faceCascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5,minSize=(int(minW), int(minH)),)# 遍历检测到的人脸for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 绘制人脸框id, confidence = recognizer.predict(gray[y:y + h, x:x + w])  # 识别人脸if confidence < 70:  # 置信度小于70id = names[id]  # 获取对应的姓名confidence = "  {0}%".format(round(100 - confidence))  # 计算置信度else:id = "unknown"  # 识别为未知confidence = "  {0}%".format(round(100 - confidence))# 显示姓名和置信度cv2.putText(img, str(id), (x + 5, y - 5), font, 1, (255, 255, 255), 2)cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (255, 255, 0), 1)frame_count += 1  # 帧计数cTime = time.time()  # 当前时间fps = 1 / (cTime - pTime)  # 计算FPSpTime = cTime  # 更新上一帧时间text = "FPS : " + str(int(fps))  # 显示FPScv2.putText(img, text, (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 1)cv2.imshow('camera', img)  # 显示摄像头画面k = cv2.waitKey(10) & 0xff  # 按'ESC'键退出视频if k == 27:break# 清理工作
print("\n [信息] 退出程序并清理资源")
cam.release()  # 释放摄像头
cv2.destroyAllWindows()  # 关闭所有OpenCV窗口

此方法可以快速人脸录入(30秒)与模型训练最后依旧可以精准人脸识别。

        本文介绍了如何在树莓派5B上实现快速的人脸录入与精准的人脸识别。从采集人脸图像、训练人脸数据库,再到使用LBPH进行实时识别,我们完成了一套简单但有效的人脸识别系统。LBPH特征提取方法在资源有限的设备上表现出色,能够在保证准确率的同时实现实时检测。

完整资料与代码下载:【免费】基于树莓派的安保巡逻机器人-(一、快速人脸录入与精准人脸识别)资源-CSDN文库

参考资料:基于Anirban Kar的代码https://github.com/thecodacus/Face-Recognition

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

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

相关文章

软件测试学习笔记丨Flask操作数据库-对象与数据模型

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/23440 对象与数据模型 数据模型&#xff1a;是数据特征的抽象&#xff0c;抽象层次上描述了系统的静态特征、动态行为和约束条件&#xff0c;为数据库系统的信息表示与操作提供一个抽象的框架…

信号量本质 信号量实验(控制车辆运行,优先级反转)互斥量

信号量本质 前面介绍的队列(queue)可以用于传输数据&#xff1a;在任务之间、任务和中断之间。 消息队列用于传输多个数据&#xff0c;但是有时候我们只需要传递状态&#xff0c;这个状态值需要用一个 数值表示&#xff0c;比如&#xff1a; ⚫ 卖家&#xff1a;做好了 1 …

【STL_list 模拟】——打造属于自己的高效链表容器

一、list节点 ​ list是一个双向循环带头的链表&#xff0c;所以链表节点结构如下&#xff1a; template<class T>struct ListNode{T val;ListNode* next;ListNode* prve;ListNode(int x){val x;next prve this;}};二、list迭代器 2.1、list迭代器与vector迭代器区别…

VLAN间通信以及ospf配置

目录 1.基础知识介绍 1.1 什么是VLAN&#xff1f; 1.2 VLAN有什么用&#xff1f; 1.3 不同VLAN如何实现通信&#xff1f; 1.4 什么是路由汇总&#xff1f; 1.4.1 路由汇总的好处&#xff1a; 2. 实验 2.1 网络拓扑设计 2.2 实验配置要求 2.2.1 三层交换配置&#xff…

UE4_Niagara基础实例—13、通过纹理采样来创造粒子

效果&#xff1a; 知识点&#xff1a; 1、纹理采样目前仅支持GPU粒子运行&#xff08;Texture sampling is only supported on the GPU at the moment.&#xff09; 2、网格位置输出每个粒子在网格中的归一化位置。我们使用该值来采样纹理&#xff0c;就像它是UV一样&#xff…

前段(vue)

目录 跨域是什么&#xff1f; SprinBoot跨域的三种解决方法 JavaScript 有 8 种数据类型&#xff0c; 金额的用什么类型。 前段 区别 JQuery使用$.ajax()实现异步请求 Vue 父子组件间的三种通信方式 Vue2 和 Vue3 存在多方面的区别。 跨域是什么&#xff1f; 跨域是指…

基于SpringBoot+Vue实现智能停车收费系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…

Linux云计算 |【第五阶段】CLOUD-DAY10

主要内容&#xff1a; 部署Dashboard、部署Prometheus、部署HPA集群 一、Dashboard介绍 Dashboard是基于网页的Kubernetes用户界面&#xff0c;可以使用Dashboard将容器应用部署到Kubernetes集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。可以使用Da…

无人机避障——4D毫米波雷达Octomap从点云建立三维栅格地图

Octomap安装 sudo apt-get install ros-melodic-octomap-ros sudo apt-get install ros-melodic-octomap-msgs sudo apt-get install ros-melodic-octomap-server sudo apt-get install ros-melodic-octomap-rviz-plugins # map_server安装 sudo apt-get install ros-melodic-…

【GIN】go-gin 中 validator 验证功能

文章目录 前言一、基础用法二、常用字段说明常用字段说明1. required2. len3. min 和 max4. gte 和 lte 、 gt 和 lt 、ne5. oneof6. email7. url 三、示例代码运行效果 总结 前言 在 Go 中使用 Gin 框架时&#xff0c;BindJSON 可以将 JSON 请求体中的数据绑定到结构体上&…

使用Jupyter Notebook进行数据科学项目

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jupyter Notebook进行数据科学项目 Jupyter Notebook 简介 安装 Jupyter Notebook 创建和管理 Notebook 编写和运行代码 示例…

【MyBatis源码】CacheKey缓存键的原理分析

文章目录 Mybatis缓存设计缓存KEY的设计CacheKey类主体CacheKey组成CacheKey如何保证缓存key的唯一性 Mybatis缓存设计 MyBatis 每秒过滤众多数据库查询操作&#xff0c;这对 MyBatis 缓存键的设计提出了很高的要求。MyBatis缓存键要满足以下几点。 无碰撞&#xff1a;必须保证…

一键式配置适合 Web 开发的Ubuntu系统

大家好&#xff0c;今天给大家分享一个专为Ubuntu设计的Web开发者配置方案Omakub。 项目介绍 Omakub是一个为开发者打造的、经过精心配置的 Ubuntu 环境项目&#xff0c;由 Ruby on Rails 的创造者 David Heinemeier Hansson&#xff08;DHH&#xff09;发起。目的是为了简化他…

Nginx安装配置详解

Nginx Nginx官网 Tengine翻译的Nginx中文文档 轻量级的Web服务器&#xff0c;主要有反向代理、负载均衡的功能。 能够支撑5万的并发量&#xff0c;运行时内存和CPU占用低&#xff0c;配置简单&#xff0c;运行稳定。 写在前 uWSGI与Nginx的关系 1. 安装 Windows 官网 Stabl…

数据库 二

一.数据认识 1.关系型 表与表的关系&#xff1a;核心表 mysql/oracle、SQLServer(微软) SQL 2.非关系型 redis--缓存数据库Map<k,v> NO-SQL&#xff1a;not only sql 二.关系型数据库(R) 1.客户端、数据库服务 2.库(database) CREATE DATABASE xxx_db;//创建库 DR…

开源OCR免费助力法律文档数字化,提升文档管理效率

一、在法律行业&#xff0c;每天需要处理大量纸质文件&#xff0c;从合同到判决书&#xff0c;手动录入不仅费时&#xff0c;还容易出错。为解决这一问题推出了一款免费开源的OCR智能识别平台&#xff0c;通过先进的光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;将…

零售EDI:HornBach EDI 项目案例

HornBach 是一家总部位于德国的家居和建筑材料零售商&#xff0c;成立于1968年。它以大型仓储式商店而闻名&#xff0c;提供广泛的产品&#xff0c;包括建筑材料、园艺、家居装饰和工具等。 近期我们帮助HornBach的供应商W公司成功实现了与HornBach的EDI直连&#xff0c;除了满…

jupyter如何切换内核

01、写在前面 Jupyter是一个开源的交互式笔记本工具&#xff0c;支持多种编程语言&#xff0c;包括Python、R、Julia 等。它最初是作为IPython 笔记本的一个分支而开发的&#xff0c;后来逐渐发展成为一个独立的项目。Jupyter的名字来源于它支持的三种编程语言&#xff1a;Juli…

STM32ZET6-USART使用

一、原理说明 STM32自带通讯接口 通讯目的 通信方式&#xff1a; 全双工&#xff1a;通信时可以双方同时通信。 半双工&#xff1a;通信时同一时间只能一个设备发送数据&#xff0c;其他设备接收。 单工&#xff1a;只能一个设备发送到另一个设备&#xff0c;例如USART只有…