tesseract-OCR的训练以及在IOS手机EasyClick上的使用

414 阅读5分钟

首先下载tesseractOCR应用,下载地址:digi.bib.uni-mannheim.de/tesseract/

image.png

源码地址为:github.com/tesseract-o…

image.png 安装中这里选择需要的语言包

image.png 安装完成后,将目录添加到系统变量path中

image.png 查看版本信息

image.png 查看已下载的语言包


训练样本需要一个工具,jTessBoxEditor,这个工具是用java开发的,需要jre7以上的版本支持。

下载jTessBoxEditor

地址:github.com/nguyenq/jTe…

1、获取训练的图片,为了方便我使用了原来的图片一张,样本当然是越多越好。

2、合并样本文件,打开jTessBoxEditor,点开train.bat。在菜单栏中Tools->Merge TIFF。在弹出的窗口中可以选择多张样本图片(网上之前有说要.tif格式的图片,测试.jpg .png格式的也行)。 之后会合成一张tif格式文件

image.png

生成box文件, 打开命令行,输入:

1tesseract.exe test.font.exp1.tif test.font.exp1 batch.nochop makebox
tip如果有多个文件,比如增量训练,就需要多行生成box
-tesseract.exe test.font.exp2.tif test.font.exp2 batch.nochop makebox
-tesseract.exe test.font.exp3.tif test.font.exp3 batch.nochop makebox

      生成的BOX文件为test.font.exp1.box,BOX文件为Tessercat识别出的文字和其坐标。Make BOX的命名的个数为:

1tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

      其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。有些博客说对于这个命名无所谓,但是我尝试到后免出错了,是tr文件名的问题,在下面我会贴出报错图。读者也可以试试,不知是不是我之前步骤哪里做错了。

4、文字矫正,打开jTessBoxEditor工具,打开test.font.exp1.tif文件(必须将上一步生成的.box和.tif样本文件放在同一目录),如下图所示。可以看出有些字符分割和识别都不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正。校正完成后保存即可。(注:发现中文打不上去,在菜单Setting->Font中可以修改,改为宋体即可

5、生成.tr文件,在命令行中输入:

1tesseract test.font.exp1.tif test.font.exp1 nobatch box.train
tip如果有多个文件,比如增量训练,就需要多行生成tr
-tesseract test.font.exp2.tif test.font.exp2 nobatch box.train
-tesseract test.font.exp3.tif test.font.exp3 nobatch box.train

   6、计算字符集,从生成的box文件中提取,继续输入:

1unicharset_extractor test.font.exp1.box
tip如果有多个文件,比如增量训练,就需要以空格分割多个box
-unicharset_extractor test.font.exp1.box test.font.exp2.box

 7、生成字体特征文件,在当前文件夹中新建任意名称的文件,里面格式为:

1<span><fontname> <italic> <bold> <fixed> <serif> <fraktur>  </span>

       例如:我建了一个名为font的文件,里面内容为:font 0 0 0 0 0 

        这个文件可以是手动生成的txt文件,也可以在在命令行中输入:

1 echo font ``0 0 0 0 0 >font

        即可。

  8、特征训练,继续在命令行输入:

1mftraining -F font -U unicharset test.font.exp1.tr
tip如果有多个文件,比如增量训练,就需要以空格分割多个tr
-mftraining -F font -U unicharset test.font.exp1.tr test.font.exp2.tr

9、聚类:Clustering 聚集tesseract识别的训练文件,命令行输入:

1cntraining test.font.exp1.tr
tip如果有多个文件,比如增量训练,就需要以空格分割多个tr
-cntraining test.font.exp1.tr test.font.exp2.tr

    有人会说其他还有一条shapeclustering语句,说下这个步骤可有可无,这个是在3.02中新加的,主要针对印度语,所以我们在做的时候会有一个警告 warning No shape table file present。
现在需要做的是把训练过程创建的五个文件:shapetable,normproto,inttemp,pffmtable,unicharset,用lang.为前缀重命名(例如test.),然后运行combine_tessdata.

如下图所示:

image.png      

10、最后,合并相关文件,生成字典文件,输入:

1combine_tessdata font.

image.png 最终,在当前目录中会产生一个为font.traineddata文件,将其拷到tessdata文件夹中,再测试一下。

1tesseract.exe .\7766.png result -l font

接下来是EC代码内操作

直接上代码

let pa = {
    "type": "tess",
    "path": "D:/tesseract-ocr/tessdata",
    "baseDir": "D:/tesseract-ocr",
    "language": "font",
    "ocrEngineMode": 0
}
  • 参数设置为: {"type":"tess","path":"d:\tesseract-ocr\tessdata","baseDir":"d:\tesseract-ocr"}
  • baseDir: 代表是tesseract安装路径,安装包下载: github.com/tesseract-o… 或者官方王下载jTessBoxEditor.zip包含了训练工具和tesseract的dll
  • path: 代表是tesseract 的 tesssdata 文件夹
  • language: 语言数据集文件, 例如 chi_sim.traineddata 代表是中文简体语言,参数就填写 chi_sim,多个可以用+链接,例如:chi_sim+eng+num
  • ocrEngineMode: 识别引擎类型,0 OEM_TESSERACT_ONLY , 1 OEM_LSTM_ONLY,2 OEM_TESSERACT_LSTM_COMBINED,3 OEM_DEFAULT
  • rilLevel: PageIteratorLevel 参数,-1 自适应, 0: RIL_BLOCK, 1: RIL_PARA, 2: RIL_TEXTLINE, 3: RIL_WORD, 4:RIL_SYMBOL
let tocr = ocr.newOcr()
let inited = tocr.initOcr(pa);
logd("初始化结果 -" + inited);
if (!inited) {
    loge("error : " + tocr.getErrorMsg());
    return;
}
console.time("1")
let _image = image.captureFullScreenEx({"type": "1", "quality": 100});  //截取全图
// _image = image.binaryzation(_image,1,100);  //这里是图片二值化让去除图片杂点方便识别,可以不使用
if (!_image) {
    loge("读取图片失败");
}
let _rect_image = image.clip(_image, 1032,346,1057,399);  //裁剪图片只留下想要识别的区域
image.recycle(_image)
let _img = image.rotateImage(_rect_image, -90); //将图片逆时针旋转90度  游戏图片为竖屏的所以需要旋转
image.recycle(_rect_image)
logd("start---ocr");
// 对图片进行识别
let result = tocr.ocrImage(_img, 20 * 1000)
image.recycle(_img)
logd("识别结果:" + result)
if (result) {
    logd("ocr结果-》 " + JSON.stringify(result));
    for (var i = 0; i < result.length; i++) {
        var value = result[i];
        logd("文字 : " + value.label + " x: " + value.x + " y: " + value.y + " width: " + value.width + " height: " + value.height);
    }
} else {
    logw("未识别到结果");
}

logd("耗时: " + console.timeEnd(1) + " ms")
sleep(1000);

代码上方可以加一行在ec执行结束之后释放ocr资源

setStopCallback(() => {
    //释放所有资源
    tocr.releaseAll();
});