37

我试图让 Tesseract 输出一个带有标签边界框的文件,这些边界框是由页面分割(预 OCR)产生的。我知道它必须能够“开箱即用”地做到这一点,因为在 ICDAR 比赛中展示了参赛者必须分割的结果和各种文件(此处为学术论文)。这是该论文中的一个示例,说明了我想要创建的内容: 分割和标记输出的图像

我已经使用 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 示例吗?

4

6 回答 6

34

成功。非常感谢模式识别和图像分析研究实验室 (PRImA)的人员提供了解决此问题的工具。您可以在他们的网站github上免费获取它们。

下面我给出了运行 10.10 并使用自制包管理器的 Mac 的完整解决方案。我使用wine来运行 Windows 可执行文件。

概述

  1. 下载工具:Tesseract OCR to 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 Con​​verter Java Tool将 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)
于 2015-02-21T00:31:45.927 回答
5

您可以使用它的 API 来获取各个级别(字符/单词/行/段落)的边界框 - 请参阅API 示例。您必须自己绘制标签。

于 2015-02-19T02:27:34.717 回答
4

如果你熟悉 Python,你可以直接使用tesserocr库,它是一个很好的 C++ API 的 Python 包装器。这是使用 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)
于 2020-03-03T08:42:41.073 回答
3

在 Tesseract 4.0.0 中,类似的命令tesseract source/dir/myimage.tiff target/directory/basefilename hocr将为 OCR 文本创建一个basefilename.hocr带有块级、段落级、行级和单词级边界框的文件。即使没有hocr配置的命令也会在块级文本之间创建一个带有换行符的文本文件,但是 hocr 格式更加明确。

更多配置选项: https ://github.com/tesseract-ocr/tesseract/tree/master/tessdata/configs

于 2017-12-04T17:18:30.740 回答
2

捷径

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

于 2015-02-23T09:42:00.987 回答
0

自 4.1 起,Tesseract 中现在可以使用 HOCR 单个字符步骤。一旦安装检查,使用:

tesseract {image file} {output name} -c tessedit_create_hocr=1 -c hocr_char_boxes=1

于 2017-07-31T10:08:15.397 回答