본문 바로가기

Back/Deep Learning

[OCR]TESSERACT OCR 4.0 LSTM 학습.

 

0. 시작하기전..

OCR은 광학문자인식 기술로 역사가 상당히 오래된 기술입니다.

최근(?) 들어 딥러닝이 떠오르며 lstm 모델을 통한 OCR엔진이 나오게 되었고 이를 학습/ 준비하는 과정을 정리 했습니다.

 

1. 개발환경

  • WSL2 - UBUNTU18.04
  • tesseract4.1.1
  • GPU 없음

WSL 설치에 대해선 

2021/01/25 - [분류 전체보기] - [Linux] 윈도우 에서 리눅스 사용하기 WSL

 

[Linux] 윈도우 에서 리눅스 사용하기 WSL

docs.microsoft.com/ko-kr/windows/wsl/install-win10 Windows 10에 WSL(Linux용 Windows 하위 시스템) 설치 Bash 터미널을 사용하여 Linux 배포(Ubuntu, Debian, SUSE, Kali, Fedora, Pengwin 및 Alpine 포함)를..

hidden-loca.tistory.com

 

2. 설치

폴더를 만들고 들어갑니다.

$ mkdir Tessact
$ cd Tesseract

 

tesstrain 을 받아옵니다.

$ git clone https://github.com/tesseract-ocr/tesstrain.git
$ cd tesstrain

 

make를 설치후 make 입력시 사용할수 있는 속성이 나옵니다.

$ sudo apt install make
$ make

find: ‘data/foo-ground-truth’: No such file or directory
find: ‘data/foo-ground-truth’: No such file or directory

  Targets

    unicharset       Create unicharset
    lists            Create lists of lstmf filenames for training and eval
    training         Start training
    traineddata      Create best and fast .traineddata files from each .checkpoint file
    proto-model      Build the proto model
    leptonica        Build leptonica
    tesseract        Build tesseract
    tesseract-langs  Download tesseract-langs
    clean-box        Clean generated .box files
    clean-lstmf      Clean generated .lstmf files
    clean-output     Clean generated output files
    clean            Clean all generated files

  Variables

    TESSDATA           Path to the .traineddata directory with traineddata suitable for training
                       (for example from tesseract-ocr/tessdata_best). Default: /home/munggae/Tessact/tesstrain/usr/share/tessdata
    MODEL_NAME         Name of the model to be built. Default: foo
    OUTPUT_DIR         Output directory for generated files. Default: data/foo
    WORDLIST_FILE      Optional Wordlist file for Dictionary dawg. Default: data/foo/foo.wordlist
    NUMBERS_FILE       Optional Numbers file for number patterns dawg. Default: data/foo/foo.numbers
    PUNC_FILE          Optional Punc file for Punctuation dawg. Default: data/foo/foo.punc
    START_MODEL        Name of the model to continue from. Default: ''
    PROTO_MODEL        Name of the proto model. Default: 'data/foo/foo.traineddata'
    CORES              No of cores to use for compiling leptonica/tesseract. Default: 4
    LEPTONICA_VERSION  Leptonica version. Default: 1.80.0
    TESSERACT_VERSION  Tesseract commit. Default: 4.1.1
    TESSDATA_REPO      Tesseract model repo to use. Default: _best
    GROUND_TRUTH_DIR   Ground truth directory. Default: data/foo-ground-truth
    MAX_ITERATIONS     Max iterations. Default: 10000
    EPOCHS             Set max iterations based on the number of lines for the training. Default: none
    DEBUG_INTERVAL     Debug Interval. Default:  0
    LEARNING_RATE      Learning rate. Default: 0.002
    NET_SPEC           Network specification. Default: [1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx192 O1c###]
    LANG_TYPE          Language Type - Indic, RTL or blank. Default: ''
    PSM                Page segmentation mode. Default: 13
    RANDOM_SEED        Random seed for shuffling of the training data. Default: 0
    RATIO_TRAIN        Ratio of train / eval training data. Default: 0.90
    TARGET_ERROR_RATE  Default Target Error Rate. Default: 0.01

지금 단계에선 대충 보고 넘어갑니다.

 

빌드 전, 입력

sudo apt update
sudo apt upgrade
sudo apt install g++ # or clang++ (presumably)
sudo apt install pkg-config libpng-dev libjpeg8-dev libtiff5-dev
sudo apt install zlib1g-dev libicu-dev libpango1.0-dev libcairo2-dev
sudo apt install autoconf automake libtool
sudo apt install make unzip
sudo apt install python3-pip
python3 -m pip install pip --upgrade
python3 -m pip install pillow

 

Tesseract는 leptonica를 빌드해야 빌드가 됩니다. 이전에 따로 테서렉트를 설치했다면 상관 없지만 새로 설치할경우 렙토니카를 먼저 빌드해야 합니다.

$ sudo make leptonica
$ sudo make tesseract

빌드완료시 eng.traineddata 가 다운받아집니다.

확인)

$ tessseract -v

Tesseract 버전이 잘나오면 성공.

 

3.학습

tesstrain 폴더 안쪽 ocrd-testset.zip 안에 예시 이미지와 라벨 텍스트가 있습니다.

이미지는 tif/tiff를 기본값으로, 텍스트는 .gt.txt를 기본으로 합니다.

ich denke. Aber was die ſelige Frau Geheimräthin

 

위와같이 여백이 거의 없는 문자열과 그 답을 적은 텍스트 파일로 이뤄집니다.

기본값으로 './data/foo-ground-truth/'안에  넣어주며 옵션을 통해 경로와 이름을 정해 줄 수있습니다.

$ mkdir data
$ mkdir data/foo-ground-truth
$ unzip ocrd-testset.zip -d ./data/foo-ground-truth/

 

다시 make 를 입력해 천천히 살펴보겠습니다.

$ make

  Targets

    unicharset       Create unicharset
    lists            Create lists of lstmf filenames for training and eval
    training         Start training
    traineddata      Create best and fast .traineddata files from each .checkpoint file
    proto-model      Build the proto model
    leptonica        Build leptonica
    tesseract        Build tesseract
    tesseract-langs  Download tesseract-langs
    clean-box        Clean generated .box files
    clean-lstmf      Clean generated .lstmf files
    clean-output     Clean generated output files
    clean            Clean all generated files

  Variables

    TESSDATA           Path to the .traineddata directory with traineddata suitable for training
                       (for example from tesseract-ocr/tessdata_best). Default: /home/munggae/Tessact/tesstrain/usr/share/tessdata
    MODEL_NAME         Name of the model to be built. Default: foo
    OUTPUT_DIR         Output directory for generated files. Default: data/foo
    WORDLIST_FILE      Optional Wordlist file for Dictionary dawg. Default: data/foo/foo.wordlist
    NUMBERS_FILE       Optional Numbers file for number patterns dawg. Default: data/foo/foo.numbers
    PUNC_FILE          Optional Punc file for Punctuation dawg. Default: data/foo/foo.punc
    START_MODEL        Name of the model to continue from. Default: ''
    PROTO_MODEL        Name of the proto model. Default: 'data/foo/foo.traineddata'
    CORES              No of cores to use for compiling leptonica/tesseract. Default: 4
    LEPTONICA_VERSION  Leptonica version. Default: 1.80.0
    TESSERACT_VERSION  Tesseract commit. Default: 4.1.1
    TESSDATA_REPO      Tesseract model repo to use. Default: _best
    GROUND_TRUTH_DIR   Ground truth directory. Default: data/foo-ground-truth
    MAX_ITERATIONS     Max iterations. Default: 10000
    EPOCHS             Set max iterations based on the number of lines for the training. Default: none
    DEBUG_INTERVAL     Debug Interval. Default:  0
    LEARNING_RATE      Learning rate. Default: 0.002
    NET_SPEC           Network specification. Default: [1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx192 O1c###]
    LANG_TYPE          Language Type - Indic, RTL or blank. Default: ''
    PSM                Page segmentation mode. Default: 13
    RANDOM_SEED        Random seed for shuffling of the training data. Default: 0
    RATIO_TRAIN        Ratio of train / eval training data. Default: 0.90
    TARGET_ERROR_RATE  Default Target Error Rate. Default: 0.01

 

Targets

    unicharset       Create unicharset
    lists            Create lists of lstmf filenames for training and eval
    training         Start training
    traineddata      Create best and fast .traineddata files from each .checkpoint file
    proto-model      Build the proto model
    leptonica        Build leptonica  
    tesseract        Build tesseract
    tesseract-langs  Download tesseract-langs
    clean-box        Clean generated .box files
    clean-lstmf      Clean generated .lstmf files
    clean-output     Clean generated output files
    clean            Clean all generated files

 

  • unicharset : .gt.txt 파일들을 읽어와 unicode 표를 작성합니다. 기존 모델(pretrained)이 있다면 기존 모델의 것도 불러옵니다. data/(모델이름 기본값 : foo) 폴더에 저장됩니다.
  • lists : 학습에 필요한 box파일과 lstmf 파일을 만듭니다.
  • proto-model : 초기모델을 만듭니다. unicharset과 같이 저장됩니다.
  • clean : 모든 결과물들을 지웁니다.
  • clean-box,lstmf,output : 해당되는 것들을 지웁니다.
  • training : 학습을 시작합니다. 위의 전과정을 거치지 않아도 자동으로 실행이 됩니다.
  • traineddata : 학습후 checkpoint 파일로 부터 best_model, fast_model을 생성합니다.
  Variables

    TESSDATA           Path to the .traineddata directory with traineddata suitable for training
                       (for example from tesseract-ocr/tessdata_best). Default: /home/munggae/Tessact/tesstrain/usr/share/tessdata
    MODEL_NAME         Name of the model to be built. Default: foo
    OUTPUT_DIR         Output directory for generated files. Default: data/foo
    WORDLIST_FILE      Optional Wordlist file for Dictionary dawg. Default: data/foo/foo.wordlist
    NUMBERS_FILE       Optional Numbers file for number patterns dawg. Default: data/foo/foo.numbers
    PUNC_FILE          Optional Punc file for Punctuation dawg. Default: data/foo/foo.punc
    START_MODEL        Name of the model to continue from. Default: ''
    PROTO_MODEL        Name of the proto model. Default: 'data/foo/foo.traineddata'
    CORES              No of cores to use for compiling leptonica/tesseract. Default: 4
    LEPTONICA_VERSION  Leptonica version. Default: 1.80.0
    TESSERACT_VERSION  Tesseract commit. Default: 4.1.1
    TESSDATA_REPO      Tesseract model repo to use. Default: _best
    GROUND_TRUTH_DIR   Ground truth directory. Default: data/foo-ground-truth
    MAX_ITERATIONS     Max iterations. Default: 10000
    EPOCHS             Set max iterations based on the number of lines for the training. Default: none
    DEBUG_INTERVAL     Debug Interval. Default:  0
    LEARNING_RATE      Learning rate. Default: 0.002
    NET_SPEC           Network specification. Default: [1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx192 O1c###]
    LANG_TYPE          Language Type - Indic, RTL or blank. Default: ''
    PSM                Page segmentation mode. Default: 13
    RANDOM_SEED        Random seed for shuffling of the training data. Default: 0
    RATIO_TRAIN        Ratio of train / eval training data. Default: 0.90
    TARGET_ERROR_RATE  Default Target Error Rate. Default: 0.01

 

Variable은 전부 대문자로 =하나에 띄어쓰기 없이 사용합니다.

  • MODEL_NAME : 모델이름을 설정합니다
  • START_MODEL : 이전에 학습된 모델이 있다면 이어서 학습할수 있습니다.
  • GROUND_TRUTH_DIR : data의 경로를 지정할 수 있습니다.
  • PSM : Tesseract OCR 사용시의 PSM과 같은 PSM 으로 생각됩니다.

이외에도 학습에 필요한 Hyper Parameter를 일부 설정할 수 있습니다.

다음과 같이 학습 할 수 있습니다.

예시)

make training # 기본 값만 사용
make training MODEL_NAME=cut # cut-ground-truth 의 이미지 학습
make training START_MODEL=eng # eng.traineddata 추가학습(재학습)

 

이전에 학습된 모델은 tesstrain/usr/share/tessdata에 넣어줘야 합니다. 

$ mkdir usr
$ mkdir usr/share
$ mkdir usr/share/tessdata

$sudo cp /usr/share/tessdata/eng.traineddata  ./usr/share/tessdata

 

eng.tessdata를 이용하여 다음 이미지를 읽을 경우 다음과 같습니다.

ich denke. Aber was die ſelige Frau Geheimräthin <- 원문장

영어가 제대로 인식하지 못함을 알 수 있습니다.

영어 모델에 추가적으로 학습하여 읽어보도록 하겠습니다.

$ make clean 
$ make training START_MODEL=eng 

학습이 끝나면 best, fast data를 만듭니다

$ make traineddata
$ sudo cp ./data/foo/tessdata_best/foo0.022_2187.traineddata /usr/share/tessdata/foo.traineddata

모델들은 ./data/foo/tessdata_best,fast 에 각각 저장되며 foo(loss).traineddata로 저장되기에 loss가 가장 적은 것을 택하면 됩니다.

원문

ich denke. Aber was die ſelige Frau Geheimräthin

영어

추가 학습

새로 추가하여 학습한 모델이 정확하게 나왔습니다.