https://github.com/WhyEastOne/face_recognization
本代码在参考了该大神的一篇博客,里面讲解很详细,包括环境安装和算法,膜拜。。。https://blog.csdn.net/qq_42633819/article/details/81191308
本人在此基础上实现了自动匹配人类别并把姓名显示在图像上,仅供参考
1、读取包含各个人的文件夹:
labels = np.array(LabelEncoder().fit_transform(labels))#进行编码
#从指定路径读取训练数据
def load_dataset(path_name):
images,labels = read_path(path_name)
#将输入的所有图片转成四维数组,尺寸为(图片数量*IMAGE_SIZE*IMAGE_SIZE*3)
#我和闺女两个人共1200张图片,IMAGE_SIZE为64,故对我来说尺寸为1200 * 64 * 64 * 3
#图片为64 * 64像素,一个像素3个颜色值(RGB)
images = np.array(images)
print(images.shape)
#标注数据,'WHY'文件夹下都是我的脸部图像,全部指定为0,另外一个文件夹下,全部指定为1
#labels = np.array([0 if label.endswith('WHY') else 1 for label in labels])
labels = np.array(LabelEncoder().fit_transform(labels))#进行编码
return images, labels
2、在训练时自动读取类别数量
class Dataset:
def __init__(self, path_name):
#训练集
self.train_images = None
self.train_labels = None
#验证集
self.valid_images = None
self.valid_labels = None
#测试集
self.test_images = None
self.test_labels = None
#数据集加载路径
self.path_name = path_name
#当前库采用的维度顺序
self.input_shape = None
#类别数量
self.nb_classes = None
#类别数量
self.nb_classes = None
下面加载数据时也要定义类别,以供下面模型构建时传入。
3、在预测时匹配人名显示在图像上,下面这个函数即参考读取文件夹的思想,把图片对应标签存入labels变量:
#-------------------------获取图片对应的标签------------------------------------
import os
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
path_name = './face_detect_database/data'
labels = []
def read_path(path_name): #读取类别,以便下面进行图像文字匹配
for dir_item in os.listdir(path_name):
#从初始路径开始叠加,合并成可识别的操作路径
full_path = os.path.abspath(os.path.join(path_name, dir_item))
if os.path.isdir(full_path): #如果是文件夹,继续递归调用
read_path(full_path)
else: #文件
if dir_item.endswith('.jpg') or dir_item.endswith('.png'):
if path_name not in labels:
labels.append(path_name)
return labels
labels = read_path(path_name)
labels = [name.split('\\')[-1] for name in labels]
读取视频中人脸并基于labels匹配显示姓名在图像上:
#文字提示是谁
cv2.putText(frame,'%s'%labels[faceID],
(x + 30, y + 30), #坐标
cv2.FONT_HERSHEY_SIMPLEX, #字体
1, #字号
(255,0,255), #颜色
2)
4、识别结果如下,每个人图片都各自简历文件夹,最好图片数量多,本次图片数量较少,匹配相对不是很准确,偶尔需要匹配几次才能匹配成功,离摄像头的距离远近以对识别效果也有一定影响