前言
随着越来越多的人开始关注文本识别领域,Tesseract 成为了最为受欢迎的开源 OCR 引擎之一。而她的一个重要组成部分就是训练数据(Tessdata)。Tessdata 中包含了 Tesseract 进行识别所需要的字符和词语的信息。然而,对于一些特殊场景,如中文文本的 OCR,官方提供的 Tessdata 并不能满足我们的需求。因此,我们需要自行训练模型并生成 Tessdata。
在这个过程中,我们需要使用到的一款工具就是 Tesseract-Bos-Shell。又因为 Bos 可以代表 Best OCR Settings,因此,这个工具可以帮助我们获取最佳的 OCR 设置,训练我们的模型,最终生成我们需要的 Tessdata。而我们使用的 Tesseract-Bos-Shell,也就是本文要介绍的 npm 包 @tessdata/bos,是 Tesseract-Bos-Shell 的 Node.js 封装。
在本文中,我们将针对不同场景展示 @tessdata/bos 的使用方法,以便读者们快速上手使用。
安装
在使用 @tessdata/bos 前,我们需要在项目中安装该模块和一些必要的依赖。
npm install @tessdata/bos tesseract.js leptonica
其中,tesseract.js 和 leptonica 分别是 Tesseract 的 JavaScript 封装和图像处理库。不过,在这篇文章中,我们将不再涉及 tesseract.js 和 leptonica 的使用细节,主要关注 @tessdata/bos 的使用。
使用场景一:获取 OCR 设置
我们先来简单介绍一下工具箱的用法。
bos box -p <pages-dir> -o <output-dir>
该命令主要用于获取 OCR 设置,其大致过程如下:
- 根据传入的
<pages-dir>
中的样本图像,计算每个字符的特征值。 - 根据特征值,针对样本图像中的文字,计算最适合的 OCR 设置。
- 将这些设置写入到
<output-dir>/bos_best_configs
文件夹下。
假设我们有如下的样本图像和正确的标注:
对于这个例子,我们可以使用下面的代码来获取 OCR 设置:
-- -------------------- ---- ------- ----- - ---- - - ------------------------ ----- --- - ------------------------ ----- -------- - --------- ----- --------- - ------- --------- --- -- ----------- -- -------------- ----- ------- ------- -- - -- ---- -- ------- - ----------------- -- ------- - ---- - ----- ------- - ------------------------------- -------------------- - --
其中,bos.parseBestConfigs
用于解析结果文件,并将结果转化为简单易用的对象。执行结果输出如下:
{ "tessedit_char_blacklist": "|\\/・|?°()[]{}\>\<", "tessedit_unrej_any_wd": true, "textord_force_make_prop_words": true, "textord_tabfind_find_tables": false }
在使用这些设置进行识别之前,我们还需要训练模型并生成 Tessdata。这个过程可能需要一些时间,具体过程会在后面介绍。
使用场景二:基于 OCR 设置识别图像
在获取 OCR 设置之后,我们就可以运用这些设置,进行 OCR 识别了。下面,我们将演示如何将这些 OCR 设置应用在图像中。
首先,我们需要准备一个带有图像文字的示例图像。
-- -------------------- ---- ------- ----- - ------------ - - ----------------------- ----- --- - --------------------------------------------------- -------------------------- -- - --------------------- - ----- ---------- ---------- ----- - ---- - -- -- - ----------------- -- --
这段代码使用 tesseract.js 对图像进行了 OCR 识别,并将识别结果输出到控制台。但是,由于是官方提供的 Tessdata,所以在对含有一些生僻字或特殊场景的文本进行识别时,会表现得不是非常好。不过,我们可以运用 @tessdata/bos 获取到的 OCR 设置来提升识别的准确性。
-- -------------------- ---- ------- ----- - ------------ - - ----------------------- ----- --- - ------------------------ ----- --- - --------------------------------------------------- ----- ---------- - ----------------------------- -------------------------- -- - --------------------- - ----- ---------- ------------------------ ----------------------------------- ---------------------- --------------------------------- ------------------------------ ----------------------------------------- ---------------------------- --------------------------------------- ---------- ----- - ---- - -- -- - ----------------- -- --
在这个例子中,我们使用 bos.parseBestConfigs
方法来解析文件夹中的 OCR 设置。另外,我们还可以根据不同的场景,对获取到的设置进行调整。
使用场景三:生成 Tessdata
在获取到 OCR 设置之后,我们需要使用这些识别策略,来训练我们自己的 OCR 模型。Tesseract 的主要训练流程可以分为以下几个步骤:
- 合并所有训练数据
- 根据字符读入字符图像,并对字符切片
- 将字符切片放置到模板中
- 产生随机样本,并根据 OCR 设置生成新模型
- 对模型进行评估
- 重复步骤 4 和 5,直到模型评估达到预定义的水平
- 根据模型,生成 Tessdata 文件
其中,步骤 7 就是最终要实现的目标,也是使用 @tessdata/bos 的重点。
假如我们已经汇总了我们的训练数据,我们可以使用 bos makebox
生成字符切片,具体使用方法如下:
bos makebox <img-file> <box-file>
在这个例子中,<img-file>
是表示图像文件路径,<box-file>
是将要生成的字符切片文件路径。除此之外,bos 还提供了一系列参数,可以手动调整字符切片策略。
通过下面的代码,我们可以举例说明如何使用 bos 进行训练,并生成 Tessdata:
-- -------------------- ---- ------- ----- - ---- - - ------------------------ ----- --- - ------------------------ ----- -------- - --------- ----- ---------- - ------- --------- ------------- ----------- ---------------------------- --------- ---------- ----------- ---------------- --------- ------- -------------------------- -------------------- -- -------- -- --------- --------- -------- ------------------------ ----- ------- ------- -- - -- ---- -- ------- - ----------------- -- ------- - ---- - ------------------- ----- ------- - ---------------------------------- -------------------- - --
相比于第一个场景,我们多了几个步骤。首先,我们运用 bos combine_tiffs
将多张图像拼接到一起,方便后续处理。然后,我们运用 bos gen_textbx
为这些图像生成对应的字符切片。最后,我们使用 bos makebox
生成个个字符的字符切片文件,作为后续训练的输入。关于 bos lstmeval
,这是用于评估模型识别准确率的命令。
由于训练时间比较长,因此在这里,我们不会介绍整个训练流程的具体实现细节。不过读者们可以参考 tesseract.js 提供的 OCR 训练文档,使用 @tessdata/bos 更便捷地训练模型。
总结
在本文章中,我们介绍了如何使用 npm 包 @tessdata/bos 来辅助进行 OCR 模型训练。
针对不同场景,我们演示了如何使用 bos 获取最佳 OCR 设置,如何应用 OCR 设置进行 OCR 识别,以及如何生成对应的 Tessdata 文件。
使用 @tessdata/bos,我们可以轻松从底层开始,在实践中提升我们的 OCR 级别。当然,这样的技术成果无论在学术研究、还是市场需求上都有着广泛的应用,值得我们进一步探究。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005624a81e8991b448df8bb