树莓派 --- 人脸口罩识别智能监控
目录
初步效果设想
像SIRI那样的语音唤醒,开启服务
只有当摄像头检测到人脸时,舵机才开始调整位置,让人脸保持C位
检测人脸是否戴口罩了,没带就发出“提示”,戴了就不管
长时间不戴例如8s,就拍一张照,并发到我的qq邮箱
应用场景:疫情期间,超市、食堂、餐厅用该装置,相比让工作人员去提醒,可以省去大量人力、财力
分五大模块开发:语音唤醒、控制舵机、人脸追踪定位、人脸口罩识别、发送人脸图片至qq邮箱
1.语音唤醒模块
2.控制舵机模块
用两个舵机做一个二自由度云台, 云台外壳可从淘宝买
参考博客
①servoControl.py封装了controlTwoServos(pin1, angle1, pin2, angle2)方法,用来控制舵机
pin1、pin2分别指的是舵机1、舵机2的信号线所接引脚(BCM编码方式)
angle1、angle2分别指舵机1、舵机2要旋转的角度
舵机1控制水平旋转方向, 舵机2控制垂直旋转方向
servoControl.py
import RPi.GPIO as GPIO
from time import sleepGPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)# 旋转角度转换到PWM占空比
def angleToDutyCycle(angle):return 2.5 + angle / 180.0 * 10# 控制两个舵机的函数
# pin1、pin2分别指的是舵机1、舵机2的信号线所接引脚
# angle1、angle2分别指舵机1、舵机2要旋转的角度
def controlTwoServos(pin1, angle1, pin2, angle2):GPIO.setup(pin1, GPIO.OUT, initial=False)GPIO.setup(pin2, GPIO.OUT, initial=False)p1 = GPIO.PWM(pin1, 50) # 舵机1初始频率为50HZp1.start(angleToDutyCycle(90)) # 舵机1初始化角度为90sleep(0.5)p1.ChangeDutyCycle(angleToDutyCycle(angle1)) p2 = GPIO.PWM(pin2, 50) # 舵机2初始频率为50HZp2.start(angleToDutyCycle(90)) # 舵机2初始化角度为90p2.ChangeDutyCycle(angleToDutyCycle(angle2))sleep(0.5)
②测试
main.py (main.py、servoControl.py在同一目录)
from servoControl import controlTwoServosif __name__ == '__main__':controlTwoServos(23, 80, 24, 80)
测试运行 python3 main.py
3.人脸追踪定位模块
参考博客
算法如下(参考我上面画的图):
① 我这里规定摄像头拍摄的照片分辨率 640 x 480,所以照片中心坐标(320, 240)
② 利用face_recognition库中的face_locations()函数,算出人脸框的中心坐标
face_locations()会返回一个list,有几个人脸,list就有几个tuple,tuple=(top,right,bottom,left)
top指人脸框上边框到x轴的距离,right指人脸框右边框到y轴的距离
bottom指人脸框下边框到x轴的距离,left指人脸框左边框边到y轴的距离
人脸框的中心坐标((left+right)/2, (top+bottom)/2)
③ 根据照片中心坐标和人脸框的中心坐标很容易算出△x,△y
后面算法参考博客 博客地址
faceTracking.py
# coding = utf-8
import face_recognition as fr
import cv2
from time import sleep
from servoControl import controlTwoServoswhile True:video_capture = cv2.VideoCapture(0) # 创建视频对象,打开摄像头print('Capturing image...')# 摄像头抓取一帧照片# ret是布尔值,读取帧成功返回True,文件读到结尾,返回False(如果你读取的是视频,而不是在线拍摄)# frame就是每一帧的图像,一个三维矩阵# 默认拍摄的画面分辨率是640x480,想改可以去翻opencv官方文档ret, frame = video_capture.read()video_capture.release()# 缩小图片,加快处理速度,fx,fy表示x,y轴方向的缩小系数frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5) rgb_frame = frame[:, :, ::-1] # 将cv2用的BGR颜色转换为face_recognition用的RGB颜色face_locations = fr.face_locations(rgb_frame) # 获取这一帧里所有脸的位置# 如果画面中有人脸,任选一张人脸,记录下它的位置if len(face_locations) > 0:face_location = face_locations[0]top = face_location[0]right = face_location[1]bottom = face_location[2]left = face_location[3]center_x = (top + bottom) / 2center_y = (left + right) / 2print('捕捉到人脸!')else:center_x, center_y = 160, 120dx = (center_x - 160) * 0.3dy = (center_y - 120) * 0.3print(dx)print(dy)# 设置一个阈值,当角度大于3时,才移动if abs(dx) >= 3 or abs(dy) >= 3:x0 = 90 + dxif x0 > 180: # 设置界限,超出范围不再转动,下同x0 = 180elif x0 < 0:x0 = 0y0 = 90 + dyif y0 > 180:y0 = 180elif y0 < 0:y0 = 0controlTwoServos(23, x0, 24, y0)
4.人脸口罩识别模块
鉴于树莓派没有Nivida显卡,树莓派4的显卡是VideoCore VI GPU,树莓派3的显卡我也不清楚,所以很多项目跑不了,调百度的API好像还要花钱o(╥﹏╥)o
我找了一个只需要opencv的项目,但是效果一般
【武汉加油!中国加油!】挑战七天 实现机器视觉检测有没有戴口罩系统——第四五六七天_云敬山-CSDN博客
我又找了一个基于opencv的,感觉可以
博客地址
项目地址
环境配置:安装opencv、numpy和pygame
pip3 install opencv-python
pip3 install numpy==1.21.4 # 安装numpy,我这里指定了版本
pip3 install pygame
我这里安装的opencv版本是4.5.4,默认有dnn模块,opencv如果版本低了好像还要安装扩展,反正保证要有dnn模块
在windows上跑没问题,在树莓派上跑有点问题,我改了一下
后来我还做了一点改动,察觉没有戴口罩就播放提示语音,还有,视频窗口就不展示了,树莓派配置差点
5.图片发送模块
①先基于下文进行配置
树莓派 --- 开机自动发送IP到自己的QQ邮箱
②send_pic.py封装一个send_mail(file_path)方法,只要传入图片路径file_path,就能实现图片发送到我的qq邮箱
send_pic.py
# coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart # 创建附件类型# 设置发件人和收件人信息
my_sender='xxxxxxxxxxxxxxxxx' # 发件人邮箱账号
my_pass = 'xxxxxxxxxxxxxxxxx' # 发件人邮箱密码(之前获取的授权码)
my_user='xxxxxxxxxxxxxxxxx' # 收件人邮箱账号
msg = MIMEMultipart('related') # 邮件信息为空,相当于信封,related表示使用内嵌资源的形式,将邮件发送给对方def send_mail(file_path):ret=Truetry:# 发送信息内容msg_html = MIMEText('自拍照', 'html', 'utf-8')msg.attach(msg_html)# 发送图片,以附件形式msg_image = MIMEText(open(file_path, 'rb').read(), 'base64', 'utf-8')msg_image['Content-disposition'] = "attachment;filename='me.jpg'" # 设置图片在附件中的名字msg.attach(msg_image)msg['From']=formataddr(["Jack",my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号msg['To']=formataddr(["Rose",my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号msg['Subject']="我的自拍照" # 邮件的主题,也可以说是标题server=smtplib.SMTP("smtp.qq.com", 587) # 发件人邮箱中的SMTP服务器,端口是587server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码server.sendmail(my_sender,[my_user,],msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件server.quit() # 关闭连接except Exception:ret=Falsereturn ret
③测试上面封装的send_mail(file_path)函数
main.py (main.py、send_pic.py、test.jpg在同一目录)
from send_pic import send_mailif __name__ == '__main__':if send_mail('test.jpg'):print('发送邮件成功!')else:print('发送邮件失败!')
6.模块整合
7.深入思考
①如果很多人不戴口罩,用qq邮件一张张发送人脸照片太麻烦了,还不如存到一个固定文件夹中
②如果一个人在监控范围内因为长时间不戴口罩(尽管有语音提示)而被记录下人脸,他走出监控范围才戴了口罩,第二次进入监控范围,如何消除上次记下的人脸记录?
其实我想了想,长时间不戴口罩就已经算是危险分子了,就不消除记录了吧,哈哈
③在超市、餐厅这样的地方,需要放多个这样的装置才能覆盖更大的范围
④人脸追踪云台监控相比传统固定监控,优势在于扩大了监控的范围
⑤舵机不能360度控制也是一个缺陷
树莓派 --- 人脸口罩识别智能监控相关推荐
- 人脸口罩识别的项目总结
人脸口罩识别的项目总结 最近一段时间,国内部分地区又爆发了新冠疫情,传播速度很快.但最近天气炎热,人们戴口罩的自觉性不如从前了,在商场等公共场所,需要专门的人员去提醒顾客佩戴好口罩.因此萌发了使用计算 ...
- Python+Yolov5人脸口罩识别
程序示例精选 Python+Yolov5人脸口罩识别 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 Yolov5比较Yolov4,Yolov3等其他识别框架,速度快 ...
- 人脸口罩识别_APP开发
程序运行展示 程序相关说明 代码逻辑实现 使用tensorflow2.x训练的模型,可使用迁移学习减少训练参数,导出的tflite模型体积较小 相机模块使用CameraX,人脸检测模块使用Go ...
- python人脸口罩识别_基于Python+OpenCV的人脸口罩识别检测
以下编程在Jupyter notbook平台上进行 一.OpenCV下载安装 二.人脸口罩数据集下载处理 (一)人脸口罩数据集下载 下载人脸口罩数据集的目的是利用OpenCV进行模型训练,这里采用口罩 ...
- 实战6:基于OpenCV的人脸口罩识别检测详细教程
背景介绍: 从19年疫情爆发到现在,佩戴口罩对大家来说已是常态.应运而生的就有了很多相关应用,如病毒发展预测.口罩佩戴检测以及戴口罩的人脸识别等. 今天介绍的人脸口罩佩戴检测系统主要使用Ope ...
- 人脸口罩识别全面开放 6大能力快速部署 疫情服务项目免费使用
科学有序复工复产是目前经济社会发展形势的客观要求,也是各地尽快恢复正常经济秩序的必要之举.随着返工人员陆续从全国各地回到工作城市,机场.火车站.地铁等人员密集的通行场所更要加强联防联控工作. 为保障及 ...
- 人脸口罩识别——人脸添加口罩方法masked_faces
文章目录: 1 人脸添加口罩masked_faces 2 添加口罩原理 3 添加口罩代码操作 4 源码分析 A realistic approach to generate masked faces ...
- 【K210】人脸口罩识别
硬件平台:K210 Sipeed Maix Dock 软件平台:maixpy .kmodelv4 实现功能 检测人脸是否佩戴口罩 第一步 训练模型 或 下载模型 模型下载地址:https://www. ...
- python人脸口罩识别训练模型_【每天进步一点点】基于ModelArts,跑通口罩检测案例(Python版本)——模型训练与转化部分...
今天接着说说模型训练的部分,这部分比较简单,在ModelArts上官方提供了算法和强大的算力,这极大简化了AI开发中最为复杂的模型训练部分.这里要说明的是,这个算法提供了预置算法的版本(1种,GPU训 ...
最新文章
- django 增加验证邮箱功能
- ThumbnailUtils的使用
- Glib实例学习(6)双端队列
- android 文件并发读写,Android下,rxJava+retrofit 并发上传文件和串行上传文件的效率为什么差不多?...
- Python用@property使类方法像属性一样访问
- phpcms 指定id范围 调用_Elasticsearch v7 中Java High-Level REST Client同步和异步调用
- 刷magisk模块后不能开机_刷Magisk模块开机卡Logo了怎么办?两种方法教你轻松解决...
- oracle性能优化之awr分析
- 牛客网——最简真分数
- 【转】Emacs -- 自动补齐
- 用SDWebImage渐变加载图片
- .NET Framework总三
- 解析库的基本使用(BeautifulSoup、Xpath(重点)、PyQuery)
- python实现钉钉群自动警报
- oracle sla 设置文档,Oracle EBS SLA 详解(转)
- photoshop 安装和使用 蓝湖上传设计图
- android recyclerview 滑动状态,RecyclerView的滑动监听
- 更换固态硬盘并使用微pe安装windows7系统及万能网卡
- qprocess qt 打开word_Qt QProcess启动和关闭外部程序
- 2022年上海市安全员C证考试内容及上海市安全员C证考试技巧