Keras实现判断是否为人脸模型

第一次使用keras进行人脸识别的判断,这里先介绍下keras是什么?

Keras是基于Theano的一个深度学习框架,它的设计参考了Torch,由纯Python编写而成并基Tensorflow、Theano以及CNTK后端,是一个高度模块化的神经网络库,支持GPU和CPU。中文官方文档:http://keras-cn.readthedocs.io/en/latest/

下面是一个使用keras完成的人脸判断模型,没有做太多优化,只是完成了流程。。。。各位可以给点优化的意见~

一、数据集

对于要进行训练、验证、测试的数据集图片,要按照一定的格式进行存放。比如现在这个模型是判断图片是否为人脸,那么这就是一个二分类问题,所以数据集存放结构如下:

train(训练集)
        -- face(人脸图片)
        -- no_face(非人脸图片)
validate(验证集)
        -- face
        -- no_face
test(测试集)
        -- face
        -- no_face

图片存放按照这个结构设置,这样keras在训练模型时会对 face、no_face进行读取编号,输出结果也会对应为二分类的结果。若你的模型时多分类的,那么也需要根据这个存放结构创建多个文件夹来存放每个分类的图片,便于训练预测。

二、GPU使用限制

先对GPU的使用做了下限制,因为别人也有在用这个机器。。所以还是限制下好

import os
import tensorflow as tf
import keras.backend.tensorflow_backend as KTF

# 指定第一块GPU可用 
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

config = tf.ConfigProto()  
config.gpu_options.allow_growth=True   # 不全部占满显存, 按需分配
sess = tf.Session(config=config)

KTF.set_session(sess)

三、模型训练

1、这部分保存了一些import的类和一些公共常量

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ModelCheckpoint
from keras.optimizers import SGD
import keras
import os

# 类别数量
NUM_CLASSES = 2
# 通道数
CHANNELS = 3
# 行数
IMG_ROWS = 50
# 列数
IMG_COLS = 50
# batch_size
BATCH_SIZE = 32
# checkpoint模型保存地址
CHECKPOINT_MODEL_SAVE_PATH = "/data/training/checkpoint/face/face-model-{epoch:04d}-{val_acc:.4f}.hdf5"
# 图片保存根目录
IMAGE_SAVE_ROOT_PATH = "/data/dataset/face/images/"

2、建立模型,下面会给出模型的一个结构过程

'''
建立模型
'''
def buildModel():
    model = Sequential()

    # filter: 卷积核数量
    # kernel_size: 卷积核空域或时域窗长度,整数或由整数构成的list/tuple;
    # kernel_size: 若长宽一致则可使用整数表示,如3表示(3,3)
    # strides: 卷积步长;整数或由单个整数构成的list/tuple;格式与kernel_size一致
    # 对于模型的第一层,必须输入input_shape,需要让模型知道输入数据的shape
    # 后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数
    model.add(Convolution2D(32, kernel_size=(3,3), padding='valid', input_shape=(IMG_ROWS,IMG_COLS,CHANNELS)))  # 卷积层
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))       # 池化层

    model.add(Convolution2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))       # 池化层
    model.add(Dropout(0.25))

    model.add(Convolution2D(64, (3,3), padding='valid'))
    model.add(Activation('relu'))

    model.add(Convolution2D(64, (3, 3)))
    model.add(Activation('relu'))

    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())                       # Flatten层    用于将数据转换为一维
    model.add(Dense(512))                      # Dense层,又被称作全连接层  当前输出维度为512
    model.add(Activation('relu'))              # 激活函数层   
    model.add(Dropout(0.5))                    # Dropout层
    model.add(Dense(NUM_CLASSES))              # Dense层
    model.add(Activation('softmax'))           # 分类层,输出最终结果

    #输出模型概况
    model.summary()
    return model

这里写图片描述

3、开始训练模型

# 获取model
model = buildModel()

# SGD优化器    使用随机梯度下降
# lr:大或等于0的浮点数,学习率
# momentum:大或等于0的浮点数,动量参数
# decay:大或等于0的浮点数,每次更新后的学习率衰减值
# nesterov:布尔值,确定是否使用Nesterov动量
sgd = SGD(lr=0.0001, decay=1e-6, momentum=0.9, nesterov=True)

# 编译模型完成配置,这步很重要
# 损失函数loss
# optimizer 优化器
# 指标列表metrics:对分类问题,我们一般将该列表设置为metrics=['accuracy']
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

# 训练集,通过generator动态读取图片数据并对图片进行的部分处理
trainImageGenerator = ImageDataGenerator(
    rescale=1./255, 
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True
).flow_from_directory(
    os.path.join(IMAGE_SAVE_ROOT_PATH, "train"),    # 图片保存位置
    target_size=(IMG_ROWS, IMG_COLS), 
    batch_size=BATCH_SIZE
)

# 训练验证集
validateImageGenerator = ImageDataGenerator(
    rescale=1./255, 
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True
).flow_from_directory(
    os.path.join(IMAGE_SAVE_ROOT_PATH, "validate"), 
    target_size=(IMG_ROWS, IMG_COLS), 
    batch_size=BATCH_SIZE
)

# 当监测值不再改善时,该回调函数将中止训练
earlyStopping = keras.callbacks.EarlyStopping(monitor='val_acc', patience=3, verbose=1, mode='auto')

# 该回调函数将在每个epoch后保存模型到filepath
checkpointer = keras.callbacks.ModelCheckpoint(CHECKPOINT_MODEL_SAVE_PATH, monitor='val_acc', verbose=0, save_best_only=False, mode='max', period=5)

# 预测
model.fit_generator(
    trainImageGenerator, 
    steps_per_epoch = 1000,        # 每轮训练次数
    epochs = 30,                   # 训练轮数
    callbacks=[checkpointer,earlyStopping],       # 添加回调函数
    validation_data = validateImageGenerator, 
    validation_steps = 50
)

print("训练完毕,model保存成功")

四、模型测试

# 获取模型
model = keras.models.load_model("/data/training/checkpoint/face/face-model-0024-0.9738.hdf5")

# 测试集数据
testImageGenerator = ImageDataGenerator(
    rescale=1./255,
    horizontal_flip=True
).flow_from_directory(
    os.path.join(IMAGE_SAVE_ROOT_PATH, "test"), 
    target_size=(IMG_ROWS, IMG_COLS), 
    batch_size=BATCH_SIZE
)

# 开始预测
# steps : 生成器返回数据的轮数
model.evaluate_generator(testImageGenerator, steps=50)

结果:[0.064206732757156715, 0.9794921875]

判断准度为97.949%,不是太好,模型需要再不断优化。。。。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值