使用Python进行人脸识别

发布于:2024-12-21 ⋅ 阅读:(16) ⋅ 点赞:(0)

引言:

机器视觉在近些年来很热门,比如自动驾驶、人脸识别等领域都有很大的作用,所以也有很多人愿意去学习相关内容,本文将初步探索人脸识别领域中人脸识别的模块。

正文:

   如果真的要自己从底层开发识别人脸的程序,那么难度还是很大的。

   其实还是站在巨人的肩膀上看世界,权当娱乐或增进自己的知识面还是没问题的。本文将讲解利用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

剩下的就是简单的调用训练和预测函数,以及如何让图片和预测结果显示了。