Criação de modelo de reconhecimento facial CNN

1. Crie um modelo

  • Pacote de importação
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Conv2D,MaxPooling2D,Flatten
from keras.optimizers import SGD,Adam
from keras.regularizers import l2
import _pickle as p
from keras import optimizers
import itertools
import cv2
import os
import random
from keras.regularizers import l2
print(1)
from sklearn.model_selection import train_test_split
  • Get Picture
    picture é que todo mundo tem um rosto 500, a fim de aumentar a robustez, e então ao introduzir o sistema operacional, o arquivo de implementação é lido, as imagens foram adicionadas ao rótulo e imagem, rótulo em, mas é uma relação um a um, Ele é normalizado e, em seguida, a ordem é embaralhada, mas quando é embaralhada, há uma correspondência um a um. Se houver um erro, todos os erros serão cometidos. Então, para testar sua função, ele pode ser dividido em dados de teste e treinamento dados.
# 读取训练数据到内存,这里数据结构是列表

# path_name是当前工作目录,后面会由os.getcwd()获得
def read_path(path_name):
    images = []
    labels = []

    for dir_item in os.listdir(path_name): # os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表
        # 从当前工作目录寻找训练集图片的文件夹
        full_path = os.listdir(path_name+dir_item)
        print(dir_item)
        for file in full_path:
            path = path_name+dir_item+'/'+file
            img = cv2.imread(path)
            images.append(img)
            labels.append(path_name+dir_item)

    return images,labels

images,labels = read_path('./pic/')
# 将lsit转换为numpy array
images = np.asarray(images, dtype='float64')/256 
labels = np.asarray([0 if label.endswith('1') else 1 if label.endswith('2') else 2 for label in labels])
print(labels)
index = [i for i in range(len(images))] 
random.shuffle(index)
data = images[index]
label = labels[index]
label= np_utils.to_categorical(label, num_classes=3)
#标签打乱

X_train, X_test, Y_train, Y_test = train_test_split(data, label, test_size=0.30, random_state=42)
2.3, crie um modelo

Este é o modelo de cinco camadas mais clássico usado, cujos parâmetros são postados abaixo

# 构建一个空的网络模型,它是一个线性堆叠模型,各神经网络层会被顺序添加,专业名称为序贯模型或线性堆叠模型
# model = Sequential()
# # 以下代码将顺序添加CNN网络需要的各层,一个add就是一个网络层
# model.add(Conv2D(
#     input_shape= (47,57,3),
#     filters = 32,
#     kernel_size = 5,
#     strides = 1,
#     padding = 'same',
#     activation = 'relu'
# ))
model=Sequential()
model.add(Conv2D(filters=36, kernel_size=5, padding='valid',kernel_regularizer=l2(0.003), input_shape=(100,100,3), activation='relu'))
model.add(Dropout(0.2))
model.add(MaxPooling2D(pool_size=(2,2)))
 
model.add(Conv2D(filters=16, kernel_size=(5,5), padding='valid', activation='relu'))
 
model.add(MaxPooling2D(pool_size=(2,2)))
 

model.add(Flatten())
 
#下面就是全连接层了
model.add(Dense(520, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(128, activation='relu'))
 
model.add(Dense(3, activation='softmax'))
#compile model
 
#事实证明,对于分类问题,使用交叉熵(cross entropy)作为损失函数更好些
model.compile(
    loss='categorical_crossentropy',
    optimizer=optimizers.Adadelta(lr=0.01, rho=0.95, epsilon=1e-06),
    metrics=['accuracy']
)
# 输出模型概况
model.summary()

Insira a descrição da imagem aqui

2.4, modelo de configuração

A função de perda de entropia cruzada é usada no modelo. A função de ativação da camada anterior totalmente conectada usa a função the'reul ', e a última camada usa a função'softmax'.

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)  # 采用SGD+momentum的优化器进行训练,首先生成一个优化器对象
model.compile(loss='categorical_crossentropy',
                    optimizer=optimizers.Adadelta(lr=0.01, rho=0.95, epsilon=1e-06),
                    metrics=['accuracy'])  # 完成实际的模型配置工作
2.5, modelo de treinamento

Então o modelo gerou 'meu_modelo.h5'

model.fit(X_train, Y_train, epochs = 10,batch_size=128)
loss_, accuracy_ = model.evaluate(X_test,Y_test)
loss, accuracy = model.evaluate(X_train,Y_train)
result = model.predict(X_test)
print(loss_)
print(accuracy_)
print(loss)
print(accuracy)
model.save('my_model.h5')
#model.load_weights('my_model.h5')

No entanto, ainda há uma maneira de o modelo realizar o reconhecimento de rosto por si só. Você precisa escrever algo para reconhecer e distinguir a imagem por si mesmo, e então você pode realmente realizar a função de reconhecimento de rosto. Escreva a criação do modelo temporariamente e, em seguida, atualize o modelo para usá-lo. Reconhecimento de rosto.

Acho que você gosta

Origin blog.csdn.net/qq_45125250/article/details/107035013
Recomendado
Clasificación