Skip to content

Instantly share code, notes, and snippets.

@RyanKor
Created September 24, 2021 10:26
Show Gist options
  • Select an option

  • Save RyanKor/4c2b0719bc80606b208d46bb11e7b74f to your computer and use it in GitHub Desktop.

Select an option

Save RyanKor/4c2b0719bc80606b208d46bb11e7b74f to your computer and use it in GitHub Desktop.
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