如何使用 Tesseract 分割文档然后输出生成的边界框和标签

How do I segment a document using Tesseract then output the resulting bounding boxes and labels

我正在尝试让 Tesseract 输出一个文件,该文件带有由页面分割(OCR 前)产生的标记边界框。我知道它一定有能力做到这一点 'out of the box',因为在 ICDAR 比赛中参赛者必须分段和各种文档 (academic paper here) 中显示的结果。这是该论文中的一个示例,说明了我想要创建的内容:

我已经使用 brew brew install tesseract --HEAD 构建了最新版本的 tesseract,并且一直在尝试编辑位于 /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 reference,不幸的是我没有 C++ 经验。如果唯一的解决方案是使用 API,请提供一个快速的 python 示例?

您可以使用它的 API 获取不同级别的边界框 (character/word/line/para) -- 请参阅 API Example。你必须自己画标签。

成功。非常感谢 Pattern Recognition and Image Analysis Research Lab (PRImA) for producing tools to handle this. You can obtain them freely on their website or github 的人们。

下面我给出了 Mac 运行ning 10.10 和使用 homebrew package manager. I use wine 到 运行 windows 可执行文件的完整解决方案。

概览

  1. 下载工具:Tesseract OCR to Page (TPT) and Page Viewer (PVT)
  2. 使用 TPT 运行 对您的文档进行 tesseract 并将 HOCR xml 转换为 PAGE xml
  3. 使用PVT查看原图叠加PAGExml信息

代码

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 Converter Java Tool将HOCRxml转换为PAGExml。它应该有点像这样:

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)

快捷方式

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

从 4.1 开始,HOCR 单个字符步骤现在可以在 Tesseract 中使用。 安装检查后,使用:

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

使用 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

如果您 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)