前提・実現したいこと
KerasのCNNで、顔認識AIを作って見た〜スクレイピングからモデルまで〜を参考にして顔認識のシステムを作成しようとしています。
参考サイトをもとにコードを書き、実行したらエラーは出ずに画像の収集、顔の切り出し、画像の水増し、学習が開始しました。
しかし、いざ学習の結果を見るとどのエポックでも「loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000」となってしましまいます。
精度が100%になるのはおかしいと思いますし、画像の枚数が違うとはいえ参考サイトの精度は最大81%だったことを考えるとやはり何かがおかしいと感じました。
ただ、何がおかしいのかが機械学習初心者なため分かりませんでした。
バッチサイズが画像の枚数に比べて大きすぎるのかと思い変更しましたが上手く行きませんでした。
水増し画像などを見てもおかしいと思うことはなかったので、学習モデルに原因があると考えていますが、実際何が問題かは分かりません。
原因をご教授いただけると幸いです。
よろしくお願いいたします。
発生している問題
#どのエポックでも結果がこのままになってしまう loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000
該当のソースコード
python
1#参考にしたサイトとほぼコードは同じです。 2#データのラベル付け、モデルの構築・学習・評価のコードはバッチサイズ以外変更しておりません 3 4from keras.utils.np_utils import to_categorical 5from keras.layers import Activation, Conv2D, Dense, Flatten, MaxPooling2D 6from keras.models import Sequential,Model 7import matplotlib.pyplot as plt 8import os 9import shutil 10import random 11import glob 12from scipy import ndimage 13import cv2 14import numpy as np 15from pykakasi import kakasi 16 17kakasi = kakasi() # Generate kakasi instance 18# 日本語をローマ字にする処理 19def exchange_word(text): 20 kakasi.setMode("H", "a") # Hiragana to ascii 21 kakasi.setMode("K", "a") # Katakana to ascii 22 kakasi.setMode("J", "a") # Japanese(kanji) to ascii 23 conv = kakasi.getConverter() 24 result = conv.do(text) 25 return result 26 27 28# 顔認識する対象を決定(検索ワードを入力) 29SearchName = ["石原さとみ"] 30# 画像の取得枚数の上限 31ImgNumber =600 32# CNNで学習するときの画像のサイズを設定(サイズが大きいと学習に時間がかかる) 33ImgSize=(250,250) 34input_shape=(250,250,3) 35 36for j in range(len(SearchName)): 37 SearchName[j] = exchange_word(SearchName[j]) 38 39# 教師データのラベル付け 40X_train = [] 41Y_train = [] 42for i in range(len(SearchName)): 43 img_file_name_list=os.listdir("./FaceEdited/"+SearchName[i]) 44 print("{}:トレーニング用の写真の数は{}枚です。".format(SearchName[i],len(img_file_name_list))) 45 46 for j in range(0,len(img_file_name_list)-1): 47 n=os.path.join("./FaceEdited/"+SearchName[i]+"/",img_file_name_list[j]) 48 img = cv2.imread(n) 49 if img is None: 50 print('image' + str(j) + ':NoImage') 51 continue 52 else: 53 r,g,b = cv2.split(img) 54 img = cv2.merge([r,g,b]) 55 X_train.append(img) 56 Y_train.append(i) 57 58print("") 59 60# テストデータのラベル付け 61X_test = [] # 画像データ読み込み 62Y_test = [] # ラベル(名前) 63for i in range(len(SearchName)): 64 img_file_name_list=os.listdir("./test/"+SearchName[i]) 65 print("{}:テスト用の写真の数は{}枚です。".format(SearchName[i],len(img_file_name_list))) 66 for j in range(0,len(img_file_name_list)-1): 67 n=os.path.join("./test/"+SearchName[i]+"/",img_file_name_list[j]) 68 img = cv2.imread(n) 69 if img is None: 70 print('image' + str(j) + ':NoImage') 71 continue 72 else: 73 r,g,b = cv2.split(img) 74 img = cv2.merge([r,g,b]) 75 X_test.append(img) 76 Y_test.append(i) 77 78X_train=np.array(X_train) 79X_test=np.array(X_test) 80y_train = to_categorical(Y_train) 81y_test = to_categorical(Y_test) 82 83 84 85 86 87# モデルの定義 88model = Sequential() 89model.add(Conv2D(input_shape=input_shape, filters=32,kernel_size=(3, 3), 90 strides=(1, 1), padding="same")) 91model.add(MaxPooling2D(pool_size=(2, 2))) 92model.add(Conv2D(filters=32, kernel_size=(3, 3), 93 strides=(1, 1), padding="same")) 94model.add(MaxPooling2D(pool_size=(2, 2))) 95model.add(Conv2D(filters=32, kernel_size=(3, 3), 96 strides=(1, 1), padding="same")) 97model.add(MaxPooling2D(pool_size=(2, 2))) 98model.add(Flatten()) 99model.add(Dense(256)) 100model.add(Activation("sigmoid")) 101model.add(Dense(128)) 102model.add(Activation('sigmoid')) 103# 分類したい人数を入れる 104model.add(Dense(len(SearchName))) 105model.add(Activation('softmax')) 106 107# コンパイル 108model.compile(optimizer='sgd', 109 loss='categorical_crossentropy', 110 metrics=['accuracy']) 111 112 113# 学習 114history = model.fit(X_train, y_train, batch_size=12, 115 epochs=25, verbose=1, validation_data=(X_test, y_test)) 116 117 118 119 120# 汎化制度の評価・表示 121score = model.evaluate(X_test, y_test, batch_size=6, verbose=0) 122print('validation loss:{0[0]}\nvalidation accuracy:{0[1]}'.format(score)) 123 124print(history.history["accuracy"]) 125#acc, val_accのプロット 126plt.plot(history.history["accuracy"], label="acc", ls="-", marker="o") 127plt.plot(history.history["val_accuracy"], label="val_acc", ls="-", marker="x") 128plt.ylabel("accuracy") 129plt.xlabel("epoch") 130plt.legend(loc="best") 131plt.show() 132 133#モデルを保存 134model.save("MyModel.h5")
試したこと
バッチサイズの変更。
学習させる画像がちゃんと人の顔を示しているかのチェック
補足情報(FW/ツールのバージョンなど)
トレーニング用画像の枚数:598枚
テスト用画像の枚数:149枚
windows10 home(64bit)
python 3.7.3
Keras 2.4.3
Keras-Preprocessing 1.1.2
Visual Studio Code内のターミナルで実行
回答1件
あなたの回答
tips
プレビュー