이 포스팅은 딥러닝을 공부한 후 실전에 적용해 보기 위해 kaggle 사이트에 있는 datasets중 notMNIST 데이터셋을 가지고 실습해본 것입니다.
datasets 출처 : https://www.kaggle.com/sanikamal/notmnist
코드 전체 내용은 아래 링크에서 확인할 수 있습니다.
https://colab.research.google.com/drive/1l-s7sF1cN9MjO1RFhYh_7uJSkdkPgTii#scrollTo=KLeg3Nl_TKLM
먼저 필요한 것들을 import 한다
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.layers import Reshape,Flatten
import random
import os
print(os.listdir('../content/notmnist'))
os.listdir('../content/notmnist/notMNIST/notMNIST_small')
image 정보를 분석하기위해 정확한 경로를 설정한뒤 image를 읽는다
from PIL import Image
im=Image.open('/content/notmnist/notMNIST/notMNIST_small/A/MDEtMDEtMDAudHRm.png')
print(im.format, im.size,im.mode)
각각 알파벳의 (A~J) 폴더 경로를 저장하고 몇장의 사진이 있는지 알아본다. 그리고 각각의 폴더에 있는 사진들을 ~_files 변수에 저장한다.
a_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/A')
b_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/B')
c_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/C')
d_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/D')
e_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/E')
f_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/F')
g_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/G')
h_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/H')
i_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/I')
j_dir=os.path.join('/content/notmnist/notMNIST/notMNIST_small/J')
print('Total training A images:',len(os.listdir(a_dir)))
print('Total training B images:',len(os.listdir(b_dir)))
print('Total training C images:',len(os.listdir(c_dir)))
print('Total training D images:',len(os.listdir(d_dir)))
print('Total training E images:',len(os.listdir(e_dir)))
print('Total training F images:',len(os.listdir(f_dir)))
print('Total training G images:',len(os.listdir(g_dir)))
print('Total training H images:',len(os.listdir(h_dir)))
print('Total training I images:',len(os.listdir(i_dir)))
print('Total training J images:',len(os.listdir(j_dir)))
a_files=os.listdir(a_dir)
b_files=os.listdir(b_dir)
c_files=os.listdir(c_dir)
d_files=os.listdir(d_dir)
e_files=os.listdir(e_dir)
f_files=os.listdir(f_dir)
g_files=os.listdir(g_dir)
h_files=os.listdir(h_dir)
i_files=os.listdir(i_dir)
j_files=os.listdir(j_dir)
한 폴더당 두장의 image를 확인해보기 위해서 다음과 같은 코드를 작성한다.
pic_index=2
next_a=[os.path.join(a_dir,fname) for fname in a_files[pic_index -2 : pic_index]]
next_b=[os.path.join(b_dir,fname) for fname in b_files[pic_index -2 : pic_index]]
next_c=[os.path.join(c_dir,fname) for fname in c_files[pic_index -2 : pic_index]]
next_d=[os.path.join(d_dir,fname) for fname in d_files[pic_index -2 : pic_index]]
next_e=[os.path.join(e_dir,fname) for fname in e_files[pic_index -2 : pic_index]]
next_f=[os.path.join(f_dir,fname) for fname in f_files[pic_index -2 : pic_index]]
next_g=[os.path.join(g_dir,fname) for fname in g_files[pic_index -2 : pic_index]]
next_h=[os.path.join(h_dir,fname) for fname in h_files[pic_index -2 : pic_index]]
next_i=[os.path.join(i_dir,fname) for fname in i_files[pic_index -2 : pic_index]]
next_j=[os.path.join(j_dir,fname) for fname in j_files[pic_index -2 : pic_index]]
for i,img_path in enumerate(next_a + next_b + next_c + next_d + next_e + next_f + next_g
+ next_h + next_i + next_j):
img=mpimg.imread(img_path)
plt.imshow(img)
plt.axis=('off')
plt.show()
이제 데이터를 확인했으니 이미지 리스트와 label 리스트를 만들어야 한다.
X=[] #이미지 리스트
labels=[] #라벨 리스트
DATA_PATH='../content/notmnist/notMNIST/notMNIST_small'
for directory in os.listdir(DATA_PATH):
for image in os.listdir(DATA_PATH + '/' + directory):
try:
file_path=DATA_PATH + '/' + directory + '/' + image
img=Image.open(file_path)
img.load()
img_data=np.asarray(img,dtype=np.int16) #이미지를 정수형 데이터로 처리함
X.append(img_data)
labels.append(directory)
except:
None
N=len(X)
img_size=len(X[0]) #28
X=np.asarray(X).reshape(N,img_size,img_size,1)
labels=to_categorical(list(map(lambda x: ord(x) - ord('A'),labels)),10)
이미지(target) 과 label 쌍을 섞어야 하는데 이대로 섞으면 target 과 label 쌍이 맞지 않게 된다. 그러므로 다음과 같은 방법을 사용해 shuffle한다.
temp=list(zip(X,labels))
np.random.shuffle(temp)
X , labels=zip(*temp) #zip 해제
X, labels= np.asarray(X), np.asarray(labels)
PROP_TRAIN=0.7 # proportion to use for training
NUM_TRAIN=int(N*PROP_TRAIN) #number to use for training
X_train,X_test=X[:NUM_TRAIN], X[NUM_TRAIN:]
labels_train,labels_test=labels[:NUM_TRAIN],labels[NUM_TRAIN:]
마지막으로 model을 쌓고 훈련한다.
model=tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128,(3,3),activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(512,activation='relu'),
tf.keras.layers.Dense(10,activation='softmax')
])
model.summary()
텐서보드를 사용하기 위해 다음 코드를 사용해준다.
root_logdir=os.path.join(os.curdir,'my_logs')
def get_run_logdir():
import time
run_id=time.strftime('run_%Y_%m_%d_%H_%M_%S')
return os.path.join(root_logdir,run_id)
run_logdir=get_run_logdir()
model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
tensorboard_cb=keras.callbacks.TensorBoard(run_logdir)
model.fit(X_train,labels_train,
epochs=40,batch_size=64,
validation_data=(X_test,labels_test),
callbacks=[tensorboard_cb])
model.save('font_basic.h5')
%load_ext tensorboard
%tensorboard --logdir=./my_logs --port=6006
모델을 평가해보면 92.36%의 정확도가 나온다.
score=model.evaluate(X_test,labels_test,verbose=False)
print('Loss:{}'.format(score[0]))
print('Accuracy:{}'.format(np.round(10000*score[1])/100))
코드 출처: https://www.kaggle.com/sanikamal/font-classification-using-cnn
'Kaggle' 카테고리의 다른 글
Animal - 10 분류 - pytorch (0) | 2021.11.27 |
---|---|
Digit-recognizer (0) | 2021.07.11 |
이미지 분류(이진 분류) (0) | 2021.07.06 |