본문 바로가기

Theory/DeepLearning

[Keras] 이미 학습된 모델을 읽어와서 나의 필기체 숫자 인식하기

최근... (음 제가 보통 예약글로 발행하니까.. 어쩌면 연달아서) 발행한 글에서 케라스를 이용해서 MNIST 필기 숫자를 익하는 CNN 알고리즘을 간단하게 테스트하는 투토리얼을 학습한 후 마치 지가 한듯이(^^) 글을 올린적이 있는데요.[바로가기] 이번에는 그 때의 학습된 모델을 저장하고, 다시 읽어 와서 적용만 하는 부분과 내가 쓴 글씨를 인식하는 부분을 보여드릴려고 합니다. 먼저 학습을 수행한 이전 글[바로가기]에서 

저 위치에 model.save 명령으로 학습이 완료된 모델을 저장해둡니다. 이 내용은 김태영님의 블록과 함께 하는 파이썬 딥러닝 케라스[바로가기]에 있는 내용입니다. 아무튼 저렇게 저장하고 나면.. 이제 다른 파일에서 저 모델을 읽어주면 됩니다.^^

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

import sys
import tensorflow as tf
import keras

print('Python version : ', sys.version)
print('TensorFlow version : ', tf.__version__)
print('Keras version : ', keras.__version__)

저걸 실행하면 텐서플로우는 1.5, 케라스는 2.1.5라고 뜹니다. 당연히 제 경우죠^^

from keras.models import load_model
model = load_model('MNIST_CNN_model.h5')

이제. 위 코드로 이미 저장된 학습 모델을 읽어옵니다. 와우~

model.summary()

model.summary를 확인해보면

그때 학습한 모델이 맞네요^^ 이제.. 중요합니다.ㅋㅋㅋㅋ. 

연습장에다가 제가 숫자를 적은거죠.. 흠. 멋지게 테스트하고 싶었지만.. 그냥 이렇게 하는 걸로...ㅠㅠ

그리고, 저는 맥이라서 PhotoScape X로 크기를 28*28 픽셀로 일일이 바꾸어 주었습니다. pil이나, opencv로 멋지게 하는 것은 다음에.ㅠㅠ.

이렇게 크기를 조절하고.

음영반전을 주고, 블랙앤화이트 효과도 주었습니다.~~ 이걸...

import matplotlib.pyplot as plt
%matplotlib inline

test1 = plt.imread('./my_num/re_1.jpg')
plt.imshow(test1);

로 읽어보면...

이렇게 됩니다. 흠...ㅠㅠ.

test_num = plt.imread('./my_num/re_1.jpg')
test_num = test_num[:,:,0]
test_num = (test_num > 125) * test_num
test_num = test_num.astype('float32') / 255.

plt.imshow(test_num, cmap='Greys', interpolation='nearest');

test_num = test_num.reshape((1, 28, 28, 1))

print('The Answer is ', model.predict_classes(test_num))

이렇게 하면... 내가 쓴 숫자가 뭔지 확인할 수 있습니다. 세 번째줄의 > 125는 그냥 귀찮아서 자세히 안 알아보고 threshold 개념으로 125라고 줘버렸습니다. 지금은 그걸 정하는게 중요한게 아니라서요~^^

아하~~ 제가 쓴 숫자 1을 1이라고 생각해주는군요^^

2도...

3도... ㅎㅎㅎ. 살짝 무리하게 쓴 0은 몰라봤지만... 그래도 괜찮은 결과입니다.^^ 오늘 중요한 것은 학습된 모델을 그냥 사용만 해서, 내가 쓴 숫자를 확인해 보았다는 거죠.. 킁~~~^^

반응형