본문 바로가기

Development/OCR

Tesseract OCR 4.x 모델 학습하기 (2)

728x90
반응형

이전 포스트에 이어서 학습데이터를 준비하고 실제 학습하는 과정을 진행해 보겠다.

참고로, 아래 이전 포스트는 Tesseract OCR 엔진의 신경망 학습을 위한 준비 과정을 서술한 것이다.

 

2021.05.04 - [Development/OCR] - Tesseract OCR 4.x 학습하기 (1)

 

Tesseract OCR 4.x 학습하기 (1)

Tesseract에서 제공하는 API를 통해 OCR 기능을 이용할 때 사용되는 기본 학습모델이 아닌 사용자가 직접 학습 시키고자 하는 데이터를 준비해 학습하고 원하는 성능의 모델을 만들어 사용할 수 있

davelogs.tistory.com

 


2. 학습데이터 준비

학습에 필요한 데이터를 다음과 같은 구조로 변경한다.

 

- ~ (root)

  - tesseract (tesseract 4.1.1)

      - tessdata # 학습파일(.traineddata) // 다운로드한 tessdata_best 프로젝트를 복사해서 이름을 변경

      - langdata # 학습단어(.txt) // 다운로드한 langdata 프로젝트를 복사

      - fonts # 학습대상 폰트(. ttf)

  - tessdata_best

  - langdata

 

2.1 학습 파일(traindata) 준비

앞에서 언급한 것처럼, 처음부터 다시 학습(Retrain from scratch)이 아닌 미세조정(Fine tune) 방법으로 진행할 예정이기 때문에 기존의 학습된 파일을 준비한다.

 

학습파일은 GitHub에서 다운로드 받았던 'tessdata_best' 프로젝트에 존재한다. (학습된 전체 학습파일을 제공하는 'tessdata' 프로젝트 데이터 중 최고 성능을 보여준 것들을 'tessdata_best' 프로젝트에 모아둔 것으로 생각하면 될 것이다. 따라서 우리는 'tessdata_best' 프로젝트에 있는 학습파일을 이용한다)

 

# 기 학습된 학습파일 복사 (root 기준)
$ cp ./tessdata_best/kor.traineddata ./tesseract/tessdata/

 

2.2 학습 대상 폰트 파일 준비

여기에서는 Windows에서 사용하는 '맑은고딕(regular)'를 이용할 것이다. 다운로드 받은 파일을 './tesseract/fonts/' 경로에 저장한다.

(학습하고자 하는 폰트는 인터넷에서 다양하게 구할 수 있으니 따로 설명하진 않는다.)

 

# 학습시킬 폰트 파일 복사 (다운로드 받은 경로에서 실행)
$ cp malgun.ttf ~/tesseract/fonts/

 

2.3 학습 단어(문자열) 준비 (선택사항)

학습에 추가하고 싶은 문자열이 있다면 학습하고자 하는 언어 데이터를 수정하면 된다.

예를 들어, 이 포스트에서처럼 kor 언어를 학습하고자 한다면, langdata 프로젝트의 관련 언어 파일에 원하는 학습 단어를 추가하면 된다.

 

# 학습에 추가할 단어를 관련 파일에 삽입하기
$ cp -r ./langdata/kor ./tesseract/langdata/kor
$ gedit ./tesseract/langdata/kor/kor.training_text

 

2.4 작업폴더 생성

다음 단계인 학습데이터를 생성하기에 앞서 작업이 진행될 경로를 생성해 준다.

 

# 작업폴더 생성 (root 기준)
$ mkdir -p workspace/train      # 학습데이터
$ mkdir -p workspace/base_lstm  # 기존 학습모델
$ mkdir -p workspace/output     # 최종 학습모델

 

2.5 학습데이터 생성

마지막으로, 다음 코드를 이용해 선택한 폰트 '맑은고딕(regular)' 데이터를 생성한다.

(폰트이름은 파일명이 아니라, 등록된 폰트명이다)

 

# 맑은고딕 학습데이터 생성
$ src/training/tesstrain.sh \
	--fonts_dir ./fonts \
	--lang kor \
	--linedata_only \
	--noextract_font_properties \
	--langdata_dir ./langdata \
	--tessdata_dir ./tessdata \
	--exposures "0" \
	--fontlist "Malgun Gothic" \
	--output_dir ./workspace/train 

 

폰트 데이터 생성 확인

 

 

3. 학습하기

이제 학습데이터 생성까지 마쳤으니 기존의 모델을 기반으로 학습(Fine tune)을 진행한다.

 

3.1 기존 학습데이터 변환

 

# 기존 학습데이터 변환
$ combine_tessdata -e ./tessdata/kor.traineddata ./workspace/base_lstm/kor.lstm

 

기존 학습데이터 변환

 

3.2 '맑은고딕' 폰트 학습

 

# 기존 모델에 전이 학습하기
$ lstmtraining \
    --continue_from ./workspace/base_lstm/kor.lstm \
    --old_traineddata ./tessdata/kor.traineddata \
    --traineddata ./workspace/train/kor/kor.traineddata \
    --model_output ./workspace/output/base \
    --train_listfile ./workspace/train/kor.training_files.txt \
    --max_iterations 3600

 

학습 로그 및 결과

 

결과가 생각보다 너무 안 좋게 나왔다. (여기서부터는 끝없이 이어지는 튜닝의 시간이다)

 

 

4. 모델 배포

어쨌든 학습을 했으니, 다음의 코드로 학습의 결과인 모델을 배포한다.

 

# 학습 모델 생성 및 배포
$ lstmtraining \
    --stop_training \
    --continue_from ./workspace/output/base_checkpoint \
    --old_traineddata ./tessdata/kor.traineddata \
    --traineddata ./workspace/train/kor/kor.traineddata \
    --model_output ./workspace/output/kor.traineddata 

 

학습 모델 생성 및 배포

 

5. 모델 테스트

다음 구문으로 새로 학습한 모델을 이용해 테스트를 진행했다.

# 학습 모델 테스트
$ tesseract ./workspace/images/test01.png stdout \
    -l kor --oem 1 --psm 3 \
    --tessdata-dir ./workspace/output

 

입력이미지: test01.png

 

인식 테스트 결과

 

좋지 않았던 학습 로그에 비하면 테스트 결과는 그럭저럭 괜찮은 것 같아 보인다.

 

여기까지 Tesseract OCR에서 사용하는 모델을 기반으로 학습하는 과정을 진행해 보았다. 

(Tesseract OCR의 '처음부터 다시 학습'하는 방법이나 또는 '네트워크 최상위만 재 학습'하는 방법은 따로 정리하지 않을 예정이다)


이어서, EasyOCR의 사용자 모델 학습 및 사용 방법에 대한 내용을 정리했다. 자세한 내용은 아래 링크를 참고하기 바란다.

 

[Development/OCR] - EasyOCR 사용자 모델 학습하기 (1) - 시작하기 전에

 

EasyOCR 사용자 모델 학습하기 (1) - 시작하기 전에

이번에는 EasyOCR에서 제공하는 API를 통해 OCR 기능을 이용할 때 사용되는 기본 신경망 모델이 아닌, 사용자가 직접 학습시키고자 하는 데이터를 준비해 학습하고, 원하는 성능의 모델을 만들어 사

davelogs.tistory.com

 

 

728x90
반응형