안녕하세요? 만들오 입니다.
이전글에 이어 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/
#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
'소프트웨어 > 파이썬' 카테고리의 다른 글
[파이썬] Jupyter notebook 쉽게 암호 설정하기 (1) | 2021.01.23 |
---|---|
[파이썬] 윈도우 화면 선택영역 모니터링 (0) | 2021.01.23 |
[파이썬] Opencv를 이용한 MNIST 숫자인식 확인하기#1 (0) | 2021.01.23 |
[파이썬] Websocket 으로 영상 송수신하기 (8) | 2021.01.23 |
[파이썬] Websocket 통신서버 만들기 (0) | 2021.01.23 |
댓글