[DAY 11]開発ログ:画像解析


1.学習内容

  • Image Analysis(Dog vs Cat)
  • 2.詳細


    Image Analysis(Dog vs Cat) !pip install tensorflow !pip install tensorflow-gpu import keras keras.__version__ import os, shutil import tensorflow as tf tf.test.is_gpu_available() #元のデータセットのディレクトリパスの解凍 original_dataset_dir = './datasets/cats_and_dogs/train' #スモールデータセットを格納するディレクトリ base_dir = './datasets/cats_and_dogs_small' if os.path.exists(base_dir): shutil.rmtree(base_dir) os.mkdir(base_dir) #分割のトレーニング、検証、テストに使用するディレクトリ train_dir = os.path.join(base_dir, 'train') os.mkdir(train_dir) validation_dir = os.path.join(base_dir, 'validation') os.mkdir(validation_dir) test_dir = os.path.join(base_dir, 'test') os.mkdir(test_dir) #訓練用猫の写真カタログ train_cats_dir = os.path.join(train_dir, 'cats') os.mkdir(train_cats_dir) #トレーニング用子犬の写真リスト train_dogs_dir = os.path.join(train_dir, 'dogs') os.mkdir(train_dogs_dir) #検証用猫の写真リスト validation_cats_dir = os.path.join(validation_dir, 'cats') os.mkdir(validation_cats_dir) #検証用の犬の写真リスト validation_dogs_dir = os.path.join(validation_dir, 'dogs') os.mkdir(validation_dogs_dir) #テスト用の猫の写真リスト test_cats_dir = os.path.join(test_dir, 'cats') os.mkdir(test_cats_dir) #テスト用犬写真カタログ test_dogs_dir = os.path.join(test_dir, 'dogs') os.mkdir(test_dogs_dir) #最初の1000個の猫の画像をtrain cats dirにコピーします。 print('Copy files.... ') print('---training file (cat)....') fnames = ['cat.{}.jpg'.format(i) for i in range(1000)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(train_cats_dir, fname) shutil.copyfile(src, dst) #次の500個の猫の画像validation cats dirをコピーします。 print('---validation file(s) (cat).... ') fnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(validation_cats_dir, fname) shutil.copyfile(src, dst) #次の500個の猫の画像test cats dirをコピーします。 print('---test file(s) (cat).... ') fnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(test_cats_dir, fname) shutil.copyfile(src, dst) #最初の1000個の犬の画像をtrain dogs dirにコピーします。 print('---traing file(s) (dog).... ') fnames = ['dog.{}.jpg'.format(i) for i in range(1000)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(train_dogs_dir, fname) shutil.copyfile(src, dst) #次の500個の犬の画像validation doges dirをコピーします。 print('---validation file(s) (dog).... ') fnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(validation_dogs_dir, fname) shutil.copyfile(src, dst) #次の500匹の犬の画像test dogs dirをコピーします。 print('---test file(s) (dog).... ') fnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(test_dogs_dir, fname) shutil.copyfile(src, dst) print(「訓練用猫イメージ総数:」,len(os.listdir(train cats dir)) print(「検証に使用される猫のイメージの総数:」,len(os.listdir(validation cats dir)) print(「テストに使用される猫のイメージの合計数:」,len(os.listdir(test cats dir)) print(「訓練用子犬イメージ総数:」,len(os.listdir(train doges dir)) print(「検証用子犬イメージ総数:」,len(os.listdir(validation doges dir)) print(「テストに使用される犬の画像の総数:」,len(os.listdir(test doges dir)) from keras import layers from keras import models model = models.Sequential() model.add(layers.Conv2D(32, (3,3), activation='relu')) model.add(layers.MaxPooling2D((2,2))) model.add(layers.Conv2D(64, (3,3), activation='relu')) model.add(layers.MaxPooling2D((2,2))) model.add(layers.Conv2D(128, (3,3), activation='relu')) model.add(layers.MaxPooling2D((2,2))) model.add(layers.Conv2D(128, (3,3), activation='relu')) model.add(layers.MaxPooling2D((2,2))) model.add(layers.Flatten()) model.add(layers.Dense(512, activation='relu')) model.add(layers.dense(1,activation="sigmoid")#末尾に出力が1つだけ from tensorflow.keras import optimizers model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=1e-4), metrics=['acc']) from keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale = 1.0 / 255) validation_datagen = ImageDataGenerator(rescale = 1.0 / 255) train_generator = train_datagen.flow_from_directory( train_dir, target_size=(150, 150), batch_size=20, class_mode='binary' ) validation_generator = validation_datagen.flow_from_directory( validation_dir, target_size=(150, 150), batch_size=20, class_mode='binary' ) model.fit_generator( train_generator, epochs = 30, steps_per_epoch = 100, validation_data = validation_generator, validation_steps = 50 ) model.save('cats_and_dogs_small_1.h5') history = model.history import matplotlib.pyplot as plt acc = history.history['acc'] val_acc = history.history['val_acc'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs = range(len(acc)) plt.plot(epochs, acc, 'bo', label='Training acc') plt.plot(epochs, val_acc, 'b', label='Validation acc') plt.title('Training and validation accuracy') plt.legend() plt.figure() plt.plot(epochs, loss, 'bo', label='Training loss') plt.plot(epochs, val_loss, 'b', label='Validation loss') plt.title('Training and validation loss') plt.legend() datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') #画像プリプロセッシングユーティリティモジュール from keras.preprocessing import image fnames = sorted([os.path.join(train_cats_dir, fname) for fname in os.listdir(train_cats_dir)]) #増殖する画像を選択 img_path = fnames[3] #画像を読み込み、サイズを変更 img = image.load_img(img_path, target_size=(150, 150)) #(150、150、3)サイズに変換されたオーバーフローアレイ x = image.img_to_array(img) #(1、150、150、3)サイズに変換 x = x.reshape((1,) + x.shape) #flow()メソッドは、ランダム変換画像の配置を作成します。 無限ループなので、あるポイントで停止しなければなりません! i = 0 for batch in datagen.flow(x, batch_size=1): plt.figure(i) imgplot = plt.imshow(image.array_to_img(batch[0])) i += 1 if i % 4 == 0: break model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(128, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(128, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Flatten()) model.add(layers.Dropout(0.5)) model.add(layers.Dense(512, activation='relu')) model.add(layers.Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=1e-4), metrics=['acc']) train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True,) #データを増加させるべきではありません。 test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( #ターゲットディレクトリ train_dir, #全画像150× 150に変更 target_size=(150, 150), batch_size=20, #binary crossentropyは損失するため、バイナリラベルを作成する必要があります class_mode='binary') validation_generator = validation_datagen.flow_from_directory( validation_dir, target_size=(150, 150), batch_size=20, class_mode='binary') history = model.fit_generator( train_generator, steps_per_epoch=100, epochs=100, validation_data=validation_generator, validation_steps=50) model.save('cats_and_dogs_small_2.h5') acc = history.history['acc'] val_acc = history.history['val_acc'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs = range(len(acc)) plt.plot(epochs, acc, 'bo', label='Training acc') plt.plot(epochs, val_acc, 'b', label='Validation acc') plt.title('Training and validation accuracy') plt.legend() plt.figure() plt.plot(epochs, loss, 'bo', label='Training loss') plt.plot(epochs, val_loss, 'b', label='Validation loss') plt.title('Training and validation loss') plt.legend() plt.show()

    3.今日の感想

    <ol>
    	<li>오늘은 굉장히 많은 에러로 인하여 수업진행이 어려웠다</li>
    	<li>그리고 굉장히 많은 메모리를 소모하여 커널이 죽는 현상도 생겼다.</li>
        <li>오늘 수업을 들으면서 한번씩 보면서 AI쪽 언어에 익숙해져야겠다는 생각을 했다.</li>
        <li>내일부터는 Microsoft Azure를 사용하는데 지금부터가 진짜라고 생각한다.</li>
        <li>개발자는 장비가 중요하다 ( 오늘의 핵심 교훈 )</li>
    </ol>