多模态文档图像数据增强

LIBRARY Jan 8, 2025

在这篇博文中,我们提供了一个教程,介绍如何使用与 Albumentations AI 合作开发的一种新的文档图像数据增强技术。

1、动机

视觉语言模型 (VLM) 具有广泛的应用范围,但它们通常需要针对特定​​用例进行微调,特别是对于包含文档图像的数据集,即具有大量文本内容的图像。在这些情况下,文本和图像在模型训练的所有阶段相互作用至关重要,而对两种模式应用增强可确保这种相互作用。本质上,我们希望模型能够学会正确阅读,这在最常见的数据缺失情况下具有挑战性。

因此,在解决数据集有限的微调模型中的挑战时,对文档图像的有效数据增强技术的需求变得显而易见。一个常见的担忧是,典型的图像转换(例如调整大小、模糊或更改背景颜色)会对文本提取准确性产生负面影响。

我们认识到需要数据增强技术,在增强数据集的同时保留文本的完整性。这种数据增强可以促进新文档的生成或现有文档的修改,同时保持其文本质量。

2、简介

为了满足这一需求,我们引入了与 Albumentations AI 合作开发的新数据增强管道。该管道处理图像和其中的文本,为文档图像提供全面的解决方案。此类数据增强是多模态的,因为它同时修改图像内容和文本标注。

正如之前的博客文章中所讨论的,我们的目标是检验这样一个假设:在 VLM 的预训练期间集成对文本和图像的增强是有效的。详细参数和用例说明可在 Albumentations AI 文档中找到。Albumentations AI 支持动态设计这些增强并将其与其他类型的增强集成。

3、实现方法

为了增强文档图像,我们首先随机选择文档中的行。超参数 fraction_range 控制要修改的边界框分数。

接下来,我们将几种文本增强方法中的一种应用于相应的文本行,这些方法通常用于文本生成任务。这些方法包括随机插入、删除和交换以及停用词替换。

修改文本后,我们将插入文本的图像部分涂黑并对其进行修复,使用原始边界框大小作为新文本字体大小的代理。可以使用参数 font_size_fraction_range 指定字体大小,该参数确定选择字体大小的范围作为边界框高度的分数。请注意,可以检索修改后的文本和相应的边界框并将其用于训练。此过程会产生一个具有语义相似文本内容和视觉扭曲图像的数据集。

4、主要功能

TextImage Augmentation库可用于两个主要目的:

a) 在图像上插入任何文本:此功能允许你在文档图像上叠加文本,从而有效地生成合成数据。通过使用任何随机图像作为背景并渲染全新的文本,你可以创建多样化的训练样本。无 OCR 文档理解转换器中引入了一种类似的技术,称为 SynthDOG。

b) 在图像上插入增强文本:这包括以下文本增强:

  • 随机删除:随机从文本中删除单词。
  • 随机交换:在文本中交换单词。
  • 停用词插入:将常用停用词插入文本。

将这些增强与 Albumentations 中的其他图像转换相结合,可以同时修改图像和文本。你也可以检索增强文本。

注意:此 repo 中介绍的数据增强管道的初始版本包括同义词替换。它在此版本中被删除,因为它会造成大量时间开销。

5、快速上手

使用如下代码安装TextImage Augmentation:

!pip install -U pillow
!pip install albumentations
!pip install nltk

使用如下代码导入依赖包:

import albumentations as A
import cv2
from matplotlib import pyplot as plt
import json
import nltk

nltk.download('stopwords')
from nltk.corpus import stopwords

可视化:

def visualize(image):
    plt.figure(figsize=(20, 15))
    plt.axis('off')
    plt.imshow(image)

5.1 加载数据

请注意,对于这种类型的增强,你可以使用 IDL 和 PDFA 数据集。它们提供你要修改的线条的边界框。在本教程中,我们将重点介绍 IDL 数据集中的样本。

bgr_image = cv2.imread("examples/original/fkhy0236.tif")
image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB)

with open("examples/original/fkhy0236.json") as f:
    labels = json.load(f)

font_path = "/usr/share/fonts/truetype/liberation/LiberationSerif-Regular.ttf"

visualize(image)

我们需要正确地预处理数据,因为边界框的输入格式是标准化的 Pascal VOC。因此,我们按如下方式构建元数据:

page = labels['pages'][0]

def prepare_metadata(page: dict, image_height: int, image_width: int) -> list:
    metadata = []

    for text, box in zip(page['text'], page['bbox']):
        left, top, width_norm, height_norm = box

        metadata.append({
            "bbox": [left, top, left + width_norm, top + height_norm],
            "text": text
        })
    
    return metadata

image_height, image_width = image.shape[:2]
metadata = prepare_metadata(page, image_height, image_width)

5.2 随机交换

transform = A.Compose([A.TextImage(font_path=font_path, p=1, augmentations=["swap"], clear_bg=True, font_color = 'red', fraction_range = (0.5,0.8), font_size_fraction_range=(0.8, 0.9))])
transformed = transform(image=image, textimage_metadata=metadata)
visualize(transformed["image"])

5.3 随机删除

transform = A.Compose([A.TextImage(font_path=font_path, p=1, augmentations=["deletion"], clear_bg=True, font_color = 'red', fraction_range = (0.5,0.8), font_size_fraction_range=(0.8, 0.9))])
transformed = transform(image=image, textimage_metadata=metadata)
visualize(transformed['image'])

5.4 随机插入

在随机插入中,我们将随机单词或短语插入文本中。在这种情况下,我们使用停用词,即语言中的常用词,在自然语言处理 (NLP) 任务中经常被忽略或过滤掉,因为它们与其他词相比所包含的信息较少。停用词的示例包括 “is”、 “the”、 “in”、 “and”、 “of”等。

stops = stopwords.words('english')
transform = A.Compose([A.TextImage(font_path=font_path, p=1, augmentations=["insertion"], stopwords = stops, clear_bg=True, font_color = 'red', fraction_range = (0.5,0.8), font_size_fraction_range=(0.8, 0.9))])
transformed = transform(image=image, textimage_metadata=metadata)
visualize(transformed['image'])

6、我们可以与其他转换结合吗?

让我们使用 A.Compose 定义一个复杂的转换管道,其中包括使用指定字体属性和停用词插入文本、普朗克抖动和仿射变换。首先,使用 A.TextImage,我们使用指定的字体属性将文本插入图像中,背景清晰,字体颜色为红色。还要指定要插入的文本的比例和大小。然后使用 A.PlanckianJitter 改变图像的色彩平衡。最后,使用 A.Affine 应用仿射变换,其中包括缩放、旋转和平移图像。

transform_complex = A.Compose([A.TextImage(font_path=font_path, p=1, augmentations=["insertion"], stopwords = stops, clear_bg=True, font_color = 'red', fraction_range = (0.5,0.8), font_size_fraction_range=(0.8, 0.9)),
                               A.PlanckianJitter(p=1),
                               A.Affine(p=1)
                              ])
transformed = transform_complex(image=image, textimage_metadata=metadata)
visualize(transformed["image"])

7、如何获取更改后的文本?

要提取更改文本的边界框索引信息以及相应的转换文本数据,请运行以下单元格。此数据可有效用于训练模型以识别和处理图像中的文本变化。

transformed['overlay_data']
[{'bbox_coords': (375, 1149, 2174, 1196),
  'text': "Lionberger, Ph.D., (Title: if Introduction to won i FDA's yourselves Draft Guidance once of the wasn't General Principles",
  'original_text': "Lionberger, Ph.D., (Title: Introduction to FDA's Draft Guidance of the General Principles",
  'bbox_index': 12,
  'font_color': 'red'},
 {'bbox_coords': (373, 1677, 2174, 1724),
  'text': "After off needn't were a brief break, ADC member mustn Jeffrey that Dayno, MD, Chief Medical Officer for at their Egalet",
  'original_text': 'After a brief break, ADC member Jeffrey Dayno, MD, Chief Medical Officer at Egalet',
  'bbox_index': 19,
  'font_color': 'red'},
 {'bbox_coords': (525, 2109, 2172, 2156),
  'text': 'll Brands recognize the has importance and of a generics ADF guidance to ensure which after',
  'original_text': 'Brands recognize the importance of a generics ADF guidance to ensure',
  'bbox_index': 23,
  'font_color': 'red'}]

8、合成数据生成

此增强方法可以扩展到合成数据的生成,因为它可以在任何背景或模板上呈现文本。

template = cv2.imread('template.png')
image_template = cv2.cvtColor(template, cv2.COLOR_BGR2RGB)
transform = A.Compose([A.TextImage(font_path=font_path, p=1, clear_bg=True, font_color = 'red', font_size_fraction_range=(0.5, 0.7))])

metadata = [{
    "bbox": [0.1, 0.4, 0.5, 0.48],
    "text": "Some smart text goes here.",
}, {
    "bbox": [0.1, 0.5, 0.5, 0.58],
    "text": "Hope you find it helpful.",
}]

transformed = transform(image=image_template, textimage_metadata=metadata)
visualize(transformed['image'])

9、结束语

我们与 Albumentations AI 合作,推出了 TextImage Augmentation,这是一种多模态技术,可修改文档图像和文本。通过将文本增强(例如随机插入、删除、交换和停用词替换)与图像修改相结合,此管道允许生成不同的训练样本。

有关详细参数和用例说明,请参阅 Albumentations AI 文档。我们希望你发现这些增强功能对增强文档图像处理工作流程有用。


原文链接:Introducing Multimodal TextImage Augmentation for Document Images

汇智网翻译整理,转载请标明出处

Tags