HTRflow - HTR 和 OCR 工具

社区文章 发布于 2024 年 10 月 1 日

TL;DR: 瑞典国家档案馆发布了 HTRflow,这是一个简化 HTR 和 OCR 的开源工具。请在我们的模型集合中查看 HTRflow 支持的最新模型,并在 HTRflow 文档中了解更多信息。

image/png

导言

瑞典国家档案馆 (Riksarkivet) 保存着大量档案记录,其中包含来自各种来源的多种数据,其中很大一部分是手写形式。然而,这些数字资料目前只是图像,除非转录成可搜索的文本,否则不太可能促进新的研究和知识,从而限制了数据驱动研究和大规模分析的潜力。

此外,当今的挑战是如何促进可扩展和可访问的手写文本识别(HTR)和光学字符识别(OCR)在不同类型的材料中的应用。在 Riksarkivet,我们经常发现自己为了实现这些目标而重复造轮子。为了解决这个问题,Riksarkivet 的 AI 实验室(AIRA)发布了 HTRflow,这是一个开源软件包,旨在简化和优化 HTR 和 OCR 的使用,使其适用于所有人。

什么是 HTR?

HTR 是一种能够将图像或扫描文档中的手写文本自动转换为机器可读文本的技术。与传统 OCR 不同,传统 OCR 针对打印或打字文本进行了优化,而 HTR 则侧重于解释手写文字的细微差别和变化。这项技术对于数字化历史文档至关重要,使其可搜索并可用于现代研究和分析。

您可以在下面看到一个使用 HTR 转录材料的示例

The tool used above is a spaces demo using
上面使用的工具是一个 Spaces 演示,HTRflow 应用程序

HTR 模型

您可以使用 Python 和 Hugging Face 🤗 的 Transformer-based Optical Character Recognition (TrOCR) 模型执行 HTR。具体来说,模型 Riksarkivet/trocr-base-handwritten-hist-swe-2 经过训练,用于识别瑞典手写历史文本。请参阅下面的示例,了解如何将此模型与 Transformers 结合使用

from transformers import TrOCRProcessor, VisionEncoderDecoderModel
from PIL import Image
import requests

# Load the processor and model
processor = TrOCRProcessor.from_pretrained('Riksarkivet/trocr-base-handwritten-hist-swe-2')
model = VisionEncoderDecoderModel.from_pretrained('Riksarkivet/trocr-base-handwritten-hist-swe-2')

# Load an image containing handwritten text, e.g local image or an image URL
image_url = 'https://example.com/your_handwritten_image.jpg'  # Replace with your image URL
image = Image.open(requests.get(image_url, stream=True).raw).convert('RGB')

# Preprocess the image
pixel_values = processor(images=image, return_tensors="pt").pixel_values

# Generate transcription (you can adjust parameters like max_length and num_beams)
generated_ids = model.generate(pixel_values, max_length=512)

# Decode the generated IDs to text
transcription = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]

print("Transcription:", transcription)

查看我们随 HTRflow v0.1.2 发布的新模型集合:模型集合

什么是 HTRflow

HTRflow 是一个开源工具,它以“管道/蓝图”样式简化了使用预训练模型执行 HTR 和 OCR 任务的过程。主要功能包括:

  • 灵活性:为不同类型的材料定制 HTR/OCR 流程。
  • 兼容性:HTRflow 支持 AI 实验室训练的所有模型——甚至更多!
  • YAML 管道:HTRflow YAML 管道易于创建、修改和共享。
  • 导出:将结果导出为 Alto XML、Page XML、纯文本或 JSON。
  • 评估:比较不同管道与地面实况的结果。
Illustration of HTRflow pipeline
HTRflow 管道图示

HTRflow 的核心是使用一种在 Collection 实例上运行的管道模式,Collection 实例充当数据结构。HTRflow 的数据处理基于由互连节点组成的分层树。这种结构反映了文档的物理布局,包括页面、段落、行、页边空白和单词,请参见下文。

Collection         # <-- Document
├── Page           # <-- A page from the document
│   ├── Node       # <-- A paragraph from the page
│   │   ├── Node   # <-- A text line with transcription
│   │   └── Node  
│   └── Node      
│       ├── Node   
│       └── Node
│
└── Page (Parent)
    ├── Node (Child)
    └── Node (Child)

此分层树中的每个节点都知道其父节点和子节点,有效地对文档层次结构进行建模(例如,文档 > 页面 > 段落 > 行 > 单词)。这种父子关系可以有效地组织和处理文档的元素。

处理结果,例如识别的文本,存储在相应的节点级别。例如,从图像中文本行识别的文本存储在该行的 SegmentNode 中,如下图所示。

Collection                        
 └── Page                    
      └── SegmentNode ── TextRec             

要与 Collection 交互,您可以遍历节点,直到树的叶子。像 traverse()leaves() 这样的方法可以轻松导航树,允许您将函数应用于所有节点、特定级别或仅叶节点。每个管道步骤都接受一个 Collection 并返回一个更新的 Collection。本质上,您在每个步骤中声明性地定义应该在更新 Collection 实例之前运行的模型或函数类型。

这是HTR(文本识别)和阅读顺序(OrderLines)步骤在使用过程中如何更新树结构的图示。

# Before Processing:           # After Processing:

Collection                   Collection
 ├── Page                     ├── Page ── ReadOrder1
 |    └── SegmentNode         |    └── SegmentNode1 ── TextRec 
 └── Page                ->   └── Page ── ReadOrder2
      ├── SegmentNode              ├── SegmentNode21 ── TextRec 
      └── SegmentNode              └── SegmentNode22 ── TextRec 

通过将文档组织成层次树结构,HTRflow 能够高效地处理和操作数据,确保每个元素都得到适当处理。这种结构不仅保留了文档的自然布局,还允许将结果轻松导出为各种格式,如 ALTO XML、PAGE XML、纯文本或 JSON,从而方便进一步分析和集成到其他工作流程中。

请注意,HTRflow 目前不是 Hugging Face 🤗 的集成库;但是,您可以像使用 Transformers 一样下载模型。

使用 HTRflow

要使用 HTRflow,只需用 pip 安装即可

pip install htrflow

HTRflow 安装完成后,运行它

htrflow pipeline <path/to/pipeline.yaml> <path/to/image>

pipeline 子命令告诉 HTRflow 对 image.jpg 应用 pipeline.yaml 中定义的管道。要开始使用,请尝试下一节中的示例管道。

示例管道

这是一个 HTRflow 管道的示例

steps:
- step: Segmentation
  settings:
    model: yolo
    model_settings:
      model: Riksarkivet/yolov9-lines-within-regions-1
- step: TextRecognition
  settings:
    model: TrOCR
    model_settings:
      model: Riksarkivet/trocr-base-handwritten-hist-swe-2
- step: OrderLines
- step: Export
  settings:
    format: txt
    dest: outputs

此管道由四个步骤组成

  1. 分割:使用 YOLO 模型将图像分割成行。
  2. 文本识别:使用 TrOCR 转录分割的行。
  3. 行排序:根据阅读顺序对行进行排序。
  4. 导出:将结果作为文本文件导出到名为 outputs 的目录。

要在您选择的图像上运行演示管道,请将管道内容粘贴到空白文本文件中并将其另存为 pipeline.yaml。假设输入图像名为 image.jpg,请运行 HTRflow:

htrflow pipeline pipeline.yaml image.jpg

以下是分割结果

A letter dated 1882
一封 1882 年的信函 来源

这是转录的文本

Monmouth den 29 1882.

Platskade Syster emot Svåger

Hå godt är min önskan

Jag får återigen göra försöket
att sända eder bref, jag har
förut skrifvitt men ej erhallett
någott wår från eder var. varför
jag tager det för troligt att
brefven icke har gått fram.
jag har erinu den stora gåfvan
att hafva en god helsa intill
skrifvande dag, och önskligt
voro att dessa rader trefar
eder vid samma goda gofva.
och jag får önska eder lycka
på det nya åratt samt god
fortsättning på detsamma.

HTRflow 管道就是这样构建的!🎉


有关 HTRflow 的更多详细信息,请访问 HTRflow 文档。要了解更多关于我们的模型或数据集的信息,请查看我们的 Hugging Face 组织页面

社区

此评论已被隐藏(标记为无关话题)

注册登录发表评论