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)