基于FPGA和卷积神经网络的人脸识别系统

2021-07-27 03:52范世朝郑国强孙国庆韩旭
电子元器件与信息技术 2021年5期
关键词:池化层池化人脸

范世朝,郑国强,孙国庆,韩旭

(河南科技大学信息工程学院,河南 洛阳 471023)

0 引言

常规的基于FPGA的人脸识别系统大多是利用HDL语言来实现,这就要求开发者熟悉硬件之间的逻辑关系。为了使软件开发者能更方便的参与FPGA开发,Xilinx公司推出了HLS高层次综合工具和PYNQ系列FPGA开发板。对于软件开发者可以在HLS平台利用C语言实现逻辑功能,之后高层次综合会自动将C语言转化为Verilog语言,生成相应的IP核。而PYNQ系列开发板ARM端内置Jupyter notebook网络服务器,Linux系统和IPython内核,可以十分方便的利用Python对生成的IP核进行调用,大大降低了开发门槛[1]。

1 人脸识别系统的流程

本文利用PYNQ-Z2开发板为基础,设计出一个基于卷积神经网络的人脸识别系统,该系统能够识别输入的人脸图像的面部特征,并判断目标是否是训练库中的用户,如果是会在结果中标识出目标的名字。该系统的总体架构如图1:

图1 系统总体架构图

2 主要流程分析

2.1 数据集制作

利用Python调用PC端的摄像头,实时采集图像数据,并进行人脸识别,当识别出人脸时,会自动抓取图片并进行保存。这里对人脸进行识别的方法是调OpenCV的cv2级联分类器haarcascade_frontalface_alt2.xml,同时在调用级联器时,对级联器的detectMultiScal函数中minNeighbors参数进行设置,来设定需要达到的检测有效点数,本文需要达到的检测有效点数是2,意味着只有连续两次识别成功时才会认为识别出了人脸数据。同时为了保证后续进行模型训练时图像的大小相同,在识别时设置保存的人脸图像大小统一为64×64[2]。

整个数据集的制作流程如下:

图2 数据集制作流程

2.2 模型训练

训练主要采用的是TensorFlow框架。训练时,系统输入层大小是64×64,卷积层有32个3×3大小的卷积核,并使用same方式卷积。池化层与卷积层交替循环,三次池化均为最大池化,大小为2×2。第三层池化层之后是一层全连接层和一层输出层。经8个输出端的输出层输出预测结果。训练时选用的激活函数是ReLU函数,使用TensorFlow自带的AdamOptimizer优化器对模型参数进行训练。模型训练完毕后将生成的模型文件导入Jupyter notebook[3][4]。

2.3 生成bit文件

卷积神经网络的重点在卷积层,池化层和全连接层,其中,全连接层我们通过复用卷积模块的方式来使用,这样可以节省片上资源,只需要将卷积核的大小从3×3改为16×16,但是也要注意一些参数维度的改变。设计方案如下:

通过HLS设计平台,利用C语言或者C++设计子函数实现卷积层和池化层,之后进行高级综合将其转化为Verilog语言,封装成IP核。IP核设计完成后需要设计block design以使IP核与ARM端通信。这里卷积模块与池化模块都通过AXI总线与PYNQ连接,在导入IP核后VIVADO会自动进行连接,连接后的结果如下:

图3 block design 设计

之后将设计好的block design导出为bit文件和tcl文件,并将导出的bit文件和tcl文件下载到PYNQ开发板的SD卡中就可以复现人脸识别系统。

2.4 Jupyter notebook设计

将训练好的模型文件和生成的bit和tcl文件导入Jupyter notebook后就可以编写Python代码复现人脸识别系统。首先需要在Python代码中导入Overlay以便于调用制作的卷积层和池化层的函数,之后利用OpenCV识别待检测图像的人脸部分,提取出来人脸特征与模型文件进行比对,之后将比对结果进行输出即可。

3 硬件仿真和资源占用

本设计用的仿真策略是通过HLS工具编写test bench文件对卷积模块和池化模块进行仿真验证。

对于卷积层模块仿真如下图所示,使用same方式进行卷积,所谓same方式卷积,即在进行卷积运算会在输入四周补零之后再进行运算,可以保证输入和输出的矩阵大小是等同的,仿真结果如下:

图4 卷积模块仿真

资源占用情况如下,其中DSP:主要用来进行数字信号处理。LUT是查找表,但是本质上就是一个RAM,它把数据事先写入RAM后,每当输入一个信号就等于输入一个地址进行查表,找出地址对应的内容,然后输出。FF:触发器,一种时钟信号触发时才能动作的存储单元电路。

图5 资源占用

对于池化层模块,使用3×3最大池化,即在3×3的区域内选择一个最大值进行输出:

图6 池化模块仿真

其中资源占用情况如图所示:

图7 资源占用

4 结论

本文提出了一种基于PYNQ-Z2的FPGA人脸识别系统,同时构建其软硬件平台,使用OpenCV级联器进行人脸检测,使用卷积神经网络训练模型,利用HLS生成卷积层和池化层的IP核,并利用其仿真工具编写test bench文件对结果进行了仿真测试,经过测试可知,本文提出的方法能够满足实际需求,并无需考虑硬件的逻辑结构,显著降低了开发难度,同时资源占用较低。

猜你喜欢
池化层池化人脸
基于Sobel算子的池化算法设计
基于高斯函数的池化算法
卷积神经网络中的自适应加权池化
有特点的人脸
卷积神经网络模型研究分析*
一起学画人脸
基于卷积神经网络的纸币分类与点钞
基于深度学习卷积神经网络的人体行为识别研究
基于卷积神经网络和池化算法的表情识别研究
三国漫——人脸解锁