Kaggle

notMNIST

jwjwvison 2021. 6. 13. 21:51

 이 포스팅은 딥러닝을 공부한 후 실전에 적용해 보기 위해 kaggle 사이트에 있는 datasets중 notMNIST 데이터셋을 가지고 실습해본 것입니다. 

 

datasets 출처 : https://www.kaggle.com/sanikamal/notmnist

 

notMNIST

notMNIST – A multi class dataset for learning computer vision

www.kaggle.com

 

 코드 전체 내용은 아래 링크에서 확인할 수 있습니다.

https://colab.research.google.com/drive/1l-s7sF1cN9MjO1RFhYh_7uJSkdkPgTii#scrollTo=KLeg3Nl_TKLM

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 먼저 필요한 것들을 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