관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

딥러닝 비전 8 - [비전 에이전트 5] 우편번호 인식기 v.1 본문

인공지능/컴퓨터 비전

딥러닝 비전 8 - [비전 에이전트 5] 우편번호 인식기 v.1

huenuri 2024. 11. 13. 07:48

벌써 7시가 훌쩍 넘었지만 이 단원까지만 공부하고 새벽 공부를 마치려고 한다. 오늘도 새벽 2시 반에 일어나서 5시간 가까이 공부를 진행 중이다. 이것까지 하면 5시간이 조금 넘을 것 같다.


 

 

 

우편번호 인식기 v1. 실습해보기

6장에서 재미있는 비전 에이전트 4개를 만들었다. 여기서는 사람이 필기한 우편번호를 인식하는 다섯 번째 비전 에이전트를 만든다. 필기한 우편번호를 인식하려면 필기 숫자 인식기가 필요한데, 이를 대비하여 프로그램 7-5의 42행에서 학습된 신경망을 dmlp_trained.h5 파일에 저장해두었다. 

 

먼저 프로그램 7-7의 실행 결과를 보고 사용자 인터페이스를 파악하자. 5개의 빨간색 박스는 마우스로 숫자를 써 넣는 곳이다. e는 박스를 지우고, s는 박스에 숫자를 떼내어 명암 영상으로 표시하고, r은 인식을 하고, q는 끝내는 명령어다. 

 

우편번호 인식기 v1.(DMLP 버전) 구현하기

이 코드는 사용자가 손으로 쓴 숫자 이미지를 인식하고 분류하는 GUI 애플리케이션이다. cv2를 사용해 윈도우 화면에서 숫자를 쓰고, tensorflow 모델로 숫자를 인식하는 프로그램으로, 숫자 이미지를 직접 그리고 인식 결과를 화면에 표시한다.

 

 

코드 요약

  1. 모델 로드: 학습된 신경망 모델을 불러온다.
  2. 초기화 및 그리기 설정: 초기 이미지를 설정하고, 숫자를 그릴 수 있는 영역을 만든다.
  3. 이미지 추출 및 인식: 숫자 이미지를 추출하고 모델을 통해 인식하며, 인식 결과를 화면에 표시한다.
  4. 이벤트 기반 작동: 키보드와 마우스를 이용해 그림을 그리고, 인식 결과를 시각화 및 확인할 수 있다.

 

 

 

코드 실행하기

 

하지만 실행해보니 글씨만 써지고 키보드가 하나도 동작하지 않았다. 이 부분은 어떻게 해결할 수 있을까?

 

 

 

코드를 수정하여 실행했지만 여전히 문제는 해결되지 않았다. 

 

주석 설명

  • try 블록: 프로그램의 주요 루프를 try 블록 안에 넣어서 예외 발생 시 프로그램이 안전하게 종료되도록 한다.
  • while True: 루프: 무한 루프를 통해 프로그램이 지속적으로 실행되도록 한다.
    • cv.imshow('Writing', img): "Writing" 창에 현재 그림 상태(img)를 표시한다.
    • key = cv.waitKey(1) & 0xFF: 1밀리초 동안 키 입력을 기다리고, 하위 8비트만 사용하여 정확하게 키를 감지한다.
  • 키 입력 처리:
    • if key == ord('e'): 'e' 키가 눌리면 reset() 함수를 호출해 화면을 초기화한다.
    • elif key == ord('s'): 's' 키가 눌리면 show() 함수를 호출해 현재 그려진 숫자 이미지를 시각화한다.
    • elif key == ord('r'): 'r' 키가 눌리면 recognition() 함수를 호출해 그려진 숫자를 인식하고 결과를 표시한다.
    • elif key == ord('q'): 'q' 키가 눌리면 break를 통해 무한 루프를 종료하고 프로그램을 종료한다.
  • except KeyboardInterrupt: 사용자가 Ctrl+C를 눌러 프로그램을 강제 종료할 경우 발생하는 KeyboardInterrupt 예외를 처리하여, 종료 메시지를 출력하고 안전하게 종료되도록 한다.
  • finally 블록: 프로그램이 종료될 때 항상 실행되는 코드로, 모든 창을 닫고 메모리를 해제하는 역할을 한다.
    • cv.destroyAllWindows(): OpenCV의 모든 창을 닫는다.
    • cv.waitKey(1): 창이 완전히 닫힐 수 있도록 대기 시간을 주어 안전하게 창을 닫는다.

이 코드 구조는 프로그램이 예기치 않게 종료되더라도 창을 안전하게 닫고, 메모리 누수를 방지해주는 역할을 한다.


 

 

 

학습을 마치고

도무지 해결이 되지 않아 이 프로그램은 다음에 다시 시도해보기로 했다. 오늘은 아침에 할일이 있어 여기에만 시간을 투자할 수가 없다. 오후에 다시 한번 이 코드를 실행하며 연구하다가 그래도 안 되면 다음으로 넘어갈 생각이다.

가끔씩 이런 상황이 발생한다. 분명 책과 같은 코드임에도 실행이 안 되고 내 컴퓨터 상황에는 맞지 않는 코드가 종종 있다.