44239| 31
|
[M10教程] 【行空板】用Python玩转开源硬件-第12课:AI门禁安全监控 |
本帖最后由 JIAJIA 于 2023-4-18 10:11 编辑 AI门禁安全监控 随着科技的进步,越来越多场所使用人脸识别技术帮助管理进出人员,有效防止外来人员进入。今天,我们也来试试用行空板制作一个AI门禁系统,体验一下智能门禁的奇妙吧。 任务目标 当门禁系统识别到家庭成员后,门自动打开,10s后,门自动关闭;当识别到陌生人,灯环闪烁,提醒该陌生人离开,并拍照保存陌生人脸图片。 知识点 1.了解人脸识别原理 2.掌握行空板人脸识别库的使用方法 材料清单 硬件清单: 软件使用:Mind+编程软件 x1 下载地址:https://mindplus.cc/ 动手实践 AI门禁安全监控主要是应用人脸识别技术来完成对于家庭成员和陌生人的识别,我们将利用opencv中的人脸识别功能,分为采集、训练以及识别三个任务来完成制作。 任务一:采集人脸图片 在此任务中,我们将通过摄像头采集人脸图片,并将它们存入指定文件夹,建立人脸图片集以便于后面的训练和识别。 任务二:训练人脸模型 基于任务一建立好的人脸图片集,我们将通过训练指令让行空板处理图片,获得门禁专用的人脸识别模型。 任务三:实时识别人脸 在此任务中,我们将利用前面训练好的人脸识别模型,识别摄像头中出现的人脸,如果是家庭成员,就打开门锁,不是则灯光报警,并拍照记录。 任务一:采集人脸图片 1.硬件连接 本项目需要用USB摄像头采集图片,舵机(P23)模拟开关门,灯环(P21)充当警报灯。你可以按下图将元件接入行空板。连接成功后,使用USB线将行空板连接到计算机。 2.软件准备 打开Mind+,按照下面图示完成软件准备工作。 3.编写程序 在AI安全门禁中的人脸识别功能,就像我们日常生活中使用人脸解锁手机一样,需要先采集人脸。那么接下来我们就来学习使用人脸识别库中的指令,控制USB摄像头采集人脸图片。 (1)加载人脸识别库 本节课我们将使用Opencv的人脸识别扩展库,需要先按如下步骤安装人脸识别库。 首先,确保计算机和行空板联网,安装Opencv人脸识别扩展库。点击“代码”切换之代码模式,并打开“库管理”; 在“PIP模式下”输入“pip install opencv-contrib-python”,“运行”后等待安装成功; 注意:若因为网络问题安装失败,可以在“素材”文件夹中找到“face_recognition”文件夹,并将该文件夹拖入“行空板中的文件”,同时切换至“代码模式”运行文件夹中的“1-Install_dependency.py”文件来帮助你完成离线安装。如果之前安装过Opencv的人脸识别扩展库,再次安装时程序会出现警告和报错,但能正常使用。 然后,导入图形化库。扩展库安装完成以后,你可以通过“扩展库”中的“用户库”检索获得“人脸识别”图形化库(检索网址为 https://gitee.com/chenqi1233/ext-face_recognition) (2)录入人脸 添加好人脸识别库以后,我们就可以使用指令和USB摄像头来录入人脸。首先我们先使用 初始化摄像头直到成功 编号0 初始化摄像头。 注意:上面提到的编号为摄像头编号,默认为0,不是人脸识别编号,不需要修改。 在采集人脸过程中,只有当摄像头画面中有人时,才开始拍照采集图片,因此我们需要 导入人脸检测模型 然后使用 等待直到按下按键A保存50张人脸图片到文件夹 路径 人脸ID编号0 指令完****脸检测和录入。 需要说明的是,等待直到按下按键A保存0张人脸图片到文件夹 路径 人脸ID编号0 指令中录入人脸图片数越多识别效果就越准,但是生****脸模型的时间也就越久。人脸ID编号是为了标记每次录入的人,不同的人应该填写不同的编号。 现在我们就可以使用代码控制摄像头来完成第一张人脸的学习。完整参考代码如下: 4.程序运行 点击运行,拿起摄像头对准人脸,按下A键开始录入,当摄像头检测到人脸后,行空板屏幕显示“shooting”和ID编号,终端记录已保存的图片数量,录入结束程序停止运行。 注意:如果运行出现错误,请检查摄像头连接情况。显示新存入的文件需要点击“文件目录”右边的刷新,若想查看这些图片可以参考官网方法操作(https://wiki.unihiker.com/samba)。录入时,摄像头最好保持不动,保证人脸和摄像头的距离适中,以确保更快的检测到人脸。 5.试一试 请你修改人脸ID编号,动手再学习几张人脸吧。(每次运行只能学习一张人脸,记得设置连续的ID) 任务二:训练人脸模型 1.编写程序 通过任务一,我们已经录入了足够多不同的人脸图片,现在我们就来用这些图片训练一个专门“人脸模型”,通过这个“人脸模型”让行空板“记住”已经录入的人脸。 人脸识别图形化库用人脸图片训练模型,只需要两步,导入人脸图片训练模型和保存模型。 需要说明的是,在使用 保存训练模型文件 指令时,为了将模型文件“model.yml”保存在确认路径下,需修改路径为“/root/face_recognition/model.yml”,即删除“/model”。现在只要将它们放在 python主程序开始 下面,当然也可以在最后加入“训练完成”的文字提示,完整代码参考下图: 2.程序运行 点击运行,开始训练人脸模型,直到终端显示训练完成,人脸模型成功训练并保存。 注意:若运行过程中出现“open Can't open file......”错误,请检查模型存储文件夹是否存在。 任务三:实时识别人脸 1.编写程序 现在我们已经训练好人脸识别模型了,接下来就可以开始识别人脸,显示识别情况并控制对应的执行器。 (1)识别人脸 我们先来分析一下实现识别人脸的过程,首先做好准备工作,也就是 初始化摄像头 ,导入人脸模型。然后 读取摄像头画面 ,当 检测到有人脸 后 开始人脸识别,区分家人和陌生人,最后 显示识别结果 。 接下来你可以在人脸识别库中按流程依次找到流程图中蓝色部分对应指令完成代码,当然记得修改人脸模型的路径为任务二所存路径。 现在,你的程序已经可以识别人脸了,至于区分并显示家庭成员和陌生人,需要判断识别获得的“置信度”。“置信度”表示画面中的人脸是某个已学习的人脸的可能性,数值越大就越有可能是家庭成员。我们可以使用 预测加载的图像 返回识别结果置信度 大于某值,如60,来判断是否是家庭成员。 判断结果可以用文字来提示,使用 在摄像头画面上显示文字 颜色RGB坐标XY 指令,当然你也可以通过它去设定文字的颜色和位置。 (2)显示家庭成员姓名 在任务一的试一试中我们学习了多个人脸,要显示对应的人名,可以利用列表,使用人脸的ID充当列表的索引。 在程序开始的时候,建立 变量 人名 并将其 初始化为一个人名列表,列表的内容需要根据学习人脸的顺序来设置。 注意:列表人名必须是英文字符串。 家庭成员名字就是 列表索引的值 ,索引对应的就是人脸ID,它的获取指令为 预测加载的图像 返回识别结果索引。 (3)控制执行器 当识别到家庭成员,用舵机模拟开门,此时关闭警报灯。实现时,首先加载舵机和灯环库,初始化舵机和灯环,然后使用函数分别实现开门和关灯的操作。 当识别到陌生人,灯环亮红灯并拍下陌生人照片。需要特别说明的是,拍照的功能,要使用上节课学习的基础Opencv库,由于人脸识别库的默认摄像头对象是“cap”,记得修改“vd”为“cap”。 现在,我们可以把对应的功能放在家庭成员和陌生人判断的部分,就完成本节课的程序了。当然为了避免某一帧图像被误识别,我们可以在程序设置 变量识别次数 ,用来判断当前识别的帧数。连续识别3帧图像,只有当这3帧图像置信度都较高,才算识别成功,实现稳定的识别家庭成员。完整参考代码如下: 2.程序运行 运行程序,用摄像头去识别人脸,当识别到家人时,屏幕显示人名和“welcome back”,同时门被打开;识别到陌生人时,警报灯打开,屏幕显示“please leave”同时拍照。 注意:如果运行时出现不存在人脸识别属性“face”,说明人脸识别库有更新,可能会出现安装失败导致报错,可以尝试使用任务一中提供的离线安装库方式(拖入文件夹,运行py文件)。 效果示例图如下: 所拍照片被存在程序文件夹中,识别过程中人脸画面应尽量完整的出现在画面中间,摄像头不要太远,太远会影响准确度。 知识园地 1.人脸识别技术 人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术,简单来说,就是对人脸图像进行判断,并识别出其对应人的过程。人脸识别的工作原理和流程和我们日常生活中“认出迎面走过来的朋友”很类似,我们一起来看一看吧。 “认出迎面走过来的朋友”可以拆分成两个部分,即我原来认识这个朋友和我认出了她,前者发生在过去,后者发生在现在。在人脸识别技术中,这两个部分分别对应着训练和识别。 总结一下,训练其实就是在帮助机器先去认识这个人。机器并不能像人类的大脑一样可以很容易的记忆人脸图像,它“认识”人脸需要使用一定数量的图片学习并通过特殊的处理形成用于识别的模型。就像在本项目制作中利用摄像头采集人脸图片,然后学习生****脸模型。它是人脸识别技术的准备工作,也是人脸识别任务的基础。 那么,识别就是让计算机应用人脸模型,去匹配查找检测到的人脸和学习过的人脸哪个最相似,进而获得最终的识别结果。 2.行空板引脚总结 截至目前,我们已经搭配行空板使用了不少的器件,有模拟的,有数字的,今天我们就来总结一下它们吧。 如果你对这些引脚布局感兴趣的话,可以进入行空板官网(https://wiki.unihiker.com/jianjie#target_5)去查看相关内容。 3.指令学习 挑战自我 通过今天的课程,你一定对人脸识别功能有一定的理解了,不妨设计一个人脸打卡签到系统,将已经打过卡的人名和打卡时间保存在列表里。当画面中没有人时,按下A键,终端打印打卡情况。 提示:时间获取可以使用Python分类中的 获取系统时间时分秒 。 附件下载 链接:https://pan.baidu.com/s/1l7bAgA_dS4KlQXUHGugj-A?pwd=wrjk 提取码:wrjk |
任务一按照教程代码运行就报错,请问该如何处理? root@unihiker:~/mindplus/cache/AI门禁安全监控.mp# 项目AI门禁安全监控.mp正在上传中,请稍后..... 项目上传成功,开始运行 root@unihiker:~/mindplus/cache/AI门禁安全监控.mp# access control disabled, clients can connect from any host root@unihiker:~/mindplus/cache/AI门禁安全监控.mp# cd "/root/mindplus/cache/AI门 禁安全监控.mp" root@unihiker:~/mindplus/cache/AI门禁安全监控.mp# python /root/mindplus/cache/AI门禁安全监控.mp/.cache-file.py Traceback (most recent call last): File "/root/mindplus/cache/AI门禁安全监控.mp/.cache-file.py", line 10, in <module> import cv2 File "/usr/local/lib/python3.7/dist-packages/cv2/__init__.py", line 181, in <module> bootstrap() File "/usr/local/lib/python3.7/dist-packages/cv2/__init__.py", line 175, in bootstrap if __load_extra_py_code_for_module("cv2", submodule, DEBUG): File "/usr/local/lib/python3.7/dist-packages/cv2/__init__.py", line 28, in __load_extra_py_code_for_module py_module = importlib.import_module(module_name) File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "/usr/local/lib/python3.7/dist-packages/cv2/gapi/__init__.py", line 323, in <module> cv.gapi.wip.GStreamerPipeline = cv.gapi_wip_gst_GStreamerPipeline AttributeError: module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline' root@unihiker:~/mindplus/cache/AI门禁安全监控.mp# |
root@unihiker:~/mindplus/cache/任务二 训练模型并保存.mp# python /root/mindplus/cache/任务二\ 训练模型并保存.mp/.cache-file.py Traceback (most recent call last): File "/root/mindplus/cache/任务二 训练模型并保存.mp/.cache-file.py", line 16, in <module> faces, Ids = train_model.get_images_and_labels('/root/face_recognition/picture/') File "/root/mindplus/.lib/thirdExtension/nick-face_recognition-thirdex/train_model.py", line 30, in get_images_and_labels image_paths = [os.path.join(path+name, f) for f in os.listdir(path+name)] NotADirectoryError: [Errno 20] Not a directory: '/root/face_recognition/picture/020240402_233836_696851.jpg' |
glwz007 发表于 2024-10-2 16:42 这个问题我也出现了,OpenCV库的cv2缺失,但是不连接行空板的时候你去安装OpenCV是安装好的,你连接行空板的时候去安装会报错,是因为电脑中有OpenCV但是行空板中没有,我的解决方法是连接行空板后并在控制界面给行空板也联网(电脑有网不代表行空板有,得专门去连接),然后PIP给行空板去装库,装好了再运行就可以了 参考链接: 行空板库安装 https://www.unihiker.com.cn/wiki/m10/pip_install 行空板联网方法 https://www.unihiker.com.cn/wiki/m10/webmenu |
下载库的命令错了,应该是pip install opencv-contrib-python ,要不然运行程序会报错 |
安装了错误的库,可以在终端输入卸载命令pip uninstall opencv_contrib_python 卸载完重新安装pip install opencv-contrib-python即可 |
搜了下两个库的区别: opencv-python 和 opencv-contrib-python 都是 OpenCV 计算机视觉库的 Python 接口。两者的主要区别在于功能和包含的模块。 opencv-python 是 OpenCV 库的核心 Python 接口,它包含了 OpenCV 库的大部分核心模块和功能,如图像处理、图像变换、特征提取、目标检测等。它是使用 OpenCV 库的基本组件,如果只需要用到 OpenCV 库的核心功能,使用 opencv-python 就足够了。 opencv-contrib-python 是 OpenCV 库扩展版本的 Python 接口,它包含 OpenCV 库中的一些扩展功能集,如面部识别、物体跟踪、立体视觉、SIFT/SURF 特征提取、人脸检测器等。如果需要使用这些扩展功能,就需要安装 opencv-contrib-python。 |
请问你的问题解决了吗<div class="reference"><p><a href="https://mc.dfrobot.com.cn/home.php?mod=space&uid=862600&do=profile" target="_blank">认真学习</a> 2024-04-17 07:18:38<p><div class="quote">arcshubag 发表于 2024-4-14 16:36 同楼上的问题,求教就!求教!一直报错 请问解决了嘛 我也遇到了同样的问题 我感觉是图片没有进入一个文件夹 但尝试修改还没成功</div></div> |
请问这个问题解决了吗<div class="reference"><p><a href="https://mc.dfrobot.com.cn/home.php?mod=space&uid=849425&do=profile" target="_blank">风的季节</a> 2024-04-05 11:32:33<p><div class="quote">root@unihiker:~/mindplus/cache/任务二 训练模型并保存.mp# python /root/mindplus/cache/任务二\ 训练模型并保存.mp/.cache-file.py Traceback (most recent call last): File "/root/mindplus/cache/任务二 训练模型并保存.mp/.cache-file.py", line 16, in faces, Ids = train_model.get_images_and_labels('/root/face_recognition/picture/') File "/root/mindplus/.lib/thirdExtension/nick-face_recognition-thirdex/train_model.py", line 30, in get_images_and_labels image_paths = [os.path.join(path+name, f) for f in os.listdir(path+name)] NotADirectoryError: [Errno 20] Not a directory: '/root/face_recognition/picture/020240402_233836_696851.jpg'</div></div> |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed