1. 人脸检测
为了后续人脸识别时能通过摄像头实时检测出人脸,进而对框出的人脸进行识别。
-
引用Python中的opencv库,调用其中的人脸分类器。
-
调用摄像头,使用循环读取单帧数据。
-
进行人脸检测,框出人脸。
2. 读取训练数据
将训练数据集从图片转换成数组形式,并得到对应标签。
-
引用Python中的os库对指定文件夹进行逐层搜索。
-
使用数组记录下搜索到的图片的路径。
-
将图片转化为四维数组。
-
根据路径得到每张图片的标签。
-
根据路径得到数组序号对应的学号。
3. 训练模型
构建CNN网络将数据集训练为可直接调用的、性能较好的模型。
-
加载数据集,使用 train_test_split 函数将数据集分别按一定比例分成训练集与验证集和训练集与测试集。
-
使用categorical_crossentropy作为损失函数。
-
将得到数据集进行浮点化和归一化。
-
根据类别数量nb_classes将类别标签进行one-hot编码使其向量化。
-
构建一个空的线性堆叠网络模型。
-
构建CNN网络模型。
-
训练模型,使用实时数据提升进行训练。
-
存储模型,并对模型进行评估。
4. 人脸识别
调用模型对摄像头读取的视频或选中的图片进行人脸识别。
-
调用摄像头或读取图片。
-
对单帧图片进行灰度化处理。
-
检测人脸并框出对应区域。
-
对检测出的人脸进行识别。
-
显示检测结果的序号与学号。
5. 可视化
-
使用pyqt5构建可视化见面。
-
打包成可执行文件。
二、核心代码
1. loaddata.py
读取训练数据,将训练数据集从图片转换成数组形式,并得到对应标签,同时得到数组序号对应的学号。
函数功能表
函数名 | 函数功能 |
---|---|
read_path(path_name) | 搜索并读取对应路径下的图片,将其和其标签添加到数组 images[ ] 和 lables[ ] 中。 |
load_dataset(path_name) | 将 read_path 中读取的图片转化为四维数组,尺寸为(图片数量x图片长x图片宽x3)。 |
match_number(path_name) | 通过文件夹名字得到数组序号所对应的学号,比如 0 对应 1511277 。 |
核心代码
def read_path(path_name): #搜索并读取对应路径下的图片,将其和其标签添加到数组 images和 lables中
k = -1
for dir_item in os.listdir(path_name):
k = k + 1
numbers.append(str(dir_item))
# 从初始路径开始叠加,合并成可识别的操作路径
full_path = os.path.abspath(os.path.join(path_name, dir_item))
for image_item in os.listdir(full_path):
if image_item.endswith('.png'):
image_path = os.path.abspath(os.path.join(full_path, image_item))
image = cv2.imread(image_path)
images.append(image)
labels.append(k)
return images, labels, numbers
def load_dataset(path_name): # 从指定路径读取训练数据
images, labels, numbers = read_path(path_name)
# 将输入的所有图片转成四维数组,尺寸为(图片数量*IMAGE_SIZE*IMAGE_SIZE*3)
images = np.array(images)
return images, labels
def match_number(path_name): # 得到序号对应的学号
images, labels, numbers = read_path(path_name)
return numbers