CNN顔認識のモデル作成

1.モデルを作成します

  • パッケージのインポート
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は、堅牢性を高めるために全員が顔500を持っていることです。次に、osを導入することにより、実装ファイルが読み取られ、画像がラベルと画像に追加され、ラベルが付けられますが、これは1対1の関係です。正規化してから順番をシャッフルしますが、シャッフルすると1対1で対応します。エラーがあるとすべてエラーになります。機能をテストするために、テストデータとトレーニングに分けることができます。データ。
# 读取训练数据到内存,这里数据结构是列表

# 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、モデルを作成する

これは、使用されている最も古典的な5層モデルであり、そのパラメーターは以下に掲載されています。

# 构建一个空的网络模型,它是一个线性堆叠模型,各神经网络层会被顺序添加,专业名称为序贯模型或线性堆叠模型
# 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()

ここに写真の説明を挿入

2.4、構成モデル

モデルではクロスエントロピー損失関数が使用され、前の完全に接続されたレイヤーのアクティブ化関数は「reul」関数を使用し、最後のレイヤーは「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、トレーニングモデル

次に、モデルは「my_model.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')

ただし、モデル自体で顔認識を実現する方法はまだあります。自分で画像を認識して区別するための何かを書く必要があります。そうすれば、顔認識機能を実際に実現できます。モデル作成を一時的に記述してから、モデルを更新して使用します。顔認識。

おすすめ

転載: blog.csdn.net/qq_45125250/article/details/107035013