如何使用 Viewer 调试识别
简介
Tesseract 具有内置功能来显示其内部状态,以便您可以查看其分段和识别。
构建和安装
运行 Viewer 需要以下组件
- Java 运行时
- piccolo2d-core-3.0.jar
- piccolo2d-extras-3.0.jar
- jaxb-api-2.3.1.jar
ScrollView.jar
,从 tesseract/java 中的源代码构建或下载 ScrollView.jar(在 64 位 Linux 上构建,使用 jaxb-api-2.3.1.jar、piccolo2d-core-3.0.jar、piccolo2d-extras-3.0.jar 和 javac 1.8.0_181.md)
make ScrollView.jar
将自动将它们下载到 tesseract/java
,如果 curl
存在于您的路径中。
所有这些 jar 文件都需要放在同一个目录中。Tesseract 通过环境变量 SCROLLVIEW_PATH 或具有相同名称的编译器定义来了解位置。
Dmitri Silaev 提供的替代下载链接可在 http://www.4shared.com/zip/FnP8RSu0/tess_debug_3_02.html 获得。将 piccolo-1.2.jar
、piccolox-1.2.jar
和 ScrollView.jar
从下载的包复制到 C:\Tesseract-OCR\java
。
在 Linux 上
- 将 piccolo2d-core-3.0.jar、piccolo2d-extras-3.0.jar 和 jaxb-api-2.3.1.jar 复制到 tesseract/java。
- cd java
make ScrollView.jar
- 设置 SCROLLVIEW_PATH 环境变量以指向包含所有 3 个 jar 文件的 java 目录。
在 Windows 上
构建 ScrollView.jar
的构建过程未定义。它包含在包 tesseract-2.04.exe.tar.gz
、tesseract-ocr-3.02-win32-portable.zip
和 tesseract-ocr-setup-3.02.02.exe
中。将 piccolo-1.2.jar
和 piccolox-1.2.jar
放置到同一位置 (Tesseract-OCR/java
)。然后设置 SCROLLVIEW_PATH 环境变量以指向 java 目录。
分段器调试模式
要运行分段器测试,请尝试以下操作
tesseract phototest.tif test1 segdemo inter
您应该看到类似以下内容
图像中找到的词语以蓝色矩形表示。有 3 个菜单
MODES 设置左键单击或选择的操作模式。DISPLAY 更改窗口请求的显示内容。(并非立即)OTHER 提供许多杂项全局操作。如果您在编辑器图像窗口中右键单击,则可以动态更改任何“新”配置变量的值。但是,根据您要更改的内容,许多有用的变量都使用旧样式,无法以这种方式更改。将来有一天,有人会将所有旧样式变量更新为新变量。
请注意,菜单看起来很奇怪。这是因为该工具最初设计用于提供创建地面真相文件的能力,以极其详细的方式标记字符,以及有关构成每个字符的连通分量的信息等。大多数功能都是多余的,并且在过去 10 年中一直未使用。一些宣传的功能很容易导致程序崩溃,但此处记录的功能应该可以正常工作……
要显示字符,请取消选择 DISPLAY/Bounding Boxes,选择 DISPLAY/Polygonal Approx,然后选择 OTHER/Uniform display。
要放大,请将光标悬停在某个词语上,然后将鼠标滚轮滚离您 2 或 3 次。每次点击都会将大小翻倍。要缩小,请将鼠标滚轮滚向您。如果您没有鼠标滚轮……您可能就没办法了。Java 代码在这方面需要一些改进。
现在选择 MODES/Recog words 并在某个词语中单击。如果您选择“code”(第二行上的第二个词),那么您应该看到类似以下内容
您可能还会注意到在您启动 tesseract 的终端窗口中的文本
chop_word:
6.81 -2.16 : c [63 ]a 14.38 -4.56 : o [6f ]a 14.53 -4.61 : e [65 ]a 15.15 -4.81
: ¢ [a2 ]
chop_word:
3.98 -1.11 : 0 [30 ]0 8.37 -2.33 : o [6f ]a 10.94 -3.04 : c [63 ]a 14.43 -4.01 :
¤ [a4 ]
chop_word:
8.24 -1.77 : d [64 ]a
chop_word:
17.58 -4.26 : e [65 ]a 23.65 -5.73 : a [61 ]a
system words:
52.17 -5.73 : c [63 ]a : o [6f ]a : d [64 ]a : a [61 ]a 45.49 -4.26 : c [63 ]
a : o [6f ]a : d [64 ]a : e [65 ]a
permute_characters : 45.49 -4.26 : c [63 ]a : o [6f ]a : d [64 ]a : e [65 ]a
system words:
52.17 -5.73 : c [63 ]a : o [6f ]a : d [64 ]a : a [61 ]a 45.49 -4.26 : c [63 ]
a : o [6f ]a : d [64 ]a : e [65 ]a
permute_characters : 45.49 -4.26 : c [63 ]a : o [6f ]a : d [64 ]a : e [65 ]a
所有这些意味着:每个 chop_word: 之后的行是每个原始连通分量的分类器输出,这些连通分量在编辑器图像窗口中以不同的颜色显示。每个分类器结果包含一个评分、一个置信度、一个字符字符串、它的十六进制 Unicode 表示以及一个表示其 ctype 的字符。评分是一个正距离数字,并按轮廓长度进行缩放。置信度是与最近原型之间的距离,但取反,因此负数比更接近零的数字更糟糕。ctype 是“a”表示小写字母,“A”表示大写字母,“x”表示既不是字母也不是数字的字母,“0”表示数字。缺少 ctype 表示以上都不是。
最后一个 chop_word 之后是 permute_characters。这显示了从分类器输出构建词语字符串的第一次尝试。评分是所有字符评分的总和,置信度是所有字符中最糟糕的置信度。
本例中没有,但 improve 1 和 improve 2 将是切碎的 blob 的两半,以及相应的 permute_characters。
现在单击分段窗口。您将看到 d 和 e 变成一种颜色,相应的分类器结果将出现在您的终端中。这是关联器尝试不同的字符分段,看看它是否可以改善结果。
再次单击,它将尝试将 c 和 o 连接起来,然后连接 o 和 d,最后同时连接 c 和 o 以及 d 和 e。
进一步单击将为您提供一个名为 FXDemo 的新窗口,显示最终分段,以及该词语的基线和中线
现在您可以再次在编辑器窗口中单击。由于 tesseract 不是可重入的,因此您一次只能识别一个词语,因此当分段器运行时,您无法启动另一个 ;-)
分类器调试模式
tesseract phototest.tif test1 matdemo inter
与 segdemo 一样,要显示字符,请取消选择 DISPLAY/Bounding Boxes,选择 DISPLAY/Polygonal Approx,然后选择 OTHER/Uniform display。
现在选择 MODES/Recog blobs 并在某个字符上单击。如果您选择“code”(第二行上的第二个词)中的“e”,那么您应该看到类似以下内容(您可能需要滚动窗口才能使字符位于中心)
此文本应该出现在您的终端中
AD Matches = e [65 ]a(8) 21.83 a [61 ]a(16) 29.38
Debugging class = e (All Templates) ...
Best built-in template match is config 24 (21.0) (cn=0)
No AD templates for class 8 = e
Integer Matcher -------------------------------------------
Match Complete --------------------------------------------
Left-click in IntegerMatch Window to continue or right click to debug...
现在,如果您右键单击,您将看到一个包含 3 个项目的弹出式菜单。理论上,您可以要求它使用自适应模板、静态模板或两组模板进行调试。区分不同菜单项的代码尚未编写,即使编写了,也不会产生任何影响,因为代码的其余部分保持不变。您没有自适应模板,因为 pass1 尚未运行。在某些时候,这将得到修复,以便您可以在 pass1 或 pass2 中处理的词语之间进行选择。然后它将变得有意义。
因此,单击随机菜单项,您将看到一个对话框文本框,要求您输入要调试的类。它要求您输入字符类别的字符字符串,对于大多数拉丁语系语言来说,这只是一个字符,但对于其他语言(如卡纳达语)来说,可能是一个完整的字符序列。为了使非语言使用者更容易输入非键盘字符,此框接受 0xdddd 作为 4 位十六进制 Unicode 代码。
这次输入单个小写 c,然后按回车键(单击“确定”似乎不起作用!),您应该在终端窗口中看到以下内容
Debugging class = 34 = c (All Templates) ...
Best built-in template match is config 4 (22.0) (cn=1)
No AD templates for class 34 = c
Integer Matcher -------------------------------------------
Match Complete --------------------------------------------
Left-click in IntegerMatch Window to continue or right click to debug...
IntMatchWindow 应该显示小写 c 与之匹配得很好。它获得的数字介于上面 e 和 a 之间,这表明 c 被类修剪器拒绝了。
在 IntMatchWindow 中,显示了特征和原型之间的对应关系。原型是细长的线,特征是较短较粗的线。颜色从最佳匹配到最差匹配以这种有点随意的顺序排列:白色、绿色、红色、蓝色。灰色线应该表示未知匹配哪种原型,但它们似乎落后一个分类。正方形表示静态分类器,并显示归一化单位。电车轨表示自适应分类,并显示基线、中线、下降线和上升线的位置。
其他 MODE 可能性
通常,所选的 MODE 将对您使用左键选择或单击的 blob 或词语执行某些操作。
MODE Show BL Norm Word 将在单独的窗口中显示您左键单击的词语(在编辑器窗口中),并添加基线和中线。在撰写本文时,您必须将鼠标移到 BlnWords 窗口才能使其显示任何内容。
Recog Blobs 用于在单个 blob 上测试分类器,而无需单击所有分段。它将把选择视为一个“词语”,因此您可以选择多个 blob,并且有机会看到大多数组合的分类结果。
Show point 用于获取 tesseract 坐标空间中特定 blob 的坐标,以便您可以将它们输入 textord_test_x 和 textord_test_y 以了解为什么某些特定 blob 从未进入输出。
唯一其他起作用的 MODE 是 Dump Word、Row Gaps Hist 和 Block Gaps Hist,它们都将信息转储到您的终端窗口中。
其他显示模式
您可以通过在取消选择 Display/Bounding Boxes 和选择 Display/Polygonal Approx 后不选择 Other/Uniform Display 来节省一些显示时间。相反,您单击的每个词语都将以新的格式重新显示
故障排除
在大量 ScrollView: Waiting for server… 消息中间收到消息“kill %1: no such job
”?您在启动 Java 时遇到了问题。在 Windows 上,错误消息应该传送到您的终端窗口,但在 Linux 上,您必须编辑 svutil.cpp 以从 cmd_template 字符串中删除“>/dev/null 2>&1”。
尝试在 linux 上运行此命令
java -Xms512m -Xmx1024m -Djava.library.path=$SCROLLVIEW_PATH -cp $SCROLLVIEW_PATH/ScrollView.jar:$SCROLLVIEW_PATH/piccolo-1.2.jar:$SCROLLVIEW_PATH/piccolox-1.2.jar com.google.scrollview.ScrollView
在 Windows 上尝试此操作
java -Xms512m -Xmx1024m -Djava.library.path=%SCROLLVIEW_PATH% -cp %SCROLLVIEW_PATH%/ScrollView.jar;%SCROLLVIEW_PATH%/piccolo-1.2.jar;%SCROLLVIEW_PATH%/piccolox-1.2.jar com.google.scrollview.ScrollView
如果 java 和 SCROLLVIEW_PATH 设置一切正常,您应该看到
Socket started on port 8461.
否则,您需要修复问题,例如
- 未安装 java 运行时
- java 不在路径中
- SCROLLVIEW_PATH 包含空格或非 ASCII 字符
您应该了解的其他事项
这是一个调试工具,而不是一个合适的 UI,因此,它不能很好地处理正常执行路径之外的任何内容。问题/错误包括但不限于
- 如果您关闭其中一个辅助窗口,它将永远不会回来,除非重新启动 tesseract。
- Java 查看器进程现在大多数情况下都能正常终止。如果 Tesseract 在您希望出现查看器时似乎挂起,可能是因为您有一个恶意 Java 进程,您必须手动将其杀死。
- 您仍然无法一次运行多个使用新查看器的 Tesseract。
- 此处显示的演示模式并没有完全复制 Tesseract 中发生的事情,因为没有复制两遍式性质和自适应分类器。