TensorFlow 2を使用する.0統合keras CNN顔認識を実現

11981 ワード

ここではpython環境でTensorFlow 2を通過する.0統合kerasによる顔認識.以前はTensorFlow自身でcnnを実現していたのに比べてずっと便利です.

データの準備


フィルタデータsklearnのdatasetsからのfetch_olivetti_facesは、400枚しかなく、cnn訓練では、占有時間が少なく、テストが便利です.
from sklearn import datasets

faces = datasets.fetch_olivetti_faces()

facesを通るimagesは顔に対応する画像配列です.まずshapeを見てみましょう.
print(faces.images.shape)
(400, 64, 64)

全部で64 X 64の写真400枚です.これらの画像をmatplotlibで1枚の図に表示します.
from matplotlib import pyplot as plt

i = 0
plt.figure(figsize=(20, 20))
for img in faces.images:
    # 400 , 20X20
    plt.subplot(20, 20, i+1)
    plt.imshow(img, cmap="gray")
    # x,y 
    plt.xticks([])
    plt.yticks([])
    plt.xlabel(faces.target[i])
    i = i + 1

plt.show()

対応する画像を見る:図から見ると、一人当たり10個の顔があり、対応する顔のラベルは0-39で、全部で40種類の顔があります.
データを理解したら、フィーチャーデータと対応ラベルを用意します.
# 
X = faces.images
# 
y = faces.target
print(X[0])
print(y[0])
[[0.30991736 0.3677686  0.41735536 ... 0.37190083 0.3305785  0.30578512]
 [0.3429752  0.40495867 0.43801653 ... 0.37190083 0.338843   0.3140496 ]
 [0.3429752  0.41735536 0.45041323 ... 0.38016528 0.338843   0.29752067]
 ...
 [0.21487603 0.20661157 0.2231405  ... 0.15289256 0.16528925 0.17355372]
 [0.20247933 0.2107438  0.2107438  ... 0.14876033 0.16115703 0.16528925]
 [0.20247933 0.20661157 0.20247933 ... 0.15289256 0.16115703 0.1570248 ]]
0

各imagesは正規化された画素データ各targetが顔に対応するラベルに対応する

データプリプロセッシング


まずデータフォーマットをreshapeして、元の[1回のトレーニング数、長さ、幅]から、[1回のトレーニング数、長さ、幅、チャネル数]に変えて、チャネル数は実際に深さで、私たちの今回のサンプルは白黒図なので、深さは1だけで、RGBカラー写真であれば、チャネル数は3で、このチャネル数も自分で設計することができます.
X = X.reshape(400, 64, 64, 1)

ランダムに30%のデータを分割してテスト検証するデータ
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

モデルの構築

import  tensorflow.keras as keras

model = keras.Sequential()
#  , 128, 3x3, relu
model.add(keras.layers.Conv2D(128, kernel_size=3, activation='relu', input_shape=(64, 64, 1)))
#  
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu'))
# , reshape, Dense 
model.add(keras.layers.Flatten())
# cnn , , 
model.add(keras.layers.Dense(40, activation='softmax'))


model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
              

トレーニング


トレーニングは簡単でfitでトレーニングが始まりますが、私が定義したのは5回です.
model.fit(X_train, y_train, epochs=5)

トレーニングには1分ほどかかります.その間、トレーニング情報が自動的に印刷され、最後のラウンドで出力されたトレーニング結果が表示されます.
Epoch 5/5

 32/280 [==>...........................] - ETA: 2s - loss: 0.1754 - accuracy: 1.0000
 64/280 [=====>........................] - ETA: 2s - loss: 0.1746 - accuracy: 0.9844
 96/280 [=========>....................] - ETA: 2s - loss: 0.1948 - accuracy: 0.9688
128/280 [============>.................] - ETA: 1s - loss: 0.2082 - accuracy: 0.9609
160/280 [================>.............] - ETA: 1s - loss: 0.1858 - accuracy: 0.9625
192/280 [===================>..........] - ETA: 1s - loss: 0.1946 - accuracy: 0.9531
224/280 [=======================>......] - ETA: 0s - loss: 0.1739 - accuracy: 0.9598
256/280 [==========================>...] - ETA: 0s - loss: 0.1582 - accuracy: 0.9648
280/280 [==============================] - 3s 12ms/sample - loss: 0.1528 - accuracy: 0.9679

印刷の結果、accuracyのスコアは0.9679に達し、すでに比較的高いスコアであることがわかります.損失値も低い.もちろんここには最適化された空間があります.私たちは自分で試してみることができます.

検証#ケンショウ#


まず予測を行ったところ,ここの方法はsklearnとよく似ていることが分かった.
y_predict = model.predict(X_test)

予測後、テストラベルと比較します.
print(y_test[0], np.argmax(y_predict[0]))
18 18

予測が当たる~