티스토리 뷰

AI

[Tesseract] OCR 훈련

해구름 2025. 3. 17. 09:36
반응형

Tesseract는 오픈소스 OCR 엔진이며, Apach 2.0 라이선스 하에서 이용할 수 있습니다.

Tesseract는 1985년 HP에서 개발되었으며 2005년 오픈소스로 공개되었습니다. 2006년부터 2018년 11월까지는 구글에 의해 개발이 진행되었습니다. 현재는 오픈소스 커뮤니티와 구글에 의해 유지보수와 개선작업이 이어지고 있습니다.

지원하는 운영체제는 Windows, Linux, macOS, Android, iPhone 등이 있으며 여기에서 확인할 수 있습니다. 지원하는 언어로는 Python, Java, C# 등 다양한 언어를 지원합니다. 브라우저에서 Tesseract를 실행할 수 있는 tesseract.js 프로젝트도 존재합니다.

영어뿐만 아니라 한글을 포함한 다양한 언어를 지원합니다. tiff, png, jpg, bmp, webp 등 다양한 포멧의 이미지를 사용하여 훈련 할 수 있습니다. 기존 학습데이터를 미세조정(FineTue)하는 방법으로 학습할 수 있고, 처음부터 다시 학습하는 방법도 사용할 수 있습니다.

Tesseract 설치

여기에서는 Tesseract 5.5.0과 Windows 11 운영체제를 기준으로 설명합니다.

  1. https://github.com/UB-Mannheim/tesseract/wiki로 이동한 후 설치파일을 다운로드하세요.
  2. 설치파일을 통해 설치를 진행할 수 있는데, 기본적으로 영어만을 지원합니다. 추가적인 언어를 사용하려면 Additional script data, Additional language data에서 해당 언어를 선택하세요. 한글의 경우 Additional script data에서 Hangul 관련을 체크하고 Additional language data에서 Korean을 체크하세요. 모든 언어를 체크하면 설치시간이 상당히 오래걸리므로 필요한 것만 체크하세요. 추후 언제든지 설치파일을 통해 언어를 추가할 수 있습니다.
  3. Windows 운영체제 환경변수에 Tesseract 설치폴더 "C:\Program Files\Tesseract-OCR"를 추가합니다.

Tesseract 한글 훈련

Tesseract는 영문과 숫자에서는 매우 높은 정확도를 보이지만 한글에 대해서는 여전히 정확도가 떨어지는 모습을 보입니다. 한글 학습데이터를 생성하고 훈련하는 방법은 다음과 같습니다.

  1. 훈련 이미지 파일 생성
    훈련할 문자가 나열된 이미지 파일을 생성해야 합니다.
    [hangul.tif 파일 예시]
    가 나 다 라
    학습 이미지는 아래와 같은 형식으로 생성해주세요.
    • 파일포멧 : png나 tif를 많이 사용합니다. .png는 단순하고 이미지 파일 크기가 작다는 장점이 있고, .tif의 경우 레이어를 추가 할 수 있어 수 많은 이미지를 1개의 파일로 묶을 수 있다는 장점이있습니다.
    • 파일규격 : 다음과 같은 이미지가 높은 훈련 효율을 보여줍니다.
      • 최소 300DPI 이상
      • 글꼴 높이는 28~33픽셀
      • 문자열의 높이와 라인을 일정하게 배치
      • 1줄로 구성
      • 밝기나 색상이 균일한 이미지
      • 흐린 이미지 보다 선명한 이미지(Sharpened)
      • 컬러 이미지 보다 흑백 이미지
      • 노이즈를 줄이고 이진화(Binary)가 수행된 이미지(참고URL)
  2. Box파일 생성
    생성한 이미지 파일에 포함된 문자가 무엇인지 알려주는 학습데이터 입니다.
    [hangul.box 파일]
    1 0 15 17 0
    18 0 33 17 0
    36 0 51 17 0
    54 0 69 17 0
    Box파일의 각 라인은 아래와 같은 규칙을 따릅니다.
    {symbol} {left} {bottom} {right} {top} {page}
    • {symbol} : 대상 문자
    • {left} {bottom} {right} {top} : 대상 문자의 좌표 값. 좌표 값 0,0인 원점은 이미지의 좌측 하단
    • {page} : 기본 값 0. 이미지 파일이 multi-page TIFF인 경우에 각 페이지 번호를 입력
    Box파일의 개행문자는 "\r\n"이 아닌 "\n"을 사용하니 주의해주세요.
  3. 이미지와 Box파일명 수정
    위에서 생성한 이미지와 Box파일은 다음과 같은 규칙으로 변경해야 합니다.
    BOX, TIF 파일
    파일의 규칙은 아래와 같습니다.
    - TIF파일 : {language name}.{font name}.exp{number}.tif
    - BOX파일 : {language name}.{font name}.exp{number}.box
    • {language name} : 대상 언어 (예 : 영어는 eng, 한글은 kor, 명령 프롬프트에서 tesseract --list-langs로 내역을 확인가능)
    • {font name} : 폰트명
    • {number} : 구분번호. 0부터 시작. 동일한 {language name}, {font name}을 사용하는 파일이 여러 개인 경우 이 숫자로 구분
  4. LSTMF 파일 생성
    이제 이미지와 Box파일을 Tesseract 학습 데이터로 변환해야합니다. Tesseract 학습 데이터는 .lstmf 확장자를 가지는 파일입니다. tesseract 명령어를 사용하면 이미지, Box파일을 읽어 .lstmf파일을 생성할 수 있습니다.
    				#LSTMF 파일 생성
    				tesseract kor.malgungothic.exp0.tif kor.malgungothic -l kor --psm 6 lstm.train
    			
    • kor.malgungothic.exp0.tif : 학습할 이미지 파일명
    • kor.malgungothic : 생성할 lstmf 파일명
    • -l kor : 대상 언어 (예 : 영어는 eng, 한글은 kor, 명령 프롬프트에서 tesseract --list-langs로 내역을 확인가능)
    • --psm 6 : 사용할 페이지 분할 모드. Tesseract에게 이미지의 형태와 레이아웃을 알려주기 위해 사용. psm 6의 경우 균일한 텍스트 블록을 의미하며 한글 훈련에 적합함. 자세한 설명은 명령 프롬프트에서 tesseract --help-psm을 입력하면 모드를 확인가능
    • lstm.train : Long Short-Term Memory 훈련
    tesseract에 대한 설명은 https://github.com/tesseract-ocr/tesseract/blob/main/doc/tesseract.1.asc를 참고해주세요.
  5. LSTMF 내역 파일 생성
    LSTMF 파일들의 내역(minifest)을 텍스트파일로 작성해야합니다.
    1. "kor.malgungothic.exp0.list.txt" 텍스트 파일을 생성하세요.
    2. 파일 내용에는 LSTMF 파일 경로를 입력하세요. 절대경로, 상대경로 모두 사용 가능합니다. 인코딩은 UTF-8로 해야합니다. UTF-8 BOM, ASCII 등으로 작성 할 경우 오류가 발생할 수 있습니다.
      C:\tesstrain\kor.malgungothic.exp0.lstmf
    3. 만약 여러 LSTMF 파일을 학습하려면 아래와 같이 작성해도 됩니다. 개행문자는 \r\n이 아닌 \n를 사용해야합니다.
      C:\tesstrain\kor.malgungothic.exp0.lstmf
      C:\tesstrain\kor.malgungothic.exp1.lstmf
      C:\tesstrain\kor.malgungothic.exp2.lstmf
  6. lstm 파일 생성
    기존 학습파일로부터 .lstm파일을 생성해야합니다. 기존 학습파일은 https://github.com/tesseract-ocr/tessdata_best에서 다운로드하실 수 있습니다. 이제 명령 프롬프트에서 다음을 실행하세요.
    				#LSTM 파일 생성
    				combine_tessdata -e kor.traineddata kor.lstm
    			
    명령을 실행하면 기존 학습파일인 kor.traineddata를 읽어 kor.lstm 파일을 생성합니다. -e는 .traineddata 파일을 추출(extract)하라는 의미입니다. combine_tessdata에 대한 설명은 https://github.com/tesseract-ocr/tesseract/blob/main/doc/combine_tessdata.1.asc를 참고해주세요.
  7. 훈련 진행
    명령 프롬프트에서 아래 명령을 실행합니다.
    				#훈련 진행
    				lstmtraining
    					--continue_from kor.lstm
    					--traineddata kor.traineddata
    					--train_listfile kor.malgungothic.exp0.list.txt
    					--model_output newkor
    					--debug_interval -1
    					--max_iterations 300
    			
    위 명령의 각 옵션은 다음과 같은 의미를 가집니다.
    • --continue_from : 위에서 생성한 lstm 파일경로, 기존 학습데이터를 미세조정(fine tune하는 형태로 학습)
    • --traineddata : tesseract 학습데이터
    • --train_listfile : 위에서 생성한 lstmf 내역 파일
    • --model_output : 모델이 생성될 경로
    • --debug_interval : -1:디버깅정보 출력함, 0:출력안함
    • --max_iterations : 반복 횟수
    lstmtraining에 대한 자세한 설명은 https://github.com/tesseract-ocr/tesseract/blob/main/doc/lstmtraining.1.asc을 참고해주세요.
  8. 훈련중단 및 데이터파일 생성
    아래 명령을 통해 훈련을 종료하고 최종 kor.traineddata파일을 생성해야합니다.
    이전 단계에서 학습을 진행했으면 여러 .checkpoint 파일들이 생성될 것입니다.
    [훈련을 진행하면 생성되는 파일]
    kor_0.095_2_100.checkpoint
    kor_0.052_2_200.checkpoint
    kor_0.029_2_300.checkpoint
    위 파일명에서 파란색 부분은 Error Rate, 붉은색 부분은 반복 횟수를 의미합니다. 여러 체크포인트 파일 중에 가장 Error Rate가 작은 것을 하나 선택하세요. 여기서는 kor_0.029_2_300.checkpoint를 선택했습니다. 그리고 아래 명령을 실행합니다.
    				lstmtraining
    					--stop_training
    					--continue_from=kor_0.029_2_300.checkpoint
    					--traineddata=kor.traineddata
    					--model_output=newkor.traineddata
    			
    • --stop_training : 훈련 종료
    • --continue_from : 선택한 checkpoint 파일 지정
    • --traineddata : tesseract 학습데이터
    • --model_output : 새로운 학습데이터 파일명
    위 명령을 실행하면 newkor.traineddata가 생성될 것입니다. 이렇게 생성된 newkor.traineddata를 Tesseract OCR로 문자인식에 사용할 수 있습니다.

자동화 도구

  • text2image
    Tesseract OCR 폴더에 포함된 text2image.exe 프로그램은 Box, Image 파일 생성을 자동화해주는 도구입니다. 다음과 같이 실행하면 폰트로부터 이미지 파일과 Box 파일이 자동으로 생성됩니다.
    			#text2image 실행
    			text2image --text="{inputTextFilePath}" --outputbase="{outputFilePath}" --font="{fontName}" --fonts_dir="{fontFolderPath}" --fontconfig_tmpdir="{configFolderPath}"
    		
    위 명령어의 각 매개변수는 다음을 의미합니다.
    • --text : 이미지로 생성할 대상 문자들이 포함된 파일경로 (예: "c:\text2img\input.txt", 이 파일에 문자를 입력하면 해당 문자들의 이미지들이 생성됨)
    • --outputbase : 결과 이미지 파일경로 (예: "c:\text2img\output"로 입력하면 "c:\text2img\output.tif", "c:\text2img\output.box"가 생성됨)
    • --font : 폰트파일이름 (예: dotum, malgun gothic 등의 해당 폰트파일명)
    • --fonts_dir : 폰트파일이 존재하는 폴더 (예: Windows OS의 경우 "C:\WINDOWS\Fonts")
    • --fontconfig_tmpdir : text2imgage의 confing파일이 위치할 경로 (예: "c:\text2img\config")
  • jTessBoxEditor
    Box파일 생성, Image파일 생성, 학습에 이르기까지 Tesseract 트레이닝에 관한 다양한 도구들이 존재합니다. 여기서는 가장 많이 사용되는 jTessBoxEditor 프로그램을 소개합니다. (Github)
    1. https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/에서 프로그램을 다운로드해주세요.
    2. jTessBoxEditor를 실행하려면 Java 설치가 필요합니다.
    3. jTessBoxEditor 폴더를 열어 train.bat 파일을 실행하면 프로그램이 실행됩니다.
      jTessBoxEditor
    4. jTessBoxEditor는 크게 3가지 기능을 제공합니다.
      • Trainer : Tesseract 학습과 관련된 도구를 제공
      • Box Editor : Box 파일을 편집할 수 있는 GUI를 제공
      • TIFF/Box Generator: 폰트로부터 이미지와 Box파일을 생성하는 도구

효율적인 학습을 위한 팁

  • 고품질 훈련이미지 대량확보
    훈련에 사용되는 이미지 파일이 방대하게 제공될 수록 정확도가 향상됩니다. 물론 훈련 이미지에는 오류가 없어야 하며 불필요한 중복이 없어야 합니다. 숫자를 훈련하기 위해서 사용되는 이미지만 해도 기본 수만장 가량 됩니다. 조합이 다양한 한글의 경우에는 훈련에 더 많은 이미지가 필요합니다. 인터넷에는 이미 만들어 놓은 다양한 훈련용 이미지가 존재하니 기본적으로 이러한 데이터를 찾아 활용해보세요. 그 외에도 폰트 파일로부터 이미지를 자동생성하거나, Graphic API를 통해 이미지 추출을 자동화하거나, CAPCHA를 사용하여 사용자에게 훈련용 이미지를 가공하도록 하는 등 다양한 방법이 활용되고 있습니다.
  • 시간이 소요되는 부분을 측정하고 효율화
    수만장의 이미지를 사용하여 훈련을 진행하면 길게는 10시간 가까이 걸리기도 합니다. 숫자나 알파벳과 달리 한글 유니코드의 경우 11,172자나 되므로 훈련에 더 오랜 시간이 소요될 것입니다. 따라서 각 훈련단계에서 소요되는 시간을 측정하고, 시간이 많이 소요되는 작업의 시간을 효율화하세요. 훈련하는 방법, 훈련에 사용되는 이미지의 크기나 이미지의 품질에 따라 시간이 달라집니다. 더 높은 정확도와 더 나은 방법을 찾으세요. 불필요한 훈련을 줄이기 위해 신중하게 작업을 계획하고 진행하세요.
  • 고성능의 하드웨어 사용
    Tesseract OCR은 그래픽카드를 사용하지 않습니다. 따라서 고성능의 CPU를 사용할 수록 훈련 속도가 빨라집니다. 그래픽카드를 훈련에 활용하려면 Tesseract OCR 대신 Easy OCR, TensorFlow 등의 다른 OCR 모델 사용을 검토해보세요.

References

댓글