引言:
机器视觉在近些年来很热门,比如自动驾驶、人脸识别等领域都有很大的作用,所以也有很多人愿意去学习相关内容,本文将初步探索人脸识别领域中人脸识别的模块。
正文:
如果真的要自己从底层开发识别人脸的程序,那么难度还是很大的。
其实还是站在巨人的肩膀上看世界,权当娱乐或增进自己的知识面还是没问题的。本文将讲解利用cv2等模块实现人脸识别。
工具准备:Pycharm 、cv2、PIL、os和numpy模块 。
而CV2(OpenCV 库的 Python 接口)是基于 OpenCV(Open Source Computer Vision Library)开发的。OpenCV 最初是由英特尔公司(Intel)发起并开发的一个计算机视觉库。
PIL 是 Python 中一个功能强大的图像处理库,它提供了广泛的图像操作功能,如打开、保存、裁剪、旋转、缩放、滤镜处理等多种操作。它能够处理多种图像文件格式,包括但不限于 JPEG、PNG、BMP 等常见格式。
os模块可以方便地与操作系统进行交互,执行诸如文件和目录操作、获取系统信息等任务,在本实验主要是文件与目录操作。
思路:首先分为几个模块,人脸检测模块(判断是否有人脸)、整合人脸与其对应的标签的函数、使用cv.face.LBPHFaceRecognizer_create()的train、predict等函数进行训练模型。
程序运行流程:首先调用函数,处理图片数据,使得图片转为机器能够处理的数组数据,其中还要整理好与其对应的图片标签,(在本实验只训练了两个人脸识别,陈冠希和彭于晏,使用这个还可以测试一下与彭于晏和陈冠希的相似程度,权当娱乐),整合好数据就可以使用cv2封装好的模型进行训练和预测,最终结果还是不错的。如下图,上面的标签就是预测的结果,如若出现不认识的人脸,也会标出。
具体模块程序如下:
人脸检测模块(主要是判断人脸位置,返回数组数据,以便后续处理)
# 脸部检测函数
def face_recg(image):
image = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #因为后续处理需要灰度图像
face_recg = cv.CascadeClassifier("haarcascade_frontalface_default.xml") # openCV的开源文件
count = 6
while (count > 0):
count -=1
# print("FACE_REG计数值",count)
faces = face_recg.detectMultiScale(image, 1.2, 6)
# 如果未检测到面部,则返回原始图像
if (len(faces) == 0):
if count == 0:
return None,None
continue
else: # 目前假设只有一张脸,xy为左上角坐标,wh为矩形的宽高
(x, y, w, h) = faces[0]
# 返回图像的脸部部分
return image[y:y + w, x:x + h], faces[0]
处理图片数据和标签:
def addfaces(img_path,labelname):
"""
img_path: 文件夹路径
labelname:图片标签
"""
# 用于存储训练集图片数据和对应标签的列表
train_images_list = []
train_labels_list = []
count=0
root_src = img_path
while (count < 10):
# 构建正确的图片文件路径,确保路径拼接正确
img_path = os.path.join(root_src, str(count)+ '.jpeg')
if not os.path.exists(img_path):
print(f"警告:训练集图片 {img_path} 不存在,跳过该图片")
count += 1
pass
# face = Image.open(img_path).convert('RGB')
else:
face = cv.imread(img_path)
facedata, rect = face_recg(face)
if facedata is not None:
# 将脸添加到脸部列表并添加相应的标签
train_images_list.append(facedata)
train_labels_list.append(labelname)
count += 1
# print("ADDFACE计数值",count)
else:
count += 1
cv.waitKey(1)
cv.destroyAllWindows()
return train_images_list,train_labels_list
剩下的就是简单的调用训练和预测函数,以及如何让图片和预测结果显示了。