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

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

by 만들오 2021. 1. 23.

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

 

오늘은 opencv를 이용해 숫자를 그리면 어떤 숫자인지 맞춰보는 프로젝트를 구현하려고 합니다.

 

모델을 만들고 평가하는 예제는 정말 잘 구현되어있습니다.

 

저는 김태영님의 블로그를 참고하고 있습니다. https://tykimos.github.io/lecture/

 

케라스 강좌 내용

케라스로 배워보는 딥러닝 강좌를 아래 내용를 아래 순서대로 진행하고자 합니다. 1권 (블록과 함께하는) 파이썬 딥러닝 “케라스” 기초 케라스 시작하기 딥러닝 개념잡기 레이어 개념잡기 레시피 따라해보기 부록 2권 (블록과 함께하는) 파이션 딥러닝 “케라스” 활용 [시계열영상입력 이진분류 모델 레시피] [시계열영상입력 다중클래스분류 모델 레시피] [특징맵 살펴보기] [시퀀스 출력을 가지는 모델 구성] 객체 검출(object detection) 해보기 영상 분

tykimos.github.io

정말 알기쉽게 정리해주셨으니 머신러닝/Tensorflow/Keras에 관심있으신 분은 꼭 방문해보시기 바랍니다.

 

위 블로그에서 학습 모델 보기/저장하기/불러오기를 해보신 이후 기준으로 글을 작성하겠습니다.

 

총 2편으로 구성할 예정이며, 오늘은 opencv를 이용해 손글씨를 쓰고 저장하는 코드를 소개하겠습니다.

 

1. 모듈 설치

pip install opencv-python

위 모듈을 설치하면 opencv와 numpy가 설치됩니다.

 

2. 전체 코드

import cv2, os
import numpy as np

img_save_path = "./img/"
if not os.path.exists(img_save_path):
  os.mkdir(img_save_path)

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)
figNum = 1
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'):
        img_save = cv2.resize(img_gray, dsize=(28,28), interpolation=cv2.INTER_AREA)
        cv2.imwrite("{0}image{1}.jpg".format(img_save_path, str(figNum).zfill(2)), img_save)
        figNum = figNum + 1
        print("Image saved")
    if key == ord('q'):
        print("Good bye")
        break

cv2.destroyAllWindows()

3. 코드 설명

Opencv로 창을 만들고, 마우스 이벤트를 받아 선을 그리게 됩니다.

키보드 버튼 "r"을 누르면 그림을 전부 지우고

"s"를 누르면 크기를 28x28 사이즈로 조절하고 ./img 폴더 안에 image01.jpg 이름으로 저장합니다.

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

 

4. 마무리

Tensorflow로 교육을 시키기 위해선 데이터셋이 필요합니다. 위 코드를 이용해 데이터셋을 만들 수 있고,

일단은 숫자를 그려서 기본 예제인 MNIST의 결과를 확인하는 것을 다음글로 마무리 하겠습니다.

감사합니다.

 

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

[].

728x90

댓글