概述
提到人脸识别,它本质上是通过摄像头捕捉面部特征来验证身份的技术。如今,这项技术已悄然融入日常生活,从手机解锁、支付验证到如今的门禁系统,应用场景日益广泛。其工作原理并不复杂:摄像头或摄像机采集包含人脸的图像或视频流,系统自动检测并跟踪画面中的人脸,随后将检测到的人脸与数据库中预存的人脸特征进行比对,最终输出识别结果,实现精准的身份确认。
在本项目中,我们将打造一个基于摄像头的实时人脸识别系统。系统画面不仅能实时显示人名标签和人脸识别框,还能通过灯带亮灯状态直观反馈识别结果,从而构建一套完整的人脸识别门禁系统——实现从技术到实际落地的完整闭环。
(最终效果视频)
项目基础
人脸识别
首先介绍硬件配置。要运行人脸识别程序,AI主控的性能至关重要——本次项目选用LattePanda作为核心控制器,搭配5英寸显示屏、键盘鼠标及摄像头,这套组合足以流畅执行实时人脸识别任务。
硬件准备
- AI主控:LattePanda
- 输入输出设备:5英寸显示屏、键盘、鼠标、摄像头
人脸信息录入
录入人脸信息是构建整个系统的基础工序,操作步骤并不复杂,只需按以下流程进行即可。
1. 双击桌面上的startpage.sh,启动JupyterLab,然后导航至/home/lattepanda/桌面/LattePanda&AI项目实战/目录。在此目录下,您将看到以下三个关键文件——请确认它们全部存在,缺一不可。
2. 双击打开“图片拍摄”文件夹。
3. 双击运行该程序,并根据需要调整拍摄照片的数量。例如,将代码中的for index in range(3)中的数字修改为3,即表示拍摄3张照片——您可根据实际需求灵活设置该数值。
样例代码:
4. 选择一个背景简洁、无其他人员或杂物干扰的位置,正对摄像头注视镜头,然后执行程序。拍摄完成后,所拍图片将依次保存至程序同级目录下。
5. 双击图片查看拍摄效果。从中挑选一张最清晰的照片,将其重命名为对应人员的姓名,例如“张三”。
6. 随后将这张命名好的照片复制到“LattePanda&AI-人脸识别门禁系统”文件夹中。
程序编写
接下来进入项目的核心环节——编写人脸识别主程序。
1. 双击打开“人脸识别.ipynb”文件。
样例代码:
复制代码 隐藏代码
#导入人脸识别模块fromfaceRecognition import *#人脸检测与识别文件调用faceDetectorPath="face-detection-retail-0005.xml"landmarksPath="landmarks-regression-retail-0009.xml"faceReidentificationPath="face-reidentification-retail-0095.xml"#调用训练模型文件model= Model()model.load(faceDetectorPath = faceDetectorPath,landmarksPath= landmarksPath,faceReidentificationPath= faceReidentificationPath)#初始化摄像头与窗口camera= Camera()screen= Screen("人脸识别门禁系统", (0,0,0))#打开手写数字交互窗口,按下“Q”键退出窗口if_run=1while(if_run ==1):#从摄像头获取图片image= camera.read(flip = False)#图片剪裁image= model.clipResizeFrame(image)screen.clear()#获取人脸识别结果并在屏幕上显示识别标签results= model.predict(image)screen.putImage(image,80,0,640,480)forroi, landmarks, identity in zip(*results):x, y = roi.positionw, h = roi.sizescreen.putTag(identity, x+80, y, w, h, bg=(0,255,0))#打开与显示交互窗口,如果按下Q键,将无法进入下一次while循环ifscreen.show():if_run=0screen.quit()
复制代码
2. 运行整个程序,当执行至最后一个单元格时,系统将自动弹出交互窗口。此时您会观察到以下几种不同的识别状态:
- 未识别到人脸时,画面中无任何识别框,界面保持干净。
- 当检测到未知人脸时,画面出现识别框,但标签显示为“未知人脸”。
- 当识别到已知人脸时,标签将显示对应的姓名。
3. 按下键盘上的Q键,即可退出交互窗口并结束程序运行。
项目进阶
人脸识别门禁系统
将人脸识别作为门禁系统的“钥匙”,能极大提升出入便利性。当系统识别到已注册的人脸时,灯带亮起绿灯表示允许通行;反之则亮红灯表示拒绝——这便是典型的人脸识别门禁控制逻辑。
硬件准备
- 主控:Arduino UNO、IO 传感器扩展板 V7.1
- 模块:WS2812 RGB 全彩灯带
硬件连接图
*WS2812上有7个RGB灯,程序中的np[0]表示第一个灯,程序中的np[1]表示第二个灯。
程序编写
双击打开“人脸识别_灯带.ipynb”文件。
样例代码:
复制代码 隐藏代码
#导入人脸识别模块fromfaceRecognition import *importtimefrompinpong.board import Board,Pin,NeoPixelNEOPIXEL_PIN= Pin.D7PIXELS_NUM=1#灯数,如果需要多个灯亮,请改此数值#初始化,选择板型和端口号Board("uno","/dev/ttyUSB0").begin()np= NeoPixel(Pin(NEOPIXEL_PIN), PIXELS_NUM) #np[0]表示第一个灯,np[1]表示第二个灯,以此类推#人脸检测与识别文件调用faceDetectorPath="face-detection-retail-0005.xml"landmarksPath="landmarks-regression-retail-0009.xml"faceReidentificationPath="face-reidentification-retail-0095.xml"#调用训练模型文件model= Model()model.load(faceDetectorPath = faceDetectorPath,landmarksPath= landmarksPath,faceReidentificationPath= faceReidentificationPath)#初始化摄像头与窗口camera= Camera()screen= Screen("人脸识别门禁系统", (0,0,0))#打开手写数字交互窗口,按下“Q”键退出窗口if_run=1led=0count=0while(if_run ==1):#从摄像头获取图片image= camera.read(flip = False)#图片剪裁image= model.clipResizeFrame(image)screen.clear()#获取人脸识别结果并在屏幕上显示识别标签results= model.predict(image)screen.putImage(image,80,0,640,480)forroi, landmarks, identity in zip(*results):x, y = roi.positionw, h = roi.sizescreen.putTag(identity, x+80, y, w, h, bg=(0,255,0))#count>30,修改30可调节切换灯颜色的速度ifidentity !="未知人脸"and count>30:np[0] = (0,255,0) #设置第一个灯亮绿色#np[1] = (0, 255 ,0) #设置第二个灯亮绿色count=0elifidentity =="未知人脸"and count>30:np[0] = (255,0,0) #设置第一个灯亮红色#np[1] = (255, 0 ,0) #设置第二个灯亮红色count=0count+=1#打开与显示交互窗口,如果按下Q键,将无法进入下一次while循环ifscreen.show():if_run=0screen.quit()
复制代码
运行效果
当系统识别到已注册的人脸时,灯带的第一个灯亮起绿色,表示门禁允许通行。
当摄像头画面中未检测到人脸,或检测到的为未知人脸时,灯带的第一个灯亮起红色,表示门禁拒绝进入。

