본문 바로가기
소프트웨어/파이썬

[파이썬] Opencv를 이용한 MNIST 숫자인식 확인하기#2

by 만들오 2021. 1. 23.

안녕하세요? 만들오 입니다.

 

이전글에 이어 opencv를 이용한 MNIST 숫자인식 확인하기를 시작합니다.

2021/01/23 - [파이썬] - Opencv를 이용한 MNIST 숫자인식 확인하기#1

 

1. 모듈 설치

pip install tensorflow
pip install keras

 

2. 전체 코드

#mnist_save.py
from keras.utils import np_utils
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
from numpy import argmax

# 1. 데이터셋 생성하기

# 훈련셋과 시험셋 불러오기
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 데이터셋 전처리
x_train = x_train.reshape(60000, 784).astype('float32') / 255.0
x_test = x_test.reshape(10000, 784).astype('float32') / 255.0

# 원핫인코딩 (one-hot encoding) 처리
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

# 훈련셋과 검증셋 분리
x_val = x_train[:42000] # 훈련셋의 30%를 검증셋으로 사용
x_train = x_train[42000:]
y_val = y_train[:42000] # 훈련셋의 30%를 검증셋으로 사용
y_train = y_train[42000:]

# 2. 모델 구성하기
model = Sequential()
model.add(Dense(units=64, input_dim=28*28, activation='relu'))
model.add(Dense(units=10, activation='softmax'))

# 3. 모델 학습과정 설정하기
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# 4. 모델 학습시키기
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_val, y_val))

# 5. 모델 평가하기
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=32)
print('')
print('loss_and_metrics : ' + str(loss_and_metrics))

# 6. 모델 저장하기
from keras.models import load_model
model.summary()
model.save("mnist_mlp_model.h5")

출처 : https://tykimos.github.io/2017/06/10/Model_Save_Load/

 

학습 모델 보기/저장하기/불러오기

몇시간 동안 (또는 며칠 동안) 딥러닝 모델을 학습 시킨 후 만족할만한 결과를 얻었다면, 실무에 바로 적용시키고 싶으실 겁니다. 이 때 떠오르는 의문 중 하나가 “딥러닝 모델을 사용하려면 매번 이렇게 몇시간 동안 학습시켜야 되는 거야?”입니다. 대답은 “아니오” 입니다. 딥러닝 모델을 학습시킨다는 의미는 딥러닝 모델이 가지고 있는 뉴런들의 가중치(weight)을 조정한다는 의미이고, 우리는 모델 구성과 가중치만 저장만 해놓으면, 필요할 때 저장한 모델 구

tykimos.github.io

#mnist_draw.py
import numpy as np
import cv2
from numpy import argmax
from keras.models import load_model

print("Loading model...")
model = load_model('mnist_mlp_model.h5')
print("Loading complete!")

onDown = False
xprev, yprev = None, None
def onmouse(event, x, y, flags, params):
    global onDown, img, xprev, yprev
    if event == cv2.EVENT_LBUTTONDOWN:
        #print("DOWN : {0}, {1}".format(x,y))
        onDown = True
    elif event == cv2.EVENT_MOUSEMOVE:
        if onDown == True:
            #print("MOVE : {0}, {1}".format(x,y))
            cv2.line(img, (xprev,yprev), (x,y), (255,255,255), 20)
    elif event == cv2.EVENT_LBUTTONUP:
        #print("UP : {0}, {1}".format(x,y))
        onDown = False
    xprev, yprev = x,y

cv2.namedWindow("image")
cv2.setMouseCallback("image", onmouse)
width, height = 280, 280
img = np.zeros((280,280,3), np.uint8)
while True:
    cv2.imshow("image", img)
    key = cv2.waitKey(1)
    if key == ord('r'):
        img = np.zeros((280,280,3), np.uint8)
        print("Clear.")
    if key == ord('s'):
        x_resize = cv2.resize(img, dsize=(28,28), interpolation=cv2.INTER_AREA)
        x_gray = cv2.cvtColor(x_resize, cv2.COLOR_BGR2GRAY)
        x = x_gray.reshape(1, 28*28)
        y = model.predict_classes(x)
        print(y)

    if key == ord('q'):
        print("Good bye")
        break

cv2.destroyAllWindows()

3. 코드 설명

mnist_save.py를 이용해 mnist_mlp_model.hp 파일을 생성합니다.

mnist_draw.py를 실행하면 조그만 창이 생기는데 그곳에 손글씨를 입력합니다.

손글씨 입력 후 키보드 "s"버튼을 누르면 예측한 결과를 출력합니다.

"r"을 누르면 그림을 모두 지웁니다.

"q"를 누르면 프로그램을 종료합니다.

 

4. 마무리

실행해보니 생각보다 잘 안맞는 경우도 있었습니다. 글씨의 굵기나 노이즈 등으로 인해 발생한 것으로 생각됩니다.

그래도 무언가 내손으로 결과물을 확인할 수 있다는 점에서 의미있는 프로젝트?였다고 생각합니다.

기타 문의사항은 댓글 바랍니다.

감사합니다.

 

* 이 글은 티스토리 카카오계정 연동정책으로 인해 이전 블로그(오코취) 글을 옮겨왔습니다.

[].

728x90

댓글