基于cnn卷积神经网络的tensorflow+keras深度学习的人脸识别(代码片段)

BIGBOSSyifi BIGBOSSyifi     2022-12-07     255

关键词:

基于CNN卷积神经网络的TensorFlow+Keras深度学习的人脸识别

前言

在上一篇博客中,利用CNN卷积神经网络的TensorFlow+Keras深度学习搭建了人脸模型:
基于CNN卷积神经网络的TensorFlow+Keras深度学习搭建人脸模型
本篇博客将继续利用CNN卷积神经网络的TensorFlow+Keras深度学习实现人脸识别

项目实现效果

补充

PS:项目地址在最后会开源

本项目使用TensorFlow-GPU进行训练:需要提前搭建好CUDA环境具体可以参考本文:TensorFlow-GPU-2.4.1与CUDA安装教程

模型数据

嵌入模型

Model: "embedding"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_image (InputLayer)     [(None, 100, 100, 3)]     0         
_________________________________________________________________
conv2d (Conv2D)              (None, 91, 91, 64)        19264     
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 46, 46, 64)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 40, 40, 128)       401536    
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 20, 20, 128)       0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 17, 17, 128)       262272    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 9, 9, 128)         0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 6, 6, 256)         524544    
_________________________________________________________________
flatten (Flatten)            (None, 9216)              0         
_________________________________________________________________
dense (Dense)                (None, 4096)              37752832  
=================================================================
Total params: 38,960,448
Trainable params: 38,960,448
Non-trainable params: 0
_________________________________________________________________

CNN神经网络模型

Model: "SiameseNetWork"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_image (InputLayer)        [(None, 100, 100, 3) 0                                            
__________________________________________________________________________________________________
validation_img (InputLayer)     [(None, 100, 100, 3) 0                                            
__________________________________________________________________________________________________
embedding (Functional)          (None, 4096)         38960448    input_image[0][0]                
                                                                 validation_img[0][0]             
__________________________________________________________________________________________________
distance (L1Dist)               (None, 4096)         0           embedding[4][0]                  
                                                                 embedding[5][0]                  
__________________________________________________________________________________________________
dense_4 (Dense)                 (None, 1)            4097        distance[0][0]                   
==================================================================================================
Total params: 38,964,545
Trainable params: 38,964,545
Non-trainable params: 0
__________________________________________________________________________________________________

项目概述

项目运行流程

1. 收集人脸数据—设置数据的路径并对数据集预处理

2. 构建训练模型——搭建深度神经网络

3. 深度训练人脸数据——CNN卷积神经网络+TensorFlow+Keras

4. 搭建人脸识别APP——OpenCV+Kivy.APP

核心环境配置

Python == 3.9.0
labelme == 5.0.1
tensorflow -gpu == 2.7.0 (CUDA11.2)
opencv-python == 4.0.1
Kivy == 2.1.0
albumentations == 0.7.12

项目核心代码详解

目录

名称用途
data收集的人脸数据
data-anchor被测人脸数据
data-negative混淆数据集
data-positive预处理后人脸数据
training_checkpoints训练数据集日志(检查点)
.h5已训练好的人脸模型(.h5)
ImgPath0.py设置数据集的目录
ImgCatch1.py手机人脸数据
ImgPreprocess2.py图像预处理
Model_Engineering3构建训练模型
Training.py深度训练数据集
cvOS.py人脸识别APP
TensorFlowTest.pyCUDA环境检测

本项目用的到野生人脸数据集下载地址:深度学习人脸训练数据集

本项目基于《Siamese Neural Networks for One-shot Image Recognition》这篇论文为理论基础:Siamese Neural Networks for One-shot Image Recognition

核心代码

引入的核心库文件:

import cv2
import numpy as np
from matplotlib import pyplot as plt

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Layer, Conv2D, Dense, MaxPooling2D, Input, Flatten
import tensorflow as tf

加入GPU内存增长限制—防止爆显存

gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus: 
    tf.config.experimental.set_memory_growth(gpu, True)

设置数据集目录

POS_PATH = os.path.join('data', 'positive')
NEG_PATH = os.path.join('data', 'negative')
ANC_PATH = os.path.join('data', 'anchor')

os.makedirs(POS_PATH)
os.makedirs(NEG_PATH)
os.makedirs(ANC_PATH)

# 导入野生数据集
for directory in os.listdir('666'):
    for file in os.listdir(os.path.join('666', directory)):
        EX_PATH = os.path.join('666', directory, file)
        NEW_PATH = os.path.join(NEG_PATH, file)
        os.replace(EX_PATH, NEW_PATH)

收集人脸识别数据——UUID格式命名

cap = cv2.VideoCapture(0)
while cap.isOpened(): 
    ret, frame = cap.read()
   
    # 裁剪图像大小250x250px
    frame = frame[120:120+250,200:200+250, :]
    
    # 收集人脸数据——正面清晰的数据集
    if cv2.waitKey(1) & 0XFF == ord('a'):
        # 对数据进行UUID命名
        imgname = os.path.join(ANC_PATH, '.jpg'.format(uuid.uuid1()))
        # 写入并保存数据
        cv2.imwrite(imgname, frame)
    
    # 收集数据集——侧脸斜脸的数据集(可以较模糊)
    if cv2.waitKey(1) & 0XFF == ord('p'):
        # 对数据进行UUID命名
        imgname = os.path.join(POS_PATH, '.jpg'.format(uuid.uuid1()))
        # 写入并保存数据
        cv2.imwrite(imgname, frame)
    
    cv2.imshow('Image Collection', frame)
    
    if cv2.waitKey(1) & 0XFF == ord('q'):
        break
        
# 释放摄像头资源
cap.release()
cv2.destroyAllWindows()

创建标签化数据集

positives = tf.data.Dataset.zip((anchor, positive, tf.data.Dataset.from_tensor_slices(tf.ones(len(anchor)))))
negatives = tf.data.Dataset.zip((anchor, negative, tf.data.Dataset.from_tensor_slices(tf.zeros(len(anchor)))))
data = positives.concatenate(negatives)

samples = data.as_numpy_iterator()
exampple = samples.next()

构建训练和测试数据的分区

def preprocess_twin(input_img, validation_img, label):
    return(preprocess(input_img), preprocess(validation_img), label)

res = preprocess_twin(*exampple)


data = data.map(preprocess_twin)
data = data.cache()
data = data.shuffle(buffer_size=1024)

train_data = data.take(round(len(data)*.7))
train_data = train_data.batch(16)
train_data = train_data.prefetch(8)

test_data = data.skip(round(len(data)*.7))
test_data = test_data.take(round(len(data)*.3))
test_data = test_data.batch(16)
test_data = test_data.prefetch(8)``

创建模型

inp = Input(shape=(100,100,3), name='input_image')
c1 = Conv2D(64, (10,10), activation='relu')(inp)
m1 = MaxPooling2D(64, (2,2), padding='same')(c1)

c2 = Conv2D(128, (7,7), activation='relu')(m1)
m2 = MaxPooling2D(64, (2,2), padding='same')(c2)

c3 = Conv2D(128, (4,4), activation='relu')(m2)
m3 = MaxPooling2D(64, (2,2), padding='same')(c3)

c4 = Conv2D(256, (4,4), activation='relu')(m3)
f1 = Flatten()(c4)
d1 = Dense(4096, activation='sigmoid')(f1)

mod = Model(inputs=[inp], outputs=[d1], name='embedding')
mod.summary()

def make_embedding(): 
    inp = Input(shape=(100,100,3), name='input_image')
    # 第一层卷积
    c1 = Conv2D(64, (10,10), activation='relu')(inp)
    m1 = MaxPooling2D(64, (2,2), padding='same')(c1)
    
    # 第二层卷积
    c2 = Conv2D(128, (7,7), activation='relu')(m1)
    m2 = MaxPooling2D(64, (2,2), padding='same')(c2)
    
    # 第三层卷积 
    c3 = Conv2D(128, (4,4), activation='relu')(m2)
    m3 = MaxPooling2D(64, (2,2), padding='same')(c3)
    
    # 最终卷积
    c4 = Conv2D(256, (4,4), activation='relu')(m3)
    f1 = Flatten()(c4)
    d1 = Dense(4096, activation='sigmoid')(f1)
    
    
    return Model(inputs=[inp], outputs=[d1], name='embedding')
    embedding = make_embedding()

构建距离层

# L1距离层
class L1Dist(Layer):
    
    # 初始化方法
    def __init__(self, **kwargs):
        super().__init__()
       
    # 数据相似度计算
    def call(self, input_embedding, validation_embedding):
        return tf.math.abs(input_embedding - validation_embedding)
        l1 = L1Dist()
        l1(anchor_embedding, validation_embedding)

构建神经网络模型

input_image = Input(name='input_img', shape=(100,100,3))
validation_image = Input(name='validation_img', shape=(100,100,3))

inp_embedding = embedding(input_image)
val_embedding = embedding(validation_image)

siamese_layer = L1Dist()
distances = siamese_layer(inp_embedding, val_embedding)
classifier = Dense(1, activation='sigmoid')(distances)
siamese_network = Model(inputs=[input_image, validation_image], outputs=classifier, name='SiameseNetwork')

深度训练模型

搭建损失值和优化器

binary_cross_loss = tf.losses.BinaryCrossentropy()
opt = tf.keras.optimizers.Adam(1e-4) # 0.0001

设置训练检查点

checkpoint_dir = './training_checkpoints'
checkpoint_prefix = os.path.join(checkpoint_dir, 'ckpt')
checkpoint = tf.train.Checkpoint(opt=opt, siamese_model=siamese_model)

设置训练batch

test_batch = train_data.as_numpy_iterator()
batch_1 = test_batch.next()

X = batch_1[:2]
y = batch_1[2]

@tf.function
def train_step(batch):
    
    # 日志记录
    with tf.GradientTape() as tape:     
        # 获得人脸数据
        X = batch[:2]
        # 获得标签
        y = batch[2]
        
        # yhat的值向上传递
        yhat = siamese_model(X, training=True)
        # 计算损失值
        loss = binary_cross_loss(y, yhat)
    print(loss)
        
    # 计算渐变值
    grad = tape.gradient(loss, siamese_model.trainable_variables)
    
    # 计算更新的权重传递给模型
    opt.apply_gradients(zip(grad, siamese_model.trainable_variables))
    
    # 返回损失值
    return loss

设置训练循环

def train(data, EPOCHS):
    # Loop through epochs
    for epoch in range(1, EPOCHS+1):
        print('\\n Epoch /'.format(epoch, EPOCHS))
        progbar = tf.keras.utils.Progbar(len(data))
      

基于tensorflow的cnn卷积神经网络对fasion-mnist数据集的分类器(代码片段)

写一个基于tensorflow的cnn,分类fasion-MNIST数据集这个就是fasion-mnist数据集了先上代码,在分析:importtensorflowastfimportpandasaspdimportnumpyasnpconfig=tf.ConfigProto()config.gpu_options.per_process_gpu_memory_fraction=0.3train_ 查看详情

基于tensorflow卷积神经网络(cnn)的人脸年龄和性别检测系统

...0点击下载:点击下载简要概述:基于Tensorflow卷积神经网络(CNN)的人脸年龄和性别检测系统针对年龄组和性别估计,对两个自定义CNN层进行了训练。对于年龄组分类,CNN对23000张图像进行了训练;对于性别分类&#... 查看详情

tensorflow实战-tensorflow实现卷积神经网络cnn-第5章

第5章-TensorFlow实现卷积神经网络CNN5.1卷积神经网络简介卷积神经网络CNN最初是为了解决图像识别等问题设计的,当然现在的应用已经不限于图像和视频,也可以用于时间序列信号,比如音频信号、文本数据等。在深度学习出现之... 查看详情

字符型图片验证码,使用tensorflow实现卷积神经网络,进行验证码识别cnn

本项目使用卷积神经网络识别字符型图片验证码,其基于TensorFlow框架。它封装了非常通用的校验、训练、验证、识别和调用API,极大地减低了识别字符型验证码花费的时间和精力。 项目地址:https://github.com/nickliqian/cnn_captcha... 查看详情

mnist的卷积神经网络(cnn)

1MNIST网络结构及算法推导2.基于tensorflow的实现参考:https://blog.csdn.net/zgzczzw/article/details/79897956 查看详情

mnist的卷积神经网络(cnn)

1MNIST网络结构及算法推导2.基于tensorflow的实现参考:https://blog.csdn.net/zgzczzw/article/details/79897956 查看详情

基于深度学习的天气识别算法对比研究-tensorflow实现-卷积神经网络(cnn)|第1例(内附源码+数据)(代码片段)

🥧我的环境:语言环境:Python3深度学习环境:TensorFlow2🥂相关教程:编译器教程:新手入门深度学习|1-2:编译器JupyterNotebook深度学习环境配置教程:新手入门深度学习|1-1:配置深度学习环... 查看详情

卷积神经网络cnn原理以及tensorflow实现

      在知乎上看到一段介绍卷积神经网络的文章,感觉讲的特别直观明了,我整理了一下。首先介绍原理部分。      通过一个图像分类问题介绍卷积神经网络是如何工作的。下面是卷... 查看详情

pytorch实现卷积神经网络cnn

Pytorch是torch的Python版本,对TensorFlow造成很大的冲击,TensorFlow无疑是最流行的,但是Pytorch号称在诸多性能上要优于TensorFlow,比如在RNN的训练上,所以Pytorch也吸引了很多人的关注。之前有一篇关于TensorFlow实现的CNN可以用来做对比... 查看详情

tensorflow学习笔记五:mnist实例--卷积神经网络(cnn)

mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的。但是CNN层数要多一些,网络模型需要自己来构建。程序比较复杂,我就分成几个部分来叙述。首先,下载并加载数据:importtensorflowastfimporttensorflow.examples.... 查看详情

基于卷积神经网络cnn的分类研究,基于卷积神经网络的手写体识别(代码片段)

目录背影卷积神经网络CNN的原理卷积神经网络CNN的定义卷积神经网络CNN的神经元卷积神经网络CNN的激活函数卷积神经网络CNN的传递函数卷积神经网络CNN手写体识别基本结构主要参数MATALB代码结果图展望背影现在生活,各种人... 查看详情

tensorflow实现cnn案例笔记(代码片段)

...例1案例2案例3案例4 Tensorflow和CNN: Tensorflow——卷积神经网络(CNN)卷积神经网络工作概述卷积整体结构示例:TensorFlow2 查看详情

tensorflow中使用cnn实现mnist手写体识别

...得到下面适用于本手写识别的cnn结构,构造一个两层卷积神经网络,神经网络的结构如下图所示:  输入-卷积-pooling-卷积-pooling-全连接层-Dropout-Softmax输出    第一层卷积利用5*5的patch,32个卷积核,可以计算出32个特征。... 查看详情

深度学习基于卷积神经网络(tensorflow)的人脸识别项目(代码片段)

...函数Tanh/双曲正切激活函数ReLU激活函数损失函数作用建立神经网络模型参数说明CNN模型网络结构训练模型训练结果评估模型加载模型评估测试测试结果总结前言经过前段时间研究,从LeNet-5手写数字入门到最近研究的一篇天气... 查看详情

深度学习之卷积神经网络cnn及tensorflow代码实现示例

一、CNN的引入在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的28×2828×28... 查看详情

基于卷积神经网络cnn的水果分类预测,卷积神经网络水果等级识别(代码片段)

目录背影卷积神经网络CNN的原理卷积神经网络CNN的定义卷积神经网络CNN的神经元卷积神经网络CNN的激活函数卷积神经网络CNN的传递函数卷积神经网络CNN水果分类预测基本结构主要参数MATALB代码结果图展望背影现在生活,为节... 查看详情

深度学习与tensorflow2.0卷积神经网络(cnn)(代码片段)

...ark。初学深度学习,在这个数据集上训练一个有效的卷积神经网络就相当于学习编程的时候打印出一行“HelloWorld!”。下面基于与MNIST数据集非常类似的另一个数据集Fashion-MNIST数据集来构建一个卷积神经网络。 0.Fashion-M... 查看详情

《神经网络与深度学习》卷积神经网络cnn及tensorflow代码实现示例

....net/cxmscb/article/details/71023576一、CNN的引入在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢... 查看详情