前提
pythonを用いてイモリの胚を良好、不良に分ける二値分類を行っています。
良好胚の学習用データファイルには画像が166枚、不良胚の学習用のデータファイルには画像が123枚。
合計289枚あります。
ターミナルで実行すると、学習した枚数が125枚と表示される。(テスト用データを20枚枚に設定)
実現したいこと
289枚全て用いたい。
(素人質問で恐縮です。)
発生している問題・エラーメッセージ
Epoch 28/30 125/125 [==============================] - 5s 39ms/step - loss: 0.0474 - accuracy: 0.9882 Epoch 29/30 125/125 [==============================] - 5s 39ms/step - loss: 0.0319 - accuracy: 0.9915 Epoch 30/30 125/125 [==============================] - 5s 38ms/step - loss: 0.0612 - accuracy: 0.9834 1/1 [==============================] - 0s 80ms/step 判別した画像 >>> ./bad_judge/IMG_0813.jpeg 判別精度[[良好,不良]] >>> [[0.35066244 0.7052223 ]] 判別結果 >>> 不良胚
該当のソースコード
python
1import cv2 2import sys 3from PIL import Image 4import os 5import tensorflow as tf 6import datetime 7import random 8import glob 9import numpy as np 10import h5py 11from PIL import ImageFile 12import keras 13from keras.models import Sequential 14from keras.layers import Convolution2D, MaxPooling2D 15from keras.layers import Activation, Dropout, Flatten, Dense 16from keras.optimizers import RMSprop 17from keras.utils import np_utils 18from keras.models import load_model 19from keras.callbacks import EarlyStopping 20from tensorflow.keras.utils import plot_model, to_categorical 21from tensorflow.keras import datasets, layers, models 22 23#画像の読み込み 24 25datadir='./' 26 27# indexを教師ラベルとして割り当て(0にはgod、1にはbad) 28classes = ["god", "bad"] 29num_classes = len(classes) 30image_size = 64 31num_testdata = 20 32 33X_train = [] 34X_test = [] 35y_train = [] 36y_test = [] 37 38for index, classlabel in enumerate(classes): 39 40 #学習用ファイルのインポート 41 photos_dir = os.path.join(datadir, f"{classlabel}_learn") 42 files = glob.glob(os.path.join(photos_dir, "*.jpg")) 43 44 for i, file in enumerate(files): 45 image = Image.open(file) 46 image = image.convert("RGB") 47 image = image.resize((image_size, image_size)) 48 data = np.asarray(image) 49 50 if i < num_testdata: 51 X_test.append(data) 52 y_test.append(index) 53 else: 54 55 for angle in range(-20, 20, 5): 56 57 img_r = image.rotate(angle) 58 data = np.asarray(img_r) 59 X_train.append(data) 60 y_train.append(index) 61 # FLIP_LEFT_RIGHT は 左右反転 62 img_trains = img_r.transpose(Image.FLIP_LEFT_RIGHT) 63 data = np.asarray(img_trains) 64 X_train.append(data) 65 y_train.append(index) 66 67X_train = np.asanyarray(X_train) 68X_test = np.asanyarray(X_test) 69y_train = np.asanyarray(y_train) 70y_test = np.asanyarray(y_test) 71 72xy = (X_train, X_test, y_train, y_test) 73np.save('./imori.npy', xy) 74classes = ["god", "bad"] 75num_classes = len(classes) 76image_size = 64 77 78#データを読み込む 79def load_data(): 80 X_train, X_test, y_train, y_test = np.load('./imori.npy', allow_pickle=True) 81 X_train = X_train.astype("float") / 255 82 X_test = X_test.astype("float") / 255 83 y_train = np_utils.to_categorical(y_train, num_classes) 84 y_test = np_utils.to_categorical(y_test, num_classes) 85 86 return X_train, y_train, X_test, y_test 87 88#モデルの学習 89def train(X, y, X_test, y_test): 90 model = Sequential() 91 92 #conv2D(64,(3,3)) →3✖️3のフィルタを64枚使う 93 model.add(Convolution2D(64,3, 3, padding='same',input_shape=X.shape[1:])) 94 model.add(Activation('relu')) 95 model.add(Convolution2D(64,(3, 3))) 96 model.add(Activation('relu')) 97 model.add(MaxPooling2D(pool_size=(2,2))) 98 model.add(Dropout(0.1)) 99 100 model.add(Convolution2D(128,3, 3, padding='same')) 101 model.add(Activation('relu')) 102 model.add(Convolution2D(128,(3, 3))) 103 model.add(Activation('relu')) 104 model.add(MaxPooling2D(pool_size=(2,2))) 105 model.add(Dropout(0.1)) 106 107 model.add(Flatten()) 108 model.add(Dense(256)) 109 model.add(Activation('relu')) 110 model.add(Dropout(0.5)) 111 model.add(Dense(2)) # 識別のため、2クラス分類のため2を指定 112 model.add(Activation('sigmoid')) 113 114 115 # HDF5ファイルにKerasのモデルを保存 116 #ls:学習率(一度にどのくらいパラメータを変化させるか) decay:各更新の学習減衰率 117 adam = RMSprop(lr=0.001, decay=1e-6) 118 model.compile(loss='categorical_crossentropy',optimizer=adam,metrics=['accuracy']) 119 #学習回数を設定 120 model.fit(X, y, batch_size=32, epochs=30) 121 122 # HDF5ファイルにKerasのモデルを保存 123 model.save('./cnn.h5') 124 125 126 127 return model 128 129def main(): 130 131#読み込み 132 X_train, y_train, X_test, y_test = load_data() 133# モデルの学習 134 model = train(X_train, y_train, X_test, y_test) 135main() 136 137#推論 138cnn = "./cnn.h5" 139 140#判別したい画像のインポート 141#pic = "./god_judge/IMG_0810.jpeg" 142pic = "./bad_judge/IMG_0813.jpeg" 143 144imsize = (64, 64) 145 146def load_image(path): 147 img = Image.open(path) 148 img = img.convert('RGB') 149 img = img.resize(imsize) 150 img = np.asarray(img) 151 img = img / 255.0 152 return img 153 154model = load_model(cnn) 155img = load_image(pic) 156 157prd = model.predict(np.array([img])) 158prelabel = np.argmax(prd, axis=1) 159print("判別した画像 >>>", pic) 160print("判別精度[[良好,不良]] >>>", prd) 161 162if prelabel == 0: 163 print("判別結果 >>> 良好胚") 164elif prelabel == 1: 165 print("判別結果 >>> 不良胚") 166 167#学習率0.001,epoch30,laern125で3分15秒
補足情報(FW/ツールのバージョンなど)
Macを使用しターミナルで実行。vscでコードを記載
