See
https://github.com/tesseract-ocr/tesstrain/wiki/GT4HistOCR#tesseract-fails-to-create-lstm-files

On Thu, Sep 5, 2019 at 1:25 PM Ayush Pandey <xapianay...@gmail.com> wrote:

> Tesseract Version: 4.1.0
>
> I am trying to fine tune tesseract on custom dataset with the following
> Makefile:
>
> export
>
> SHELL := /bin/bash
> HOME := $(PWD)
> TESSDATA = $(HOME)/tessdata
> LANGDATA = $(HOME)/langdata
>
> # Train directory
> # TRAIN := $(HOME)/train_data
> TRAIN := /media/vimaan/Data/OCR/tesseract_train
>
> # Name of the model to be built
> MODEL_NAME = eng
> LANG_CODE = eng
>
> # Name of the model to continue from
> CONTINUE_FROM = eng
>
> TESSDATA_REPO = _best
>
> # Normalization Mode - see src/training/language_specific.sh for details
> NORM_MODE = 1
>
> # BEGIN-EVAL makefile-parser --make-help Makefile
>
> help:
>       @echo ""
>       @echo "  Targets"
>       @echo ""
>       @echo "    unicharset       Create unicharset"
>       @echo "    lists            Create lists of lstmf filenames for 
> training and eval"
>       @echo "    training         Start training"
>       @echo "    proto-model      Build the proto model"
>       @echo "    leptonica        Build leptonica"
>       @echo "    tesseract        Build tesseract"
>       @echo "    tesseract-langs  Download tesseract-langs"
>       @echo "    langdata         Download langdata"
>       @echo "    clean            Clean all generated files"
>       @echo ""
>       @echo "  Variables"
>       @echo ""
>       @echo "    MODEL_NAME         Name of the model to be built"
>       @echo "    CORES              No of cores to use for compiling 
> leptonica/tesseract"
>       @echo "    LEPTONICA_VERSION  Leptonica version. Default: 
> $(LEPTONICA_VERSION)"
>       @echo "    TESSERACT_VERSION  Tesseract commit. Default: 
> $(TESSERACT_VERSION)"
>       @echo "    LANGDATA_VERSION   Tesseract langdata version. Default: 
> $(LANGDATA_VERSION)"
>       @echo "    TESSDATA_REPO      Tesseract model repo to use. Default: 
> $(TESSDATA_REPO)"
>       @echo "    TRAIN              Train directory"
>       @echo "    RATIO_TRAIN        Ratio of train / eval training data"
>
> # END-EVAL
>
> # Ratio of train / eval training data
> RATIO_TRAIN := 0.90
>
> ALL_BOXES = data/all-boxes
> ALL_LSTMF = data/all-lstmf
>
> # Create unicharset
> unicharset: data/unicharset
>
> # Create lists of lstmf filenames for training and eval
> #lists: $(ALL_LSTMF) data/list.train data/list.eval
> lists: $(ALL_LSTMF)
>
> train-lists: data/list.train data/list.eval
>
> data/list.train: $(ALL_LSTMF)
>       total=`cat $(ALL_LSTMF) | wc -l` \
>          no=`echo "$$total * $(RATIO_TRAIN) / 1" | bc`; \
>          head -n "$$no" $(ALL_LSTMF) > "$@"
>
> data/list.eval: $(ALL_LSTMF)
>       total=`cat $(ALL_LSTMF) | wc -l` \
>          no=`echo "($$total - $$total * $(RATIO_TRAIN)) / 1" | bc`; \
>          tail -n "$$no" $(ALL_LSTMF) > "$@"
>
> # Start training
> training: data/$(MODEL_NAME).traineddata
>
> data/unicharset: $(ALL_BOXES)
>       mkdir -p data/$(START_MODEL)
>       combine_tessdata -u $(TESSDATA)/$(CONTINUE_FROM).traineddata  
> $(TESSDATA)/$(CONTINUE_FROM).
>       unicharset_extractor --output_unicharset "$(TRAIN)/my.unicharset" 
> --norm_mode $(NORM_MODE) "$(ALL_BOXES)"
>       #merge_unicharsets data/$(START_MODEL)/$(START_MODEL).lstm-unicharset 
> $(GROUND_TRUTH_DIR)/my.unicharset  "$@"
>       merge_unicharsets $(TESSDATA)/$(CONTINUE_FROM).lstm-unicharset 
> $(TRAIN)/my.unicharset  "$@"
>       
> $(ALL_BOXES): $(sort $(patsubst %.tif,%.box,$(wildcard $(TRAIN)/*.tif)))
>       find $(TRAIN) -name '*.box' -exec cat {} \; > "$@"
>       
> $(TRAIN)/%.box: $(TRAIN)/%.tif $(TRAIN)/%.gt.txt
>       python generate_line_box.py -i "$(TRAIN)/$*.tif" -t 
> "$(TRAIN)/$*.gt.txt" > "$@"
>
> $(ALL_LSTMF): $(sort $(patsubst %.tif,%.lstmf,$(wildcard $(TRAIN)/*.tif)))
>       find $(TRAIN) -name '*.lstmf' -exec echo {} \; | sort -R -o "$@"
>
> $(TRAIN)/%.lstmf: $(TRAIN)/%.box
>       tesseract $(TRAIN)/$*.tif $(TRAIN)/$* --dpi 300 --psm 7 lstm.train
>       
>
> # Build the proto model
> proto-model: data/$(MODEL_NAME)/$(MODEL_NAME).traineddata
>
> data/$(MODEL_NAME)/$(MODEL_NAME).traineddata: $(LANGDATA) data/unicharset
>       combine_lang_model \
>         --input_unicharset data/unicharset \
>         --script_dir $(LANGDATA) \
>         --words $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).wordlist \
>         --numbers $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).numbers \
>         --puncs $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).punc \
>         --output_dir data/ \
>         --lang $(MODEL_NAME)
>
> data/checkpoints/$(MODEL_NAME)_checkpoint: unicharset proto-model
>       mkdir -p data/checkpoints
>       lstmtraining \
>         --continue_from   $(TESSDATA)/$(CONTINUE_FROM).lstm \
>         --old_traineddata $(TESSDATA)/$(CONTINUE_FROM).traineddata \
>         --traineddata data/$(MODEL_NAME)/$(MODEL_NAME).traineddata \
>         --model_output data/checkpoints/$(MODEL_NAME) \
>         --debug_interval -1 \
>         --train_listfile data/list.train \
>         --eval_listfile data/list.eval \
>         --sequential_training \
>         --max_iterations 170000
>
> data/$(MODEL_NAME).traineddata: data/checkpoints/$(MODEL_NAME)_checkpoint
>       lstmtraining \
>       --stop_training \
>       --continue_from $^ \
>       --old_traineddata $(TESSDATA)/$(CONTINUE_FROM).traineddata \
>       --traineddata data/$(MODEL_NAME)/$(MODEL_NAME).traineddata \
>       --model_output $@
>
> # Clean all generated files
> clean:
>       find data/train -name '*.box' -delete
>       find data/train -name '*.lstmf' -delete
>       rm -rf data/all-*
>       rm -rf data/list.*
>       rm -rf data/$(MODEL_NAME)
>       rm -rf data/unicharset
>       rm -rf data/checkpoints
>
> The number of .lstmf files being generated is significantly lower than
> .box files being generated.
> For eg:
> Number of .tif files: 10k
> Number of .gt.txt files: 10k
> Number of .box files: 10k
> Number of .lstmf files: 8k.
> Could anyone point me out to the possible reasons for this issue
>
> On Friday, June 29, 2018 at 5:39:09 PM UTC+5:30, shree wrote:
>>
>> I modified the makefile for ocrd-train to do fine-tuning.  It is pasted
>> below:
>>
>> export
>>
>> SHELL := /bin/bash
>> LOCAL := $(PWD)/usr
>> PATH := $(LOCAL)/bin:$(PATH)
>> HOME := /home/ubuntu
>> TESSDATA =  $(HOME)/tessdata_best
>> LANGDATA = $(HOME)/langdata
>>
>> # Name of the model to be built
>> MODEL_NAME = frk
>>
>> # Name of the model to continue from
>> CONTINUE_FROM = frk
>>
>> # Normalization Mode - see src/training/language_specific.sh for details
>> NORM_MODE = 2
>>
>> # Tesseract model repo to use. Default: $(TESSDATA_REPO)
>> TESSDATA_REPO = _best
>>
>> # Train directory
>> TRAIN := data/train
>>
>> # BEGIN-EVAL makefile-parser --make-help Makefile
>>
>> help:
>> @echo ""
>> @echo "  Targets"
>> @echo ""
>> @echo "    unicharset       Create unicharset"
>> @echo "    lists            Create lists of lstmf filenames for training
>> and eval"
>> @echo "    training         Start training"
>> @echo "    proto-model      Build the proto model"
>> @echo "    leptonica        Build leptonica"
>> @echo "    tesseract        Build tesseract"
>> @echo "    tesseract-langs  Download tesseract-langs"
>> @echo "    langdata         Download langdata"
>> @echo "    clean            Clean all generated files"
>> @echo ""
>> @echo "  Variables"
>> @echo ""
>> @echo "    MODEL_NAME         Name of the model to be built"
>> @echo "    CORES              No of cores to use for compiling
>> leptonica/tesseract"
>> @echo "    LEPTONICA_VERSION  Leptonica version. Default:
>> $(LEPTONICA_VERSION)"
>> @echo "    TESSERACT_VERSION  Tesseract commit. Default:
>> $(TESSERACT_VERSION)"
>> @echo "    LANGDATA_VERSION   Tesseract langdata version. Default:
>> $(LANGDATA_VERSION)"
>> @echo "    TESSDATA_REPO      Tesseract model repo to use. Default:
>> $(TESSDATA_REPO)"
>> @echo "    TRAIN              Train directory"
>> @echo "    RATIO_TRAIN        Ratio of train / eval training data"
>>
>> # END-EVAL
>>
>> # Ratio of train / eval training data
>> RATIO_TRAIN := 0.90
>>
>> ALL_BOXES = data/all-boxes
>> ALL_LSTMF = data/all-lstmf
>>
>> # Create unicharset
>> unicharset: data/unicharset
>>
>> # Create lists of lstmf filenames for training and eval
>> lists: $(ALL_LSTMF) data/list.train data/list.eval
>>
>> data/list.train: $(ALL_LSTMF)
>> total=`cat $(ALL_LSTMF) | wc -l` \
>>    no=`echo "$$total * $(RATIO_TRAIN) / 1" | bc`; \
>>    head -n "$$no" $(ALL_LSTMF) > "$@"
>>
>> data/list.eval: $(ALL_LSTMF)
>> total=`cat $(ALL_LSTMF) | wc -l` \
>>    no=`echo "($$total - $$total * $(RATIO_TRAIN)) / 1" | bc`; \
>>    tail -n "+$$no" $(ALL_LSTMF) > "$@"
>>
>> # Start training
>> training: data/$(MODEL_NAME).traineddata
>>
>> data/unicharset: $(ALL_BOXES)
>> combine_tessdata -u $(TESSDATA)/$(CONTINUE_FROM).traineddata
>> $(TESSDATA)/$(CONTINUE_FROM).
>> unicharset_extractor --output_unicharset "$(TRAIN)/my.unicharset"
>> --norm_mode $(NORM_MODE) "$(ALL_BOXES)"
>> merge_unicharsets $(TESSDATA)/$(CONTINUE_FROM).lstm-unicharset
>> $(TRAIN)/my.unicharset  "$@"
>> $(ALL_BOXES): $(sort $(patsubst %.tif,%.box,$(wildcard $(TRAIN)/*.tif)))
>> find $(TRAIN) -name '*.box' -exec cat {} \; > "$@"
>> $(TRAIN)/%.box: $(TRAIN)/%.tif $(TRAIN)/%-gt.txt
>> python generate_line_box.py -i "$(TRAIN)/$*.tif" -t "$(TRAIN)/$*-gt.txt"
>> > "$@"
>>
>> $(ALL_LSTMF): $(sort $(patsubst %.tif,%.lstmf,$(wildcard $(TRAIN)/*.tif)))
>> find $(TRAIN) -name '*.lstmf' -exec echo {} \; | sort -R -o "$@"
>>
>> $(TRAIN)/%.lstmf: $(TRAIN)/%.box
>> tesseract $(TRAIN)/$*.tif $(TRAIN)/$*   --psm 6 lstm.train
>>
>> # Build the proto model
>> proto-model: data/$(MODEL_NAME)/$(MODEL_NAME).traineddata
>>
>> data/$(MODEL_NAME)/$(MODEL_NAME).traineddata: $(LANGDATA) data/unicharset
>> combine_lang_model \
>>   --input_unicharset data/unicharset \
>>   --script_dir $(LANGDATA) \
>>   --words $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).wordlist \
>>   --numbers $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).numbers \
>>   --puncs $(LANGDATA)/$(MODEL_NAME)/$(MODEL_NAME).punc \
>>   --output_dir data/ \
>>   --lang $(MODEL_NAME)
>>
>> data/checkpoints/$(MODEL_NAME)_checkpoint: unicharset lists proto-model
>> mkdir -p data/checkpoints
>> lstmtraining \
>>   --continue_from   $(TESSDATA)/$(CONTINUE_FROM).lstm \
>>   --old_traineddata $(TESSDATA)/$(CONTINUE_FROM).traineddata \
>>   --traineddata data/$(MODEL_NAME)/$(MODEL_NAME).traineddata \
>>   --model_output data/checkpoints/$(MODEL_NAME) \
>>   --debug_interval -1 \
>>   --train_listfile data/list.train \
>>   --eval_listfile data/list.eval \
>>   --sequential_training \
>>   --max_iterations 3000
>>
>> data/$(MODEL_NAME).traineddata: data/checkpoints/$(MODEL_NAME)_checkpoint
>> lstmtraining \
>> --stop_training \
>> --continue_from $^ \
>> --old_traineddata $(TESSDATA)/$(CONTINUE_FROM).traineddata \
>> --traineddata data/$(MODEL_NAME)/$(MODEL_NAME).traineddata \
>> --model_output $@
>>
>> # Clean all generated files
>> clean:
>> find data/train -name '*.box' -delete
>> find data/train -name '*.lstmf' -delete
>> rm -rf data/all-*
>> rm -rf data/list.*
>> rm -rf data/$(MODEL_NAME)
>> rm -rf data/unicharset
>> rm -rf data/checkpoints
>>
>> On Fri, Jun 29, 2018 at 5:31 PM Lorenzo Bolzani <l.bo...@gmail.com>
>> wrote:
>>
>>> ​​
>>>
>>> Hi,
>>> I'm trying to do fine tuning of an existing model using line images and
>>> text labels. I'm running this version:
>>>
>>> tesseract 4.0.0-beta.3-56-g5fda
>>>  leptonica-1.76.0
>>>   libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.4.2) : libpng 1.2.54 :
>>> libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.4 : libopenjp2 2.3.0
>>>  Found AVX2
>>>  Found AVX
>>>  Found SSE
>>>
>>>
>>>
>>> I used OCR-D to generate lstmf files for the demo data.
>>>
>>> If I run the make command it works fine.
>>>
>>> make training MODEL_NAME=prova
>>>
>>> Now I isolated this command from the build:
>>>
>>> lstmtraining \
>>>   --traineddata data/prova/prova.traineddata \
>>>   --net_spec "[1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx256
>>> O1c`head -n1 data/unicharset`]" \
>>>   --model_output data/checkpoints/prova \
>>>   --learning_rate 20e-4 \
>>>   --train_listfile data/list.train \
>>>   --eval_listfile data/list.eval \
>>>   --max_iterations 10000
>>>
>>> and it works fine.
>>>
>>> Now I'm trying to modify it to fine tune the existing eng model. I made
>>> a few attempts, all ending into different errors (see the attached file for
>>> full output).
>>>
>>> I used:
>>>
>>> combine_tessdata -e /usr/local/share/tessdata/eng.traineddata
>>> extracted/eng.lstm
>>>
>>> to extract the eng.lstm model.
>>>
>>> This seems to works but I'm not sure it is the correct.
>>>
>>> lstmtraining \
>>>   --continue_from  extracted/eng.lstm \
>>>   --traineddata data/prova/prova.traineddata \
>>>   --old_traineddata extracted/eng.traineddata \
>>>   --model_output data/checkpoints/prova \
>>>   --learning_rate 20e-4 \
>>>   --train_listfile data/list.train \
>>>   --eval_listfile data/list.eval \
>>>   --max_iterations 10000
>>>
>>> (extracted/eng.traineddata is just a copy of eng.traineddata)
>>>
>>>
>>> The training resume exactly with the RMS of prova_checkpoint (6%) so it
>>> looks like it is training from that checkpoint, not the eng.lstm.
>>>
>>> Is this correct? What should I change?
>>> ​
>>> I'm following this guide:
>>>
>>>
>>> https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract-4.00#fine-tuning-for--a-few-characters
>>>
>>> ​
>>> I think continue_from and traineddata should refer to the eng model and
>>> old_traineddata should point to prova.traineddata, but if I do that I get a
>>> segmentation fault:
>>>
>>> [...]
>>> !int_mode_:Error:Assert failed:in file weightmatrix.cpp, line 244
>>> !int_mode_:Error:Assert failed:in file weightmatrix.cpp, line 244
>>> Segmentation fault
>>>
>>> What am I missing?
>>>
>>>
>>> Thanks, bye
>>>
>>> Lorenzo
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "tesseract-ocr" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to tesser...@googlegroups.com.
>>> To post to this group, send email to tesser...@googlegroups.com.
>>> Visit this group at https://groups.google.com/group/tesseract-ocr.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/tesseract-ocr/CAMgOLLyOJN31PdWQumXPO3JjuAc1Yz2BZYpMd4ftzBHgZkEaxA%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/tesseract-ocr/CAMgOLLyOJN31PdWQumXPO3JjuAc1Yz2BZYpMd4ftzBHgZkEaxA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
>> --
>>
>> ____________________________________________________________
>> भजन - कीर्तन - आरती @ http://bhajans.ramparivar.com
>>
> --
> You received this message because you are subscribed to the Google Groups
> "tesseract-ocr" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to tesseract-ocr+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/tesseract-ocr/e3ba3b90-a8c8-4085-bec5-cf918034ba2a%40googlegroups.com
> <https://groups.google.com/d/msgid/tesseract-ocr/e3ba3b90-a8c8-4085-bec5-cf918034ba2a%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>


-- 

____________________________________________________________
भजन - कीर्तन - आरती @ http://bhajans.ramparivar.com

-- 
You received this message because you are subscribed to the Google Groups 
"tesseract-ocr" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to tesseract-ocr+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tesseract-ocr/CAG2NduV4RmzWBGEfiWW9AOjGffkocJH9M6_hbTNPVVR1drdcMw%40mail.gmail.com.

Reply via email to