利用Python cv2和CNN算法实现人脸识别

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、识别结果如下,每个人图片都各自简历文件夹,最好图片数量多,本次图片数量较少,匹配相对不是很准确,偶尔需要匹配几次才能匹配成功,离摄像头的距离远近以对识别效果也有一定影响

 

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值