마이크로컨트롤러에서 OCR을 구현해봅시다 - slog

아두이노 정도의 CPU 파워로 딥러닝을 이용해 OCR을 구현할 수 있을까요? 한번 도전해봅시다.

※ 실제 MCU를 사용하지는 않고 특정 메모리량을 가정하고 부동소숫점을 지원하지않는다는 전제로 PC에서 C#으로 인공신경망을 디자인합니다

몇십 KB 메모리를 가진 MCU에서는 임베디드 바이너리 신경망을 사용할 수 있습니다.

Binary neural network - Simple English Wikipedia, the free encyclopedia

[1709.02260] Embedded Binarized Neural Networks (arxiv.org)

GitHub - kunglab/ebnn: Header-only C library for Binary Neural Network Feedforward Inference (targeting small devices)

인공지능, 머신러닝, 딥러닝 그리고 뉴럴네트워크 이런 이야기를 들었을 때 평소에 관심있게 관련내용을 보시지 않았다면 마냥 어렵게 느껴질 수도 있습니다. 저도 깊게 들어가면 눈앞이 노랗게 됩니다 ;;
아래의 그림을 보시면 입력층(Input Layer), 은닉층(Hidden Layer), 출력층 (Output Layer)으로 구성되어 있는것을 알 수 있습니다. 여기서 Hidden Layer가 인공신경망이 됩니다. Hidden Layer의 노드에 가중치를 결정하는 행휘가 바로 학습이 됩니다. 학습으로 결정된 가중치를 이용해 OCR 등을 할 수 있게 됩니다.

image

마이크로컨트롤러에서 입력으로 받는 카메라 이미지는 숫자(중간의 소수점 포함)로 한정합니다.

[0 ~ 9]+([.][0 ~ 9]+)*

MCU 처럼 제한된 환경에서 OCR를 구현하려면 입력 정보를 가공하여 최소화 해야 합니다.

  • 입력
  1. 이미지를 흑백으로 전환합니다.
  2. 한 글자를 인식합니다. 인식하는 방법은 인터넷에 공개된 여러 방법들이 있어서 구현에서는 단순히 스캔해서 구분하도록 합니다. (숫자의 경우 점들이 모두 인접하므로 가능합니다)
  3. 한 글자를 16x16으로 스케일링 합니다.
  4. 흑(1), 백(0)으로 바이너리화 하여 입력을 압축합니다. => 한글자 당 2bytes * 16 = 32 bytes (Input Layer)
  • 출력
  1. 총 4개의 노드가 있는 Layer로 구성합니다. 표현할 수 있는 종류는 총 0 ~ 15 개가 됩니다.