打造本地人脸门禁系统-人脸数据自动采集
栏目:技术文档 发布时间:2024-07-07 信息来源:星火网防科技
目前很多中小学创客项目中有关“人脸识别”都是通过使用百度的AI开放平台来实现的。需要提前注册账号并采集“人脸库”信息,然后借助于个人账号的API Key和Sec

目前很多中小学创客项目中有关“人脸识别”都是通过使用百度的AI开放平台来实现的。需要提前注册账号并采集“人脸库”信息,然后借助于个人账号的API Key和Secret Key进行在线数据的调用比对,最终获取置信度百分比实现对人脸的识别判断。这种方式的优点是用户编程时人脸识别的底层算法及实现过程是一个黑箱,只需通过接口进行数据的双向传输即可。缺点是必须保证网络的通畅,而且免费账号可能有时间段或有效使用次数等限制。

我们以树莓派为基础平台,借助开源计算机视觉库OpenCV、多维数组计算的Numpy库、连接硬件设备的PinPong库以及PIL库、os库等,就可以通过摄像头采集人脸进行数据的本地训练,最终实现脱离网络环境的人脸识别本地门禁系统。

0111

实验器材及连接

验器材包括:树莓派3B和古德微扩展板各一块,带数据排线的P5V04A SUNNY定焦摄像头一个,SG90舵机一个,RGB三合一红绿灯模块一个,小型面包板一块,杜邦线若干。

首先,将树莓派主板CSI卡槽接口(标注为“CAMERA”)的锁扣两端向上轻轻拉起,再将摄像头数据排线末端的“金手指”一面小心插至卡槽底部,并从两端压紧锁扣。接着,将古德微扩展板四角对齐,轻轻压进树莓派的边槽引脚组,注意将摄像头的数据排线从另一侧引出。

然后,将RGB红绿灯模块的四个引脚并列插入面包板,再使用红色、黄色和绿色杜邦线分别将红绿灯模块的R、Y和G引脚对应连接至扩展板的5号、6号和12号引脚的“+”极,用白色杜邦线将红绿灯模块的GND引脚连接至扩展板5号引脚的“-”极;接着,将舵机插入扩展板的18号引脚组,注意黄色、红色和棕色线分别对应D数据端、VCC和GND端;最后,给树莓派通电,启动操作系统(如图1)。        


图片


0211

获取人脸图片的源数据

通过编程让树莓派的摄像头拍摄一批我的脸部图片,作为训练AI的源数据。

运行Windows的“远程桌面连接”程序,输入树莓派的IP地址(192.168.1.120)后点击“连接”按钮,进入树莓派的操作系统,准备开始Python代码编程。

1.安装库模块及

笔者的树莓派操作系统中Python版本是3.7.3,需要在“LX终端”先安装OpenCV库,命令是“pip3 install opencv-python”;用“pip3 install numpy”命令安装Numpy库。同样安装好PIL库、os库以及PinPong库。

2.拷贝人脸识别文件

接下来,在/home/pi/pycode中建立Recognize_Face项目文件夹,文件夹中分别建立PicData和Data两个空目录,前者用来保存摄像头捕获人脸的照片文件,后者则用来保存训练好的trainner.yml数据文件。

然后,从/usr/local/share/opencv4/haarcascades文件夹中将已经训练好的人脸正面识别检测模型haarcascade_frontalface_default.xml文件复制进来,待调用(如图2)。


图片


3.采集并将人脸图转灰度

为了提高人脸图片的识别度,要将摄像头捕获的BGR格式人脸照片转换成GRAY灰度图。

首先,导入numpy和opencv库:“import numpy as np”“import cv2”;接着,建立变量cap,赋值为“cv2.VideoCapture(0)”,作用是控制摄像头开始抓拍生成视频画面;建立变量face_cascade,赋值为“cv2.CascadeClassifier("haarcascade_frontalface_default.xml")”,作用是使用人脸检测的级联分类器读取之前保存在当前文件夹中的识别检测模型文件haarcascade_frontalface_default.xml;建立变量sampleNum,赋值为0,对人脸采集的数目进行零初始化计数;建立变量ID,赋值为“input("请输入您的数字ID:")”,作用是在屏幕上输出提示信息并为人脸采集照片文件进行命名的归类。

在“while True”循环结构中,先通过语句“ret, img = cap.read()”对摄像头的人脸捕获画面进行读取,其中的ret返回值为布尔型,读取正确则返回True,变量img中存储的是矩阵形式的一帧图片信息;再建立变量gray,赋值为“cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)”,作用是将读取到的BGR格式图片进行GRAY灰度颜色转换,生成对应的灰度图片(目的是提高图片的识别度);建立变量faces,赋值为“face_cascade.detectMultiScale(gray,1.3,5)”,作用是设置缩放参数为1.3、人脸确定的最小次数为5,实现对应精度的人脸识别,返回值是OpenCV对图片的探测结果;在“for (x,y,w,h) in faces”内循环中,(x,y)是左上角的像素点的二维坐标值,w和h则分别表示宽度和高度;对变量img进行二次处理并赋值为“cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)”,作用是使用rectangle进行人脸的矩形框标记,其中的“(x+w,y+h)”表示矩阵右下角像素的坐标值,“(255,0,0)”所对应的是BGR格式的蓝色Blue颜色值,“2”表示画框的线宽;语句“sampleNum = sampleNum + 1”的作用是进行人脸采集“加1”计数。

4.保存采集数据

通过cv2.imwrite进行图片文件的保存操作,文件主名由四部分组成:“"PicData/user."+str(ID)+"."+str(sampleNum)”,然后是扩展名“".jpg"”(最终的文件名格式为“user.id.num.jpg”),“gray[y:y+h,x:x+w]”的作用是将灰度图片作为二维数组进行人脸区域的检测;语句“cv2.imshow("img", img)”的作用是显示变量img所存储的图片,该显示窗口的名称也同为“img”;接下来,通过两个if条件语句实现摄像头拍照和图片存储操作的break中断,一个条件为“cv2.waitKey(1) & 0xFF == ord("q")”,表示延时1毫秒的切换来等待键盘是否按下字母“q”(quit);另一个条件为“sampleNum == 1000”,表示人脸采集的数目是否超过1000张。

最后,添加摄像头的资源释放语句“cap.release()”,并且关闭图像窗口:“cv2.destroyAllWindows()”,将程序保存为“01Capture_Face.py”(如图3)。


图片


5.测试人脸采集程序

运行程序,在“请输入您的数字ID:”提示信息后面输入数字“1”后回车,此时会弹出一个名为“img”的摄像头预览窗口,显示的内容即为摄像头的实时拍摄画面;尽量保持正脸或是小角度的侧脸及仰视和俯视,摄像头会将识别到的人脸区域用蓝色矩形框进行标识(如图4)。


图片


经过一段时间的人脸采集后,按一下键盘的q键退出,摄像头的实时预览窗口画面关闭;此时进入PicData文件夹查看,是不是保存着若干张人脸照片文件(134张)?眼神和姿态可能各不相同,但共同点是均对人脸区域进行了截取——即蓝色矩形框内的“人脸”信息(如图5)。

下一期,我们将用这些“源数据”来训练人脸数据模型。


图片




江西星火网防科技有限公司工程案例
【萍乡安防监控安装咨询热线:15607994110 强弱电施工、信息光纤光缆熔接等服务,欢迎来电咨询。】