Created
September 24, 2021 10:26
-
-
Save RyanKor/4c2b0719bc80606b208d46bb11e7b74f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import tensorflow as tf | |
| from tensorflow import keras | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| import os | |
| import zipfile | |
| import random | |
| import shutil | |
| # 다운로드 받은 이미지 압축 파일 해제 | |
| # print(os.listdir("./drive/MyDrive")) | |
| local_zip = './train.zip' | |
| zip_ref = zipfile.ZipFile(local_zip, 'r') | |
| zip_ref.extractall('./dev/train') | |
| zip_ref.close() | |
| local_zip = './test.zip' | |
| zip_ref = zipfile.ZipFile(local_zip, 'r') | |
| zip_ref.extractall('./dev/test') | |
| zip_ref.close() | |
| # 훈련 이미지 디렉토리 설정 | |
| base_dir = './dev' | |
| train_dir = os.path.join(base_dir, 'train/train/') | |
| test_dir = os.path.join(base_dir, 'test/test/0/') | |
| train_val = {} | |
| try: | |
| if not os.path.exists(base_dir + "/" + "val"): | |
| os.makedirs(base_dir + "/" + "val") | |
| except OSError: | |
| print ('Error: Creating directory. ' + base_dir + "/" + "val") | |
| for folder in os.listdir(train_dir): | |
| try: | |
| if not os.path.exists(base_dir + "/" + "val/" + folder): | |
| os.makedirs(base_dir + "/" + "val/" + folder) | |
| except OSError: | |
| print ('Error: Creating directory. ' + base_dir + "/" + "val/" + folder) | |
| for f_name in os.listdir(train_dir + folder)[int(len(os.listdir(train_dir + folder)) * 0.8):]: | |
| new_path = shutil.move(train_dir + folder + "/" + f_name, "./dev/val/" + folder) | |
| # train / val 분리 확인 | |
| for folder in os.listdir(train_dir): | |
| print(len(os.listdir(base_dir + "/" + "val/" + folder))) | |
| print(len(os.listdir(base_dir + "/" + "train/train/" + folder))) | |
| print("-----") | |
| print(os.listdir(base_dir + "/" + "val")) | |
| # os.rmdir(base_dir + "/" + "val/" + '.ipynb_checkpoints') | |
| # train/test 경로에 따른 이미지 파일 확인 | |
| # training image 폴더명 : 파일명 형태로 정리 | |
| train_file = {} | |
| test_file = os.listdir(test_dir) | |
| for folder in os.listdir(train_dir): | |
| train_file[folder] = os.listdir(train_dir + folder) | |
| print(len(os.listdir(test_dir))) | |
| print(os.listdir(train_dir)) | |
| def to_one_hot(labels, dimension=7): | |
| result = np.zeros((len(labels), dimension)) | |
| for i, label in enumerate(labels): | |
| result[i, label] = 1. | |
| return result | |
| get_ipython().run_line_magic('matplotlib', 'inline') | |
| import matplotlib.image as mpimg | |
| # 이미지를 matplotlib를 사용해서 4 * 4 형태의 격자로 출력 예정 | |
| nrows = 4 | |
| ncols = 4 | |
| fig = plt.gcf() | |
| fig.set_size_inches(ncols * 4, nrows * 4) | |
| for folder_name in os.listdir(train_dir): | |
| for i, img_path in enumerate(train_file[folder_name][:16]): | |
| sp = plt.subplot(nrows, ncols, i + 1) | |
| sp.axis('Off') | |
| img = mpimg.imread(train_dir + folder_name + "/" + img_path) | |
| plt.imshow(img) | |
| plt.show() | |
| # validation image show | |
| for i, img_path in enumerate(test_file[:16]): | |
| sp = plt.subplot(nrows, ncols, i + 1) | |
| sp.axis('Off') | |
| img = mpimg.imread(test_dir + img_path) | |
| plt.imshow(img) | |
| plt.show() | |
| ## CNN 다중 분류 이미지 sample test | |
| import keras_preprocessing | |
| from keras_preprocessing import image | |
| from keras_preprocessing.image import ImageDataGenerator | |
| training_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, | |
| fill_mode='nearest') | |
| validation_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, | |
| fill_mode='nearest') | |
| test_datagen = ImageDataGenerator(rescale = 1./255) | |
| train_generator = training_datagen.flow_from_directory( | |
| train_dir, | |
| target_size=(227,227), | |
| class_mode='categorical', | |
| batch_size=48 | |
| ) | |
| val_generator = validation_datagen.flow_from_directory( | |
| base_dir + "/" + "val/", | |
| target_size=(227,227), | |
| class_mode='categorical', | |
| batch_size=48 | |
| ) | |
| test_generator = test_datagen.flow_from_directory( | |
| './dev/test/test', | |
| target_size=(227,227), | |
| class_mode='categorical', | |
| batch_size=48 | |
| ) | |
| model = tf.keras.models.Sequential([ | |
| tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(227, 227, 3)), | |
| tf.keras.layers.MaxPooling2D(2, 2), | |
| tf.keras.layers.Conv2D(64, (3,3), activation='relu'), | |
| tf.keras.layers.MaxPooling2D(2,2), | |
| tf.keras.layers.Flatten(), | |
| tf.keras.layers.Dropout(0.2), | |
| tf.keras.layers.Dense(512, activation='relu'), | |
| tf.keras.layers.BatchNormalization(), | |
| tf.keras.layers.Dropout(0.2), | |
| tf.keras.layers.Dense(256, activation='relu'), | |
| tf.keras.layers.BatchNormalization(), | |
| tf.keras.layers.Dropout(0.2), | |
| tf.keras.layers.Dense(128, activation='relu'), | |
| tf.keras.layers.Dense(7, activation='softmax') | |
| ]) | |
| model.summary() | |
| model.compile(loss = 'categorical_crossentropy', | |
| optimizer=keras.optimizers.Adam(learning_rate=1e-4), | |
| metrics=['accuracy']) | |
| # optimizer changed => rmsprop into adam | |
| # adam을 사용했을 때 훈련 정확도가 더 높아졌다. | |
| # 이유가 뭘까? | |
| history = model.fit(train_generator, epochs=20, validation_data = val_generator) | |
| prediction = model.predict(test_generator) | |
| prediction | |
| evaluate = model.evaluate(test_generator) | |
| evaluate |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment