Tesseract字體識別 及 jTessBoxEditor工具進行訓練 及 Java API實現字體識別

Tesseract程序識別

程序源碼 tesseract項目的github地址 (Linux下可通過包管理器下載安裝)

基本使用

注意點:1,圖片文件類型爲tiff/tif,2,output是輸出文件名,執行命令後的輸出文件是output.txt

tesseract 圖片路徑名 輸出文件名

示例如下

tesseract /home/newcih/a.tiff output

Linux下圖片類型轉換工具,爲了便於批量操作,這裏提供命令行工具 convert,該工具在軟件ImageMagick包下,可以通過安裝這個獲取工具

此時可以打開文件output.txt查看識別結果

jTessBoxEditor工具進行訓練

程序下載 VietOCR的sourceforge地址

tesseract程序默認使用eng字體進行識別,在輸入的圖片文件由自定義字體或不明字體的數字或字母或文字組成時,需要使用訓練工具進行矯正,這裏使用jTessBoxEditor工具(本人下載FX版本,即JavaFX開發,需要JDK 8 支持)(訓練的最終結果是生成一款字體識別文件,文件類型是.traineddata,而該工具只是更新box文件),界面如下

這裏寫圖片描述

合併所有待訓練的tiff/tif文件

這裏寫圖片描述

合併後進行保存,(文件名的規範是 語言名+字體名的形式等),如 mylang.myfont.exp0.tif(以下教程以該文件名進行描述),合併完成後,使用tesseract工具生成box文件,以進行訓練

tesseract mylang.myfont.exp0.tif mylang.myfont.exp0 -l eng -psm 7 batch.nochop makebox

生成後的box文件爲mylang.myfont.exp0.box

使用jTessBoxEditor工具進行矯正

這裏寫圖片描述

在該選項卡打開合併後的mylang.myfont.exp0.tif文件,此時jTessBoxEditor將自動加載mylang.myfont.exp0.box,界面如下
這裏寫圖片描述

使用說明

  • Box Coordinates
    這裏顯示的數據與右邊的圖片的紅色方框內的文字相對應,雙擊可以進行修改(即矯正部分被tesseract錯誤識別的數字)

  • 工具欄
    工具欄有Merge,Split,Insert,Delete,這是對圖片的操作,點擊右邊的圖片,可以通過工具欄進行圖塊的合併分割新增,和刪除,最終應保證被識別數值在圖塊裏。

  • 分頁欄
    下方有分頁按鈕,當初合併了多少個tiff/tif文件,這裏就有多少個頁面,需要一一進行矯正。


生成box文件成功後,開始訓練,訓練方式有兩種,可以自行選擇(舊版本的jTessBoxEditor工具可能會在某一步崩潰,所以提供Linux Shell版本選擇)。

生成字體訓練數據(使用jTessBoxEditor工具)

打開菜單項Trainer,設置參數如下:

  • Tesseract Executables tesseract的執行路徑
  • Training Data 存放tiff文件box文件的目錄
  • Language 自己爲新字體起的名字
  • Train with Existing Box 選擇該模式,表示根據已有box文件進行訓練
  • Run 點擊運行即可

這裏寫圖片描述

運行結果截圖

這裏寫圖片描述

結果判斷 : 第1,3,4,5,13項有值即可,即存在 .unicharset .inttemp .pffmtable .normproto .shapetable這5個文件即可。生成的目標文件在目錄下(該目錄即存放tiff/tif和box文件的目錄)的tessdata文件夾下

生成字體訓練數據(使用命令行)

jTessBoxEditor不一定一直可靠,所以這裏提供Linux Shell的腳本

#!/bin/bash

echo -e "\033[37m 前提:請將合併後的tif文件命名爲 mylang.myfont.exp0.tif,執行該命令之前,請先生成box,執行makeBox即可 \033[0m"

echo -e "\033[37m 正在生成font_properties文件... \033[0m"
echo myfont 0 0 0 0 0 > font_properties
echo -e "\033[37m font_properties文件生成成功 \033[0m"

echo -e "\033[37m 正在生成訓練文件... \033[0m"
tesseract mylang.myfont.exp0.tif mylang.myfont.exp0 -l eng -psm 7 nobatch box.train
echo -e "\033[37m 訓練文件生成成功 \033[0m"

echo -e "\033[37m 正在字符集文件... \033[0m"
unicharset_extractor mylang.myfont.exp0.box
echo -e "\033[37m 字符集文件生成成功 \033[0m"

echo -e "\033[37m 正在生成shape文件... \033[0m"
shapeclustering -F font_properties -U unicharset -O mylang.unicharset mylang.myfont.exp0.tr
echo -e "\033[37m 生成shape文件成功 \033[0m"

echo -e "\033[37m 正在生成聚集字符特徵文件... \033[0m"
mftraining -F font_properties -U unicharset -O mylang.unicharset mylang.myfont.exp0.tr
echo -e "\033[37m 生成聚集字符特徵文件成功 \033[0m"

echo -e "\033[37m 正在生成字符正常化特徵文件... \033[0m"
cntraining mylang.myfont.exp0.tr
echo -e "\033[37m 生成字符正常化特徵文件成功 \033[0m"

echo -e "\033[37m 更名生成的文件中... \033[0m"
mv normproto myfont.normproto
mv inttemp myfont.inttemp
mv pffmtable myfont.pffmtable
mv unicharset myfont.unicharset
mv shapetable myfont.shapetable
echo -e "\033[37m 更名生成的文件完成 \033[0m"

echo -e "\033[37m 合併訓練文件,生成myfont.traineddata \033[0m"
combine_tessdata myfont.
echo -e "\033[37m 合併訓練文件成功,最終輸出的字體文件是 myfont.traineddata,請先將其移動到/usr/share/tesseract/tessdata文件夾,之後方可使用新字體識別圖像 \033[0m"

這裏提供接受參數的shell腳本下載(生成box文件生成訓練數據

最後生成的myfont.traineddata是目標產物,需要放到tessdata文件夾方能生效,我的tesseract工具是通過命令行安裝,所以tessdata文件夾在/usr/share/tesseract/tessdata中,之後便可以使用如下命令識別圖片

tesseract 圖片路徑 -l myfont output

生成的字體文件是myfont.traineddata,則使用的時候,選擇語言爲myfont即可

Java API (tess4j) 識別字體

這裏講述使用Java API來實現圖像識別,代碼如下

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;

public class Main {

    public static final String DATA_PATH = "/usr/share/tesseract/tessdata";

    public static void main(String[] args) {
        File       imageFile = new File("/home/newcih/Tesseract/00.tif");
        ITesseract instance  = new Tesseract();
        /**
         *  配置tessdata目錄,該目錄的位置已在上述教程說過,這個必須設置,也可以通過系統變量設置TESSDATA_PREFIX變量來實現,
         *  然而必須注意:通過系統變量實現,必須在設置完後重啓,尤其是Linux存在父子Shell變量的作用域問題
         */
        instance.setDatapath(DATA_PATH);

        try {
            String result = instance.doOCR(imageFile);
            System.out.println(result);
        } catch (TesseractException e) {
            e.printStackTrace();
        }
    }
}

目前本教程結束,後續會發布關於使用Java實現自動化訓練的教程,謝謝大家

自動化訓練項目地址( tesseractAutoTrain


本教程在Fedora 27下實踐


備註知識

流程簡要描述

這裏簡單介紹總體步驟

  1. 合併多個tiff/tif文件(一個tiff/tif生成一個對應的字體訓練數據)
  2. 生成 .box類型的文件(記錄了tesseract對tiff/tif圖片的識別情況,如識別值,座標跟大小)
  3. 進行訓練(本教程使用jTessBoxEditor工具進行訓練,原本也可以直接編輯box文件,鑑於tesseract對圖塊的劃分無法直接在文本工具查看,所以藉助該第三方工具。訓練的直接結果,就是修改了box文件的數據
  4. 訓練完成,保存訓練結果。(整個過程就是更新了box文件
  5. 生成結果
    • 使用jTessBoxEditor工具
    • 使用Linux Shell命令行

Box文件結構

圖片的座標原點在左上角,適用於下面提到的x和y座標

打開一個box文件如下
這裏寫圖片描述

  • 一行代表一張tiff/tif圖片的識別情況(使用jTessBoxEditor合併多張tiff/tif的結果僅僅是將多張tiff/tif存入,所以生成box文件時依然能正常識別出實際上有多少張)
  • 每行數據的各個數字代表的意義如下
    • 1 => tesseract識別的值
    • 2 => tesseract的識別圖塊的x座標(即識別圖塊的左邊的x座標
    • 3 => tiff/tif圖片的高度 - tesseract的識別圖塊的y座標 - tesseract的識別圖塊的高度(即識別圖塊的底邊的y座標
    • 4 => tesseract的識別圖塊的x座標 + tesseract識別圖塊的寬度(即識別圖塊的右邊的x座標
    • 5 => tiff/tif高度 - tesseract的識別圖塊的y座標(即識別圖塊的頂邊的y座標
    • 6 => 該tiff/tif圖片在合併後的tiff/tif圖片的索引值,即位置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章