【Python深度学习】Tensorflow+CNN进行人脸识别实战(附源码和数据集)

简介: 【Python深度学习】Tensorflow+CNN进行人脸识别实战(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

下面利用tensorflow平台进行人脸识别实战,使用的是Olivetti Faces人脸图像 部分数据集展示如下

程序训练过程如下

接下来训练CNN模型 可以看到训练进度和损失值变化

接下来展示人脸识别结果

程序会根据一张图片自动去图片集中寻找相似的人脸 如上图所示

部分代码如下 需要全部源码和数据集请点赞关注收藏后评论区留言私信~~~

from os import listdir
import numpy as np
from PIL import Image
import cv2
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Flatten
from sklearn.model_selection import train_test_split
from tensorflow.python.keras.utils import np_utils
# 读取人脸图片数据
def img2vector(fileNamestr):
    # 创建向量
    returnVect = np.zeros((57,47))    
    image = Image.open(fileNamestr).convert('L')    
    img = np.asarray(image).reshape(57,47)    
    return img
# 制作人脸数据集
def GetDataset(imgDataDir):   
    print('| Step1 |: Get dataset...')
    imgDataDir='faces_4/'
    FileDir = listdir(imgDataDir)
    m = len(FileDir)
    imgarray=[]
    hwLabels=[]
    hwdata=[]
    # 逐个读取图片文件
    for i in range(m):
        # 提取子目录
        className=i
        subdirName='faces_4/'+str(FileDir[i])+'/'
        fileNames = listdir(subdirName)                
        lenFiles=len(fileNames)
        # 提取文件名
        for j in range(lenFiles): 
            fileNamestr = subdirName+fileNames[j]
            hwLabels.append(className)    
            imgarray=img2vector(fileNamestr)
            hwdata.append(imgarray)
    hwdata = np.array(hwdata)
    return hwdata,hwLabels,6
# CNN模型类
class MyCNN(object):
    FILE_PATH = "face_recognition.h5"  # 模型存储/读取目录
    picHeight = 57  # 模型的人脸图片长47,宽57
    picWidth = 47  
    def __init__(self):
        self.model = None
    # 获取训练数据集
    def read_trainData(self, dataset):        
        self.dataset = dataset
    # 建立Sequential模型,并赋予参数
    def build_model(self):
        print('| Step2 |: Init CNN model...')
        self.model = Sequential()
        print('self.dataset.X_train.shape[1:]',self.dataset.X_train.shape[1:])
        self.model.add( Convolution2D( filters=32,
                                      kernel_size=(5, 5),
                                      padding='same',
                                      #dim_ordering='th',
                                      input_shape=self.dataset.X_train.shape[1:]))
        self.model.add(Activation('relu'))
        self.model.add( MaxPooling2D(pool_size=(2, 2),
                                     strides=(2, 2),
                                     padding='same' ) )
        self.model.add(Convolution2D(filters=64, 
                                     kernel_size=(5, 5), 
                                     padding='same') )
        self.model.add(Activation('relu'))
        self.model.add(MaxPooling2D(pool_size=(2, 2), 
                                    strides=(2, 2), 
                                    padding='same') )
        self.model.add(Flatten())
        self.model.add(Dense(512))
        self.model.add(Activation('relu'))
        self.model.add(Dense(self.dataset.num_classes))
        self.model.add(Activation('softmax'))
        self.model.summary()
    # 模型训练
    def train_model(self):
        print('| Step3 |: Train CNN model...')
        self.model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
        # epochs:训练代次、batch_size:每次训练样本数
        self.model.fit(self.dataset.X_train, self.dataset.Y_train, epochs=10, batch_size=20)
    def evaluate_model(self):
        loss, accuracy = self.model.evaluate(self.dataset.X_test, self.dataset.Y_test)
        print('| Step4 |: Evaluate performance...')
        print('===================================')        
        print('Loss   Value   is :', loss)
        print('Accuracy Value is :', accuracy)
    def save(self, file_path=FILE_PATH):        
        print('| Step5 |: Save model...')
        self.model.save(file_path)
        print('Model ',file_path,'is succeesfuly saved.')
# 建立一个用于存储和格式化读取训练数据的类
class DataSet(object):
    def __init__(self, path):
        self.num_classes = None
        self.X_train = None
        self.X_test = None
        self.Y_train = None
        self.Y_test = None
        self.picWidth = 47
        self.picHeight = 57        
        self.makeDataSet(path)  # 在这个类初始化的过程中读取path下的训练数据
    def makeDataSet(self, path):
        # 根据指定路径读取出图片、标签和类别数
        imgs, labels, clasNum = GetDataset(path)
        # 将数据集打乱随机分组
        X_train, X_test, y_train, y_test = train_test_split(imgs, labels, test_size=0.2,random_state=1)
        # 重新格式化和标准化
        X_train = X_train.reshape(X_train.shape[0], 1, self.picHeight, self.picWidth) / 255.0
        X_test = X_test.reshape(X_test.shape[0], 1, self.picHeight, self.picWidth) / 255.0
        X_train = X_train.astype('float32')
        X_test = X_test.astype('float32')
        # 将labels转成 binary class matrices
        Y_train = np_utils.to_categorical(y_train, num_classes=clasNum)
        Y_test = np_utils.to_categorical(y_test, num_classes=clasNum)
        # 将格式化后的数据赋值给类的属性上
        self.X_train = X_train
        self.X_test = X_test
        self.Y_train = Y_train
        self.Y_test = Y_test
        self.num_classes = clasNum
# 人脸图片目录
dataset = DataSet('faces_4/')
model = MyCNN()
model.read_trainData(dataset)
model.build_model()
model.train_model()
model.evaluate_model()
model.save()

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
5月前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南
蒋星熠Jaxonic,深度学习探索者。本文深度对比TensorFlow与PyTorch架构、性能、生态及应用场景,剖析技术选型关键,助力开发者在二进制星河中驾驭AI未来。
819 13
|
9月前
|
机器学习/深度学习 监控 算法
基于mediapipe深度学习的手势数字识别系统python源码
本内容涵盖手势识别算法的相关资料,包括:1. 算法运行效果预览(无水印完整程序);2. 软件版本与配置环境说明,提供Python运行环境安装步骤;3. 部分核心代码,完整版含中文注释及操作视频;4. 算法理论概述,详解Mediapipe框架在手势识别中的应用。Mediapipe采用模块化设计,包含Calculator Graph、Packet和Subgraph等核心组件,支持实时处理任务,广泛应用于虚拟现实、智能监控等领域。
|
5月前
|
人工智能 自然语言处理 TensorFlow
134_边缘推理:TensorFlow Lite - 优化移动端LLM部署技术详解与实战指南
在人工智能与移动计算深度融合的今天,将大语言模型(LLM)部署到移动端和边缘设备已成为行业发展的重要趋势。TensorFlow Lite作为专为移动和嵌入式设备优化的轻量级推理框架,为开发者提供了将复杂AI模型转换为高效、低功耗边缘计算解决方案的强大工具。随着移动设备硬件性能的不断提升和模型压缩技术的快速发展,2025年的移动端LLM部署已不再是遥远的愿景,而是正在成为现实的技术实践。
1308 39
|
8月前
|
机器学习/深度学习 存储 监控
基于深度学习YOLO框架的城市道路损伤检测与评估项目系统【附完整源码+数据集】
本项目基于深度学习的YOLO框架,成功实现了城市道路损伤的自动检测与评估。通过YOLOv8模型,我们能够高效地识别和分类路面裂缝、井盖移位、坑洼路面等常见的道路损伤类型。系统的核心优势在于其高效性和实时性,能够实时监控城市道路,自动标注损伤类型,并生成损伤评估报告。
477 0
基于深度学习YOLO框架的城市道路损伤检测与评估项目系统【附完整源码+数据集】
|
8月前
|
机器学习/深度学习 自动驾驶 算法
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
在智慧交通和智能驾驶日益普及的今天,准确识别复杂交通场景中的关键元素已成为自动驾驶系统的核心能力之一。传统的图像处理技术难以适应高动态、复杂天气、多目标密集的交通环境,而基于深度学习的目标检测算法,尤其是YOLO(You Only Look Once)系列,因其检测速度快、精度高、可部署性强等特点,在交通场景识别中占据了重要地位。
1015 0
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)
深入理解深度学习中的卷积神经网络(CNN)
681 10
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN): 从理论到实践
本文将深入浅出地介绍卷积神经网络(CNN)的工作原理,并带领读者通过一个简单的图像分类项目,实现从理论到代码的转变。我们将探索CNN如何识别和处理图像数据,并通过实例展示如何训练一个有效的CNN模型。无论你是深度学习领域的新手还是希望扩展你的技术栈,这篇文章都将为你提供宝贵的知识和技能。
1129 7
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
|
机器学习/深度学习 人工智能 TensorFlow
基于TensorFlow的深度学习模型训练与优化实战
基于TensorFlow的深度学习模型训练与优化实战
695 3