Bootstrap

Python处理人脸识别总结

Python处理人脸识别总结

Python完成人脸识别大致分成两个大步骤:训练模型预测匹配。下面根据这两个关键问题展开描述。

训练模型:将已经处理好的数据集,导入初始化后的模型中进行训练,得到符合我们需求的成熟的模型文件,我们利用该模型文件就可以进行预测匹配。处理数据集是指:将数据集的每个文件转换为计算机可以理解的形式,通常是矩阵形式或者向量形式。由于算法和硬件的因素,计算机需要的处理时间和处理效果各有不同,但是我们可以通过:图像灰度化缩放图像图像裁切梯度直方图等预处理方式,提升训练模式的效率和效果。

预测匹配:在训练模型结束后,我们就可以利用成熟的模型文件对样本进行预测,但是模型预测的返回值具有多种形式,如预测标签值置信度、预选框的坐标等等。所以说,如何更好的使用训练好的模型文件是值得我们探讨的。例如:设置置信度阈值、设置预选框最小最大尺寸、增加预测次数等等方式,可以很好的弥补训练模型的部分缺陷,从整体上大幅度提升识别的准确度。

训练模型

第一步 遍历训练集文件夹
#########################################
# 1,读取图片方式可以修改
# 2,检测人脸的预处理方式可以换成其他方式
# 3,获取人脸labelid利用的是split切片方式,需要根据情况修改
#########################################
import dlib
import cv2

# 构造hog分类器
hog_face_detector = dlib.get_frontal_face_detector()

def getFaceImgLabel(fileName):
    
    # 读取图片
    cap = cv2.VideoCapture(fileName)
    ret,img = cap.read()
    
    # 转为灰度图
    img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    # 检测人脸(降低计算复杂度,去背景)
    detections = hog_face_detector(img,1)
    
    # 判断是否有人脸
    if len(detections) > 0:
        # 获取人脸区域坐标
        ###
        x = detections[0].left()
        y = detections[0].top()
        r = detections[0].right()
        b = detections[0].bottom()
        ###
        # 截取人脸
        img_crop = img[y:b,x:r]
        # 缩放解决冲突
        img_crop = cv2.resize(img_crop,(120,120))
        # 获取人脸labelid
        label_id = int(fileName.split('/')[-1].split('.')[0].split('subject')[-1])
        # 返回值
        return img_crop,label_id
    else:
        return None,-1
######################################
# 1,获取文件列表要修改
# 2,img_list和label_list是列表类型,后期可能需要修改  np.array()
######################################
import glob

#获取文件列表
file_list =glob.glob('./yalefaces/train/*')

# 构造两个空列表
img_list = []
label_list = []

for train_file in file_list:
    # 获取每一张图片的对应信息
    img, label = getFaceImgLabel(train_file)
    
    #过滤数据
    if label != -1:
        img_list.append(img)
        label_list.append(label)
第二步 初始化模型
# 构造分类器
# face_cls1 = cv2.face.LBPHFaceRecognizer_create()
# face_cls2 = cv2.face.EigenFaceRecognizer_create()
# face_cls3 = cv2.face.FisherFaceRecognizer_create()
# face_cls3 = cv2.face.FisherFaceRecognizer_create()

残差网络模型比较特殊,在此处附上初始化模型代码,仅做提醒。

# 残差网络模型比较特殊
# 关键点 检测模型
shape_detector = dlib.shape_predictor('./weights/shape_predictor_68_face_landmarks.dat')
# resnet模型
face_descriptor_extractor = dlib.face_recognition_model_v1('./weights/dlib_face_recognition_resnet_model_v1.dat')
第三步 将数据导入模型进行训练
# 训练
face_cls.train(img_list,np.array(label_list))

预测匹配

预测一张样本图片,在此处我们同样也调用了getFaceImgLabel()函数,可见该函数的重要性和实用性,牢记并理解。

# 预测一张图片
test_file = './yalefaces/test/subject03.glasses.gif'

img,label = getFaceImgLabel(test_file)

#过滤数据
if label != -1:
    predict_id,distance = face_cls.predict(img)
    print(predict_id)

评估模型

# 评估模型
file_list =glob.glob('./yalefaces/test/*')
# 真实标签
true_list = []
# 预测标签
predict_list = []

for test_file in file_list:
    # 获取每一张图片的对应信息
    img,label = getFaceImgLabel(test_file)
    #过滤数据
    if label != -1:
        predict_id,distance = face_cls.predict(img)
        predict_list.append(predict_id)
        true_list.append(label)

# 查看准确率
from sklearn.metrics import accuracy_score
accuracy_score(true_list,predict_list)
# 获取融合矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(true_list,predict_list)


# 可视化
import seaborn
seaborn.heatmap(cm,annot=True)

;