정보공간_1

[6기 강남 김현호] Tesseract-OCR을 통한 오프라인 문자 인식과 문자 학습 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강남 김현호] Tesseract-OCR을 통한 오프라인 문자 인식과 문자 학습

알 수 없는 사용자 2014. 8. 9. 02:03

#1 문자 인식


문자 인식은 1928년 G. Tauschek가 세계 최초로 인쇄체 숫자를 판독하는 문자 인식 방법에 특허 출원을 하며 시작되었습니다. 1950년대에 들어서야 비로소 디지털 컴퓨터가 출연하여, 여러 다양한 기관들이 다양한 문자 인식 방법들을 발표하며, 오늘날에는 다양한 자동화 작업을 위해 사용되고 있습니다.


문자 인식 기술은 크게 2가지로 나눌 수 있습니다. 


온라인 문자 인식

온라인 문자 인식이란 사용자가 필기하는 동안에 인식기가 문자를 인식하는것을 의미하는데, "실시간" 또는 "동적" 이라는 용어를 대신 사용하기도 합니다.


오프라인 문자 인식

오프라인 문자 인식은 이미 작성된 인쇄체 혹은 필기체 문자를 인식하는 기술이다. 일반적으로 광학 문자 인식 OCR(Optical Character Recognition)으로 표현됩니다.


두 기술의 근본적인 차이는 필기 데이터를 획득하는 방법에 있습니다.


온라인 방식에서는 필기의 시간적, 공간적인 동적 정보를 얻을 수 있으며 획수, 획순, 필기 방향등의 정보를 알 수 있습니다.


오프라인 방식으로는 이러한 정보를 거의 얻을 수 없고, 이진화, 윤곽선 추출후 형태 분석이나 템플릿 매칭등의 과정을 통해 글자를 판단하게 됩니다.


이번 포스팅에서는 오프라인 방식의 대표 오픈소스인 Tesseract-OCR을 알아보겠습니다.



#2 Tesseract-OCR


출처 - 네이버 영어 사전





Tesseract-OCR은 스스로 아마 가장 정밀한 퍼포먼스를 자부하는 오픈 소스 OCR엔진입니다.


홈페이지 - https://code.google.com/p/tesseract-ocr/



2006년부터 구글의 지원을 받아 더욱 발전해 왔고, Leptonica 영상처리 라이브러리와 결합하여 다양한 포멧의 이미지를 처리 할 수 있습니다. 아파치 라이센스 2.0으로 배포되고 있으며 현재 60개 이상의 언어를 지원하고 있습니다.



기본적으로 VC++ 라이브러리를 제공하나, 자바는 Tess4J, 안드로이드는 tesseract-android-tools를 통해 포팅된 오픈소스를 제공하므로 다른 환경에서도 쉽게 사용 가능합니다.


Tess4J - http://tess4j.sourceforge.net/

tesseract-android-tools - https://code.google.com/p/tesseract-android-tools/



실제 라이브러리를 다운받아서 예제코드를 약간 변경하여 실행해 보았습니다.



메모장 돋움 보통 폰트로 적은 글자를 캡쳐해 테스트 한 결과 입니다.




결과는 상당히 잘 나오는 편입니다.





한글 또한 상당히 잘 나옵니다.





하지만...


위의 그림들과 같이 밝기, 명암, 기울기 등에 따라 인식률이 크게 영향을 받습니다.


그러므로 추가적인 보정 작업들을 통해 인식률을 향상 시킬 수 있습니다.






일반적인 폰트에 대해서는 높은 인식률을 보여주지만 이상하고 희한한 폰트는 어떨까요?

(참고로 Tesseract OCR API Test, Hello World, Samsung Software Membership라고 적혀있습니다.)


솔직히 직접 봐도 무슨 글자인지 잘 모르겠지만, 역시나 인식률은 형편 없습니다.



이를 해결하기 위해 Tesseract-OCR에서 데이터 학습 기능을 제공합니다.


다양한 폰트들이나 필기체 같이 일정하지 않는 글씨들을 학습시켜 인식률을 높일 수 있습니다.






#3 Tesseract OCR 문자 학습


Tesseract OCR의 데이터 학습법은 https://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3에 나와 있습니다만 다소 복잡한 관계로 간단하게 설명드리겠습니다.


1. 먼저 다음과 같이 해당 문자들에 대한 이미지 파일을 구성해야 합니다.



이미지는 tif 파일을 사용하며, 특이한 파일 이름 규칙을 지켜야 합니다.

[lang].[fontname].exp[num].tif


[lang]은 OCR 사용시 불러올 문자열 입니다.

다음 예제들에서 빨간 부분에 쓰일 문자열 입니다.


[fontname]은 사용자가 만들 폰트의 이름이고

[num]은 여러 이미지로 학습 데이터를 구성할때 쓰일 파일의 인덱스를 나타냅니다.



Ex) myeng.myfont.exp0.tif

위와 같이 파일이름을 바꾸어주고 다음 단계로 넘어 갑니다.



2. 학습을 하기 위해 구성한 이미지로부터 box 파일을 생성해야 합니다.

> tesseract.exe myeng.myfont.exp0.tif myeng.myfont.exp0 batch.nochop makebox

(tesseract.exe [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox)

(학습에 사용되는 모든 실행 파일은 tesseract-ocr를 설치하거나, 직접 빌드해서 얻으실 수 있습니다.)


위 명령을 통해, myeng.myfont.exp0.box 파일을 생성 합니다.


box파일은 글자 마다의 인식 단위를 지정하기위해 인식 단위 문자들의 바운딩 박스 정보를 가지고 있는 파일입니다.



이 바운딩 처리를 GUI로 편하게 처리할 수 있는 오픈소스가 있습니다.

바로 jTessBoxEditorcowboxer 입니다.

jTessBoxEditor가 더 많은 기능을 제공하지만 편의상 cowboxer를 사용하여 진행하겠습니다.

(한글의 경우에는 jTessBoxEditor를 사용하시는게 좋습니다.)




cowboxer로 box파일을 열어보면 위와 같이 나타나는데 box 하나하나가 글자를 나타냅니다.

박스의 이미지를 글자 크기에 알맞게 적용시켜주고 각 박스에 글자들을 매칭시켜 줍니다.

cowboxer의 Help 탭에 단축키 사용법이 나와 있으니 참고하시면 됩니다.



3. 모든 글자들을 수정후 BOX파일을 저장하고 다음 명령을 통해 학습을 진행 합니다.

> tesseract.exe myeng.myfont.exp0.tif myeng.myfont.exp0 nobatch box.train

(tesseract.exe [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] nobatch box.train)


명령을 입력하면 myeng.myfont.exp0.tr 파일과 myeng.myfont.exp0.txt 파일이 생성 됩니다.



4. 다음 명령으로 unicharset 파일을 생성 합니다.

> unicharset_extractor.exe myeng.myfont.exp0.box

(unicharset_extractor.exe [lang].[fontname].exp[num].box)


unicharset 파일은 Tesseract가 출력 가능한 모든 문자들의 집합을 모아놓은 파일입니다.



5. 다음 명령에 앞서 font_properties라는 파일을 만들어야 합니다. 이 파일은 해당 폰트 스타일 정보를 포함하는 파일입니다. 이 파일은 다음과 같은 정보를 가지게 됩니다.

<fontname> <italic> <bold> <fixed> <serif> <fraktur>

ex)     timesitalic 1 0 0 1 0

myfont 0 0 0 0 0



6. 다음 명령으로 클러스터링을 수행합니다. 

mftraining.exe -F font_properties -U unicharset myeng.unicharset myeng.myfont.exp0.tr

(mftraining.exe -F font_properties -U unicharset [lang].unicharset [lang].[fontname].exp[num].tr)

문자의 모양 특징을 추출 한 후 프로토타입을 만들기 위해 클러스터링을 하게 됩니다.

결과로 inttemp(모양 프로토 타입), pffmtable(각 문자의 기대 특징 개수) 파일이 생성됩니다.



7. 다음 명령으로 normproto파일을 생성합니다

> cntraining.exe myend.myfont.exp0.tr

(cntraining.exe [lang].[fontname].exp[num].tr)


normproto파일은 character normalization sensitivity prototypes 정보를 가지고 있습니다.(뭐라고 변역해야할지 모르겟네요...)



8. 생성된 파일들(unicharset, inttemp, pffmtable, normproto)의 이름을 다음과 같이 변경합니다.

[lang].[filename]

ex) myeng.unicharset, myeng.inttemp, myeng.pffmtable, myeng.normproto



9. 마지막으로 다음 명령을 통해 traineddata(학습 데이터)파일을 생성합니다.

> combine_tessdata.exe myeng.    (마지막에 꼭 '.'을 붙여 주셔야 합니다.)

(combine_tessdata.exe [lang].)


위 명령을 수행하시면 myeng.traineddata파일이 생성됩니다.( [lang].traineddata )



이렇게 새로운 학습 데이터 파일이 생성되었습니다.


이를 가지고 다시 OCR을 시도 해보겠습니다.



완벽하지는 않지만 처음보다 인식률이 엄청나게 향상된것을 보실 수 있습니다.


이렇게 Tesseract-OCR을 통해 오프라인 문자 인식과 문자 학습에 대해 알아보았습니다. 


다음 포스팅에서는 기계학습을 통한 온라인 문자인식에 대해 소개해 드리도록 하겠습니다.



Reference

- '문자인식 이론과 실제' - 이성환 저

- 'AI Study' - www.aistudy.com