这里介绍一个深度学习的简单应用,制作一个微笑检测程序。用深度学习技术做分类,然后再用OpenCV的级联分类器做人脸识别,基本可以做到实时检测。
下面介绍微笑脸分类模型的构建:
数据介绍
数据地址:https://github.com/hromi/SMILEsmileD
数据包含13165张灰度图片,每张图片的尺寸是64*64。这个数据集并不算平衡,13165张图片中,有9475张图片不是笑脸图片,有3690张图片是笑脸图片。数据差异很大。
数据预处理
首先导入相应的包:
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from keras.preprocessing.image import img_to_array
from keras.utils import np_utils
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import imutils
import cv2
import os
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
dataset_dir = os.path.abspath(r"./SMILEs/") #smile数据集路径
model_dir = os.path.abspath(r"./model/lenet.hdf5") #训练模型保存路径
data = []
labels = []
for imagePath in sorted(list(paths.list_images(dataset_dir))):
image = cv2.imread(imagePath)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换成灰度图像
image = imutils.resize(image, width = 28) #将图像尺寸改成28*28
image = img_to_array(image) #使用Keras的img_to_array转换成浮点型和(28*28*1),便于接下来神经网络学习
data.append(image)
label = imagePath.split(os.path.sep)[-3]
label = "smiling" if label == "positives" else "not_smiling" #如果label字符串里面有positive就重命名为smiling
labels.append(label)
# 将data和labels都转换为numpy类型
data = np.array(data, dtype= "float") / 255.0 #将像素转换到[0, 1]范围之内
labels = np.array(labels)
# 对label进行one-hot编码
le = LabelEncoder().fit