実現したいこと
Colab上で精度よく(val_accuracyで0.9以上)分類されるのに、モデルをtensorFlowLiteに変換してスマホに組み込むと精度が大幅に低下した(ほとんど区別ができなくなった)。その理由や解決方法(あれば)を知りたい。また、もし簡単な解決方法がなければそのことを知りたい。
発生している問題・分からないこと
Colab上で精度よく(val_accuracyで0.9以上)分類されるのに、モデルをtensorFlowLiteに変換してスマホに組み込むと精度が大幅に低下する(ほとんど区別ができなくなる)。その理由や解決方法を知りたい。なお、ImageDataGeneratorを用いていたときはそういうことはなかったが、非推奨になったためimage_dataset_from_directory を用いたところ、この問題が発生した。
「車のドアミラーが開いているか閉じているかを判定する」という画像分類において、Colab上では下記のように非常によく分類できるモデルを作ることができた。ところがスマホに組み込んでdrawableに置いたdata_dirの画像(つまり、モデル作成時に用いた画像)を分類させると正答率が25%(2択の問題なのに不正解のほうが多い)となった。調べると、ドアミラーが閉じている写真は全て「open」、開いている写真の半分は「open」残りの半分は「closed」に分類される状況であった。
該当のソースコード
Python
1#モデル作成およびTFLiteモデルに変換するときのコード(Colab) 2import tensorflow as tf 3import keras 4from tensorflow.keras import layers 5from keras.models import Sequential 6from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization 7from keras.applications.vgg19 import VGG19 8from tensorflow.keras.preprocessing.image import ImageDataGenerator 9 10from google.colab import drive 11drive.mount('/content/drive') 12 13vgg19 = VGG19(include_top=False,weights='imagenet',input_shape=(224,224,3),pooling=None) 14for layer in vgg19.layers: 15 layer.trainable = False 16 17data_dir = '/content/drive/MyDrive/mirror1001/test' 18 19batch_size = 32 20img_height = 224 21img_width = 224 22 23train_ds = tf.keras.utils.image_dataset_from_directory( 24 data_dir, 25 validation_split=0.2, 26 subset="training", 27 seed=123, 28 image_size=(img_height, img_width), 29 batch_size=batch_size) 30 31val_ds = tf.keras.utils.image_dataset_from_directory( 32 data_dir, 33 validation_split=0.2, 34 subset="validation", 35 seed=123, 36 image_size=(img_height, img_width), 37 batch_size=batch_size) 38 39class_names = train_ds.class_names 40print(class_names) 41 42AUTOTUNE = tf.data.AUTOTUNE 43 44train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) 45val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE) 46 47data_augmentation = keras.Sequential( 48 [ 49 layers.RandomRotation(0.02), 50 layers.RandomZoom(0.02), 51 ] 52) 53 54model = Sequential() 55model.add(data_augmentation) 56 57# Instantiate the sequential model and add the VGG19 model: 58model.add(vgg19) 59 60model.add(Dense(128, activation='relu',input_shape=(224,224))) 61 62# Add the custom layers atop the VGG19 model: 63model.add(Flatten(name='flattened')) 64model.add(Dropout(0.5, name='dropout')) 65model.add(Dense(2, activation='softmax', name='predictions')) 66 67 68model.compile( 69 optimizer='adam', 70 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), 71 metrics=['accuracy']) 72 73model.fit( 74 train_ds, 75 validation_data=val_ds, 76 epochs=12 77) 78 79!mkdir -p /content/saved_model 80model.save('/content/saved_model/myModel.keras') 81 82 83converter = tf.lite.TFLiteConverter.from_keras_model(model) 84tflite_model = converter.convert() 85 86with open('Model1015b.tflite', 'wb') as f: 87 f.write(tflite_model) 88
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
ImageDataGeneratorを使わない場合に精度が低下することについての情報を見つけることができなかった。
データの入れ替え、データ拡張を追加するなど行ったが、精度が向上することはなかった。いくつか試した中では、2つのカテゴリーがほとんど区別できない場合や、上記で挙げたようにほとんど逆の判定をする場合などがあった。
補足
特になし
回答2件
あなたの回答
tips
プレビュー