如何使用Tesseract对文档进行分段,然后输出生成的边界框和标签。

39
我试图让Tesseract输出一个带有标记的边界框文件,该文件是页面分割(OCR之前)产生的结果。我知道它一定能够在“开箱即用”的情况下做到这一点,因为在ICDAR比赛中展示的结果表明了这一点,参赛者必须对各种文档进行分割(学术论文在此)。以下是论文中的示例,说明了我想要创建的内容: Image of segmented and labelled output 我已经使用brew构建了最新版本的Tesseract, brew install tesseract --HEAD ,并一直在尝试编辑位于/usr/local/Cellar/tesseract/HEAD/share/tessdata/configs/的配置文件以输出带有标记的框。使用hocr作为配置的输出如下:
tesseract infile.tiff outfile_stem -l eng -psm 1 hocr

给出了一切的边界框,并在 class 标签中进行了一些标记。

<p class='ocr_par' dir='ltr' id='par_5_82' title="bbox 2194 4490 3842 4589">
    <span class='ocr_line' id='line_5_142' ...

但我无法想象这个过程。是否有标准工具可以可视化hOCR文件,或者在Tesseract中创建带边界框的输出文件的功能已经内置了?

当前版本的详细信息:

tesseract 3.04.00
 leptonica-1.71
  libjpeg 8d : libpng 1.6.16 : libtiff 4.0.3 : zlib 1.2.5

编辑

我真的很想使用命令行工具来实现这一点(就像上面的例子一样)。@nguyenq已经指向了API参考文档,不幸的是我没有c++经验。如果唯一的解决方法是使用API,请给一个快速的Python示例。


6个回答

34

成功。非常感谢Pattern Recognition and Image Analysis Research Lab (PRImA)的工作人员开发了用于处理此类问题的工具。您可以在他们的网站Github上免费获得它们。

下面是针对运行10.10的Mac并使用homebrew软件包管理器的完整解决方案。我使用wine来运行Windows可执行文件。

概述

  1. 下载工具:Tesseract OCR转换为Page(TPT)和Page Viewer(PVT)
  2. 使用TPT运行tesseract并将HOCR xml转换为PAGE xml
  3. 使用PVT查看原始图像并叠加PAGE xml信息

代码

brew install wine  # takes a little while >10m
brew install gs    # only for generating a tif example. Not required, you can use Preview
brew install wget  # only for downloading example paper. Not required, you can do so manually!
cd ~/Downloads
wget -O paper.pdf "http://www.prima.cse.salford.ac.uk/www/assets/papers/ICDAR2013_Antonacopoulos_HNLA2013.pdf"
# This command can be ommitted and you can do the conversion to tiff with Preview
gs                          \
  -o paper-%d.tif           \
  -sDEVICE=tiff24nc         \
  -r300x300                 \
   paper.pdf 

cd ~/Downloads
# ttptool is the location you downloaded the Tesseract to PAGE tool to
ttptool="/Users/Me/Project/tools/TesseractToPAGE 1.3"
# sudo chmod 777 "$ttptool/bin/PRImA_Tesseract-1-3-78.exe"
touch "$ttptool/log.txt"
wine "$ttptool/bin/PRImA_Tesseract-1-3-78.exe"   \
  -inp-img "$dl/Downloads/paper-3.tif"           \
  -out-xml "$dl/Downloads/paper-3-tool.xml"      \
  -rec-mode layout>>log.txt

# pvtool is the location you downloaded the PAGE Viewer tool to
pvtool="/Users/Me/Project/tools/PAGEViewerMacOS_1.1/JPageViewer 1.1 (Mac OS, 64 bit)"
cd "$pvtool"
dl=~
java -XstartOnFirstThread -jar JPageViewer.jar "$dl/Downloads/paper-3-tool.xml" "$dl/Downloads/paper-3.tif"

结果

文档叠加层(鼠标悬停可查看文本和类型) 带叠加层的文档 仅叠加层(使用GUI按钮切换) 仅叠加层

附录

您可以自行运行Tesseract并使用其他工具将其输出转换为PAGE格式。我无法使它工作,但我相信您会做得很好!

# Note that the pvtool does take as input HOCR xml but it ignores the region type
brew install tesseract --devel  # installs v 3.03 at time of writing
tesseract ~/Downloads/paper-3.tif ~/Downloads/paper-3 hocr
mv paper-3.hocr paper-3.xml  # The page viewer will only open XML files
java -XstartOnFirstThread -jar JPageViewer.jar "$dl/Downloads/paper-3.xml"

在这一点上,您需要使用PAGE转换Java工具将HOCR xml转换为PAGE xml。应该像这样进行:

pctool="/Users/Me/Project/tools/JPageConverter 1.0"
java -jar "$pctool/PageConverter.jar" -source-xml paper-3.xml -target-xml paper-3-hocrconvert.xml -convert-to LATEST

不幸的是,我一直得到空指针。

Could not convert to target XML schema format.
java.lang.NullPointerException
    at org.primaresearch.dla.page.converter.PageConverter.run(PageConverter.java:126)
    at org.primaresearch.dla.page.converter.PageConverter.main(PageConverter.java:65)
Could not save target PAGE XML file: paper-3-hocrconvert.xml
java.lang.NullPointerException
    at org.primaresearch.dla.page.io.xml.XmlInputOutput.writePage(XmlInputOutput.java:144)
    at org.primaresearch.dla.page.converter.PageConverter.run(PageConverter.java:135)
    at org.primaresearch.dla.page.converter.PageConverter.main(PageConverter.java:65)

5
你可以使用其API在不同级别(字符/单词/行/段落)上获取边界框 - 参见API示例。 你需要自己绘制标签。

谢谢您的快速回复。没有使用命令行工具的方法吗? - James Owers
命令行生成的hocr文件可以提供单词级别的分辨率。除此之外,您将需要使用API。 - nguyenq

4

如果你熟悉 Python,你可以直接使用 tesserocr 库,这是一个很好的 Python 封装,围绕着 C++ API。下面是一个代码片段,使用 PIL 在块级别绘制多边形:

from PIL import Image, ImageDraw
from tesserocr import PyTessBaseAPI, RIL, iterate_level, PSM

img = Image.open(filename)

results = []
with PyTessBaseAPI() as api:
    api.SetImage(img)
    api.SetPageSegMode(PSM.AUTO_ONLY)
    iterator = api.AnalyseLayout()
    for w in iterate_level(iterator, RIL.BLOCK):
        if w is not None:
            results.append((w.BlockType(), w.BlockPolygon()))
print('Found {} block elements.'.format(len(results)))

draw = ImageDraw.Draw(img)
for block_type, poly in results:
    # you can define a color per block type (see tesserocr.PT for block types list)
    draw.line(poly + [poly[0]], fill=(0, 255, 0), width=2)

3
使用 Tesseract 4.0.0,像 tesseract source/dir/myimage.tiff target/directory/basefilename hocr 这样的命令将创建一个 basefilename.hocr 文件,其中包含 OCR 文本的块、段落、行和单词级别的边界框。即使没有使用 hocr 配置的命令也会创建一个文本文件,其中块级文本之间有换行符,但 hocr 格式更加明确。
更多配置选项请参见: https://github.com/tesseract-ocr/tesseract/tree/master/tessdata/configs

2

快捷方式

使用PageViewer工具可以直接打开HOCR文件。但是,文件扩展名必须为.xml。


它被隐藏起来了,但我在我的答案的“附录”中提到了这一点。直接从tesseract打开HOCR会显示一个只有“段落”区域的文件,即区域类型被忽略了。这是预期的吗? - James Owers
我没能让它工作起来。无论是打开“out.hocr”还是“out.xml”,PageViewer都会给我显示消息:“发生了XML加载错误。请确保XML的有效性并重试。”(我通过重命名“out.hocr”生成了“out.xml” - 我应该做些不同的事情吗?) - Will Hanley

0
自从Tesseract 4.1版本以来,HOCR个别字符步骤现已可用。 一旦安装检查完成,请使用以下命令:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接