Python人脸微笑识别2--卷积神经网络进行模型训练目录
上次博客,我们在Ubuntu16.04上进行dlib模型训练进行人脸微笑识别检测,本次博客,我们将通过Tensorflow进行神经网络进行微笑数据集的模型训练,然后通过Opencv实现对微笑人脸的检测
- Tensorflow版本:Tensorflow-2.2.0
- Keras版本:Keras-2.3.1
- Ubuntu版本:Ubuntu-16.04
- Python版本:Python-3.6
一、微笑数据集下载
1、微笑数据集下载
1)、微笑数据集下载注意事项
小伙伴在进行微笑数据集下载的时候,请一定注意要有正负样本的划分,并且,最好已经分类好的,也就是训练集和测试集应该需要有smile和unsmlie的分别
2)、对于微笑数据集的下载,小伙伴可以通过如下链接进行下载,是林君学长整理好的微笑数据集,且分为正负样本,链接如下所示:
https://download.csdn.net/download/qq_42451251/12579015
3)、数据集展示
smile和unsmile中的便是数据集图片啦!
2、创建人脸微笑识别项目
1)、打开终端,创建项目文件夹Smile-Python
cd ~/lenovo
mkdir Smile-Python
cd Smile-Python
3、数据集上传至Ubuntu人脸微笑识别项目文件夹
1)、将上面下载的数据集上传至Ubuntu,进行划分,林君学长之所以上传至Ubuntu上面做,是因为在Ubuntu上面配置好了Tensorflow以及Dlib环境,而在win上没有改环境,如果小伙伴在Win上面配置以上环境,便可以在Win下进行对应的操作哦!
二、Python代码实现Tensorflow神经网络模型训练
1、创建模型训练train.py文件
1)、创建训练模型文件
cd ~/lenovo/Smile-Python
touch train.py
2)、打开文件,写入步骤2的代码
gedit train.py
2、Tensorflow神经网络模型训练
1)、导入需要的库
import keras
import os, shutil
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
2)、设置数据集训练测试集、正负样本路径
train_dir='./smile/train'
train_smiles_dir='./smile/train/smile'
train_unsmiles_dir='./smile/train/unsmile'
test_dir='./smile/test'
test_smiles_dir='./smile/test/smile'
test_unsmiles_dir='./smile/test/unsmile'
3)、定义打印出训练集和测试集的正负样本尺寸函数
def printSmile():
print('total training smile images:', len(os.listdir(train_smiles_dir)))
print('total training unsmile images:', len(os.listdir(train_unsmiles_dir)))
print('total test smile images:', len(os.listdir(test_smiles_dir)))
print('total test unsmile images:', len(os.listdir(test_unsmiles_dir)))
4)、定义构建小型卷积网络并进行数据集预处理函数
#构建小型卷积网络并进行数据集预处理
def convolutionNetwork():
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
#数据预处理
#对于编译步骤,我们将像往常一样使用RMSprop优化器。由于我们的网络是以一个单一的sigmoid单元结束的,所以我们将使用二元交叉矩阵作为我们的损失
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
# 数据预处理
#All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
# This is the target directory
train_dir,
# All images will be resized to 150x150
target_size=(150, 150),
batch_size=20,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size