基于人脸识别的图书馆智能门禁系统
0 引言
人脸识别门禁是基于先进的人脸识别技术,结合成熟的ID 卡和指纹识别技术而推出的安全实用的门禁产品。产品采用分体式设计,人脸、指纹和ID 卡信息的采集和生物信息识别及门禁控制内外分离,实用性高、安全可靠。系统采用网络信息加密传输,支持远程控制和管理,可广泛应用于银行、军队、公检法、智能楼宇等重点区域的门禁安全控制。
目前学校图书馆门禁依旧采用的是刷校园卡进入的方式, 对于同学们而言十分不便, 而且也有外来人员借用本校学生校园卡进入图书馆的现象。使用人脸识别方式进入可以有效杜绝这类情况的发生, 也方便同学进入图书馆学习以及学校对于图书馆的日常管理。
1 设计思路
根据对预期功能的分析结合我们运用的技术,首先需要给出总体设计方案,本课题所实现的人脸识别系统不仅包含硬件开发平台,而且还有在开发平台上运行的各种端口函数、驱动程序和应用程序,其中硬件部分主要有:视频采集部件、视频传输部件和视频显示部件;程序部分主要有:基于树莓派的操作系统、视频采集程序、视频编码程序、视频传输程序、PC 机上显示程序等。系统设计方案的总体框架如图1 所示。
本次人脸识别系统的开发分为两个部分实施:PC和嵌入式平台。在PC 平台上,对设计好的人脸识别程序进行调试,验证程序的整体机理和功能。程序功能没有问题后,再将程序环境进行重新配置,编译成可以在嵌入式平台上运行的程序,然后移植到嵌入式平台上验证运行。这样分两步走的开发方式,虽然需要对程序进行两次编译,但是,在程序的调试和验证过程中带来了很大便利,对问题的查找和处理更高效率。
2 硬件平台设计
本设计使用嵌入式板卡作为其运行的硬件平台。对于嵌入式开发板,其运行性能的关键是嵌入式处理芯片,作为嵌入式系统的核心部件,其运算处理速度的快慢直接影响系统平台的运行效率。目前市面上存在多种内核结构的嵌入式芯片,包括ARM 内核芯片、IBM 的Power PC、Intel 的x86 等,而以ARM 为内核的处理芯片在全球嵌入式芯片市场中占据主导地位[1]。项目所选用的Raspberry Pi 开发平台采用的是高性能的树莓派4B 作为主处理器,支持的操作系统为:树莓派专用系统Debian GNU/Linux、Fedora、Arch Linux、RISC OS、Windows10 IoT,搭载1.5 GHz 的64 位四核处理器(Broadcom BCM2711,Quad core Cortex-A72(ARM v8) 64-bit SoC @ 1.5 GHz),支持Bluetooth 5.0,两个USB 3.0 和两个USB 2.0 接口,双micro HDMI 输出,支持4K 分辨率,microSD 存储系统增加了双倍数据速率支持,先前版本的microUSB 供电接口在树莓派4B 中改为USB Type-C 接口[2]。
3 模块介绍
1) 树莓派4B 英7 寸显示屏
树莓派4B 英7 寸显示屏的分辨率为1 024×600,功耗为0.84 A×5 V。通过显示屏显示运行程序,并观察运行程序后的情况。
2)800 万像素4K 超清摄像头
对准人脸首先检测人脸,接着录入人脸信息,将待识别人脸对准摄像头进行识别。
3) 树莓派4B 开发板
树莓派4B 开发板包含1.5 GHz 四核64 位ARM Cortex-A72 CPU,两个USB 3.0 和两个USB 2.0 端口,双频802.11ac 无线网络和4GB 的LPDDR4 SDRAM。
4)LY03 小型斜口电磁锁
LY03 小型斜口电磁锁用来模拟图书馆门禁系统开门。摄像头识别人脸后,若人脸信息能与库中信息匹配,则开锁;否则报警。
5)1 路5 V 继电器模块
此模块高电平触发,即模块供电后,控制端口收到高电平继电器导通,给门锁供电。
6) 蜂鸣器
蜂鸣器用来实现人脸识别不成功报警的功能,蜂鸣器电压是2~3.5 V,工作电流小于25 mA,频率为1.8~2.8 kHz。直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。
4 软件设计
4.1 基于OPENCV的人脸检测
OpenCV 是Intel 公司支持的开源计算机视觉库,轻量而且高效,由一系列C 函数和少量C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。作为一个基本计算机视觉、图像处理和模式识别的开源项目,OpenCV 可以直接应用于很多领域,其中包括人脸识别的算法实现,是二次开发的理想工具[2]。人脸识别功能包括以下几个方面(如图2)。
1) 图像采集和预处理
可以通过下载开源的人脸识别数据集以及自己拍照建立人脸数据库进行图像采集。由于大部分脸部检测算法对光照、脸部大小、位置表情等非常敏感,图像预处理是将检测到的脸部后需转化为灰度图像,进行直方图归一化处理。
2) 人脸检测
OpenCV 采用一种叫做Haar cascade classifier 的人脸检测器,利用保存在XML 文件中的数据确定每一个局部搜索图像的位置,并利用其内置函数进行检测。函数使用针对某目标物体训练的级联分类器在图像中找到包含目标物体的矩形区域,并将这些区域作为序列矩形框返回,最终检测结果保存在变量中[3]。
4.2 基于Dlib的人脸识别
Dlib 是一个机器学习C++ 库,包含许多机器学习常用的算法。dlib 先检测人脸,然后通过Resnet 生成一个128 维的向量,Resnet 有几种不同深度结构,dlib 库采用68 点位置标志人脸重要部位,再采用相应模块识别人脸。
4.3 部分设计代码
1) 读取数据,设置摄像头参数
known_face_encodings ,known_face_names =getFace.getFaceArray()
todayAlreadRegister = DBUtils.getAlreadyRegisterArray()
print(todayAlreadRegister)
print(known_face_names)
signRight = “Right”
signWrong = “Wrong”
video_capture = cv2.VideoCapture(0)
rcout = 12
width=1024
height=768
video_capture.set(cv2.CAP_PROP_FOURCC, cv2.
VideoWriter.fourcc(‘M’, ‘J’, ‘P’, ‘G’))
video_capture.set(cv2.CAP_PROP_FPS , 12);
video_capture.set(cv2.CAP_PROP_FRAME_
WIDTH,width)
video_capture.set(cv2.CAP_PROP_FRAME_
HEIGHT,height)
2) 录入人脸信息
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True
fcounter = 0
while True:
ret, frame = video_capture.read()
small_frame = cv2.resize(frame, (0, 0), fx=0.3,
fy=0.3)
rgb_small_frame = small_frame[:. :, ::-1]
if fcounter==rcout:
fcounter=0
face_locations = api.face_locations(rgb_small_
frame)
face_encodings = api.face_encodings(rgb_
small_frame, face_locations)
face_names = []
for face_encoding in face_encodings:
matches = api.compare_faces(known_face_
encodings, face_encoding)
name = “Unknown”
face_distances = api.face_distance(known_face_
encodings, face_encoding)
#face_distances = list(face_distances <= 0.5)
best_match_index = np.argmin(face_distances)
if matches[best_match_index] and “False” not in
str(face_distances):
name = known_face_names[best_match_
index]
face_names.append(name)
else:
fcounter = fcounter + 1
3) 识别人脸
for ( top, right, bottom, left), name in zip(face_
locations, face_names):
font = cv2.FONT_HERSHEY_DUPLEX
if name in “Unknown”:
# cv2.rectangle(small_frame, (left, top), (right,
bottom), (0, 0, 255), 2)
cv2.putText(small_frame, name, (left + 5, bottom -
5), font, 0.6, (0, 0, 255), 1)
# cv2.putText(small_frame, signWrong, (left + 5,
bottom - 15), font, 0.6, (0, 0, 255), 1)
else:
#cv2.rectangle(small_frame, (left, top), (right,
bottom), (0, 255, 0), 2)
# if name in todayAlreadRegister:
cv2.putText(small_frame, name, (left + 5, bottom -
5), font, 0.6, (0, 255, 0), 1)
cv2.putText(small_frame, signRight, (left + 5, bottom
+ 20), font, 0.6, (0, 255, 0), 1)
# else:
# DBUtils.insertRegister(name)
#todayAlreadRegister.append(name)
cv2.imshow(‘Video’, small_frame)
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break
video_capture.release()
cv2.destroyAllWindows()
5 实验过程
1) 首先将软件安装好,连接硬件好;
2) 将摄像头打开,检测人脸信息,并录入人脸信息;
3) 录入人脸信息后,运行识别程序,将摄像头对准已录入信息的人脸,识别成功,显示录入姓名并开锁;对准未录入信息的人脸,识别失败,显示unknown 并报警。
6 结论
本项目以OpenCV 为核心, 树莓派为硬件基础设计实现了具有人脸识别功能的智能安防门禁系统。本智能门禁系统首先将授权的人脸信息进行灰度化、降维及计算特征值等处理, 再进行准备训练, 得到授权人的相关信息。然后对摄像头采集到的人脸信息进行处理。经过测试, 该智能门禁系统较好地完成了人脸识别功能, 识别成功开锁,失败则报警,完成了门禁系统的设计要求,实现了图书馆的门禁智能化。
参考文献:
[1] 周昕梓.树莓派开始,玩转Linux[M].北京:电子工业出版社,2018.
[2] GOLDEN R.树莓派应用速成:网络应用秘方.符鹏飞.译.北京:科学出版社,2014.
[3] 朱伟.OpenCV图像处理编程实例[M].北京:电子工业出版社,2016.
(本文来源于《电子产品世界》杂志2021年4月期)
评论