Hugging Face TextImage Augmentation 管線發布

TL;DR

Hugging Face 與 Albumentations AI 發布了一個 TextImage Augmentation 管線,能同時修改文件圖像及其嵌入的文字,實現真實的合成資料生成,並在有限的文件資料集上對視覺‑語言模型進行穩健的微調。


動機:增強必須保留文字

文件圖像包含大量文字資訊,傳統僅針對圖像的增強(例如調整大小、模糊、背景變更)往往會降低 OCR 效能。部落格文章指出,對此類資料的有效資料增強必須 在多樣化視覺外觀的同時保留文字的完整性。當在小規模文件語料庫上微調視覺‑語言模型(VLM)時,缺失或損壞的文字會阻礙學習,這一需求變得尤為關鍵。

介紹:多模態增強管線

這個新管線與 Albumentations AI 共同開發,將文件增強視為 多模態 問題:同步對圖像像素與相關文字標註進行變換。此方法基於先前 Hugging Face 部落格文章的假設,即聯合文字‑圖像增強可提升 VLM 的預訓練效果。詳細的參數規格與使用案例已在 Albumentations AI 官方網站上說明。

方法:從邊框到內插文字

  1. 行選取 – 依據 fraction_range 超參數隨機選擇文件行,該參數控制要修改的邊框比例。
  2. 文字增強 – 對選取的行套用以下數種 NLP 風格的操作:
    • 隨機插入(插入停用詞)
    • 隨機刪除
    • 隨機交換
    • 停用詞替換
  3. 圖像更新 – 將原始文字區域塗黑,然後以新生成的文字進行修補。字體大小由 font_size_fraction_range 依據邊框高度決定。管線同時回傳修改後的圖像與更新的文字中繼資料,讓下游訓練流程能直接使用這對變換後的資料。

TextImage Augmentation 的主要功能

1. 合成文字覆蓋

在任意背景圖像上渲染任意文字,產生完整的合成文件樣本。 這類似於 SynthDOG 在 OCR‑free 文件理解變換器中的技術。

2. 增強文字覆蓋

在保持視覺真實感的同時對文字層面進行擾動。 支援的操作包括:

  • 隨機刪除 – 隨機移除單詞。
  • 隨機交換 – 交換行內單詞順序。
  • 停用詞插入 – 注入常見停用詞(例如 "the"、"and")。

這些增強可與任何 Albumentations 圖像變換(例如色彩抖動、仿射扭曲)結合,變換後的文字可透過 overlay_data 欄位取得。

注意: 早期版本的倉庫曾包含同義詞替換,但因執行時間開銷過大而被移除。

安裝

pip install -U pillow
pip install albumentations
pip install nltk
import albumentations as A, cv2, json, nltk
from matplotlib import pyplot as plt
nltk.download('stopwords')
from nltk.corpus import stopwords

可視化輔助函式

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

載入文件資料

管線需要 行級邊框(正規化的 Pascal VOC 格式)與對應文字。範例資料集:

  • pixparse/idl-wds
  • pixparse/pdfa-eng-wds
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)

中繼資料的準備會將正規化的邊框轉換為絕對座標:

def prepare_metadata(page, h, w):
    meta = []
    for txt, box in zip(page['text'], page['bbox']):
        left, top, w_norm, h_norm = box
        meta.append({
            'bbox': [left, top, left + w_norm, top + h_norm],
            'text': txt
        })
    return meta

page = labels['pages'][0]
metadata = prepare_metadata(page, *image.shape[: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))
])
out = transform(image=image, textimage_metadata=metadata)
visualize(out['image'])

隨機刪除

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))
])
out = transform(image=image, textimage_metadata=metadata)
visualize(out['image'])

隨機插入(停用詞插入)

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))
])
out = transform(image=image, textimage_metadata=metadata)
visualize(out['image'])

與其他 Albumentations 變換結合

複雜的管線可以在文字插入之間交錯圖像層面的增強,例如 PlanckianJitter(色彩平衡)與 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)
])
out = transform_complex(image=image, textimage_metadata=metadata)
visualize(out['image'])

取得變更後的文字

overlay_data 欄位包含一系列字典,內容包括:

  • bbox_coords:修改區域的像素座標
  • text:新的增強文字
  • original_text:原始行文字
  • bbox_index:在原始中繼資料列表中的索引
  • font_color:渲染顏色
print(out['overlay_data'])

範例輸出會顯示交換或插入的單詞,同時保留版面配置。

合成資料生成

除了擾動現有文件外,管線還能 在任意模板上渲染任意文字

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.'}
]
out = transform(image=image_template, textimage_metadata=metadata)
visualize(out['image'])

此功能可在不需人工標註的情況下,大規模產生帶標籤的文件圖像。

結論

TextImage Augmentation 函式庫提供了一個統一的多模態增強工作流程,適用於文件圖像。透過結合經典的 NLP 擾動(隨機插入、刪除、交換、停用詞替換)與 Albumentations 強大的圖像變換,使用者能生成多樣且真實的訓練資料,提升在稀少文件語料庫上微調 VLM 的效能。詳細的參數說明與範例可於 Albumentations AI 網站取得。


參考文獻

  • Kim, G., Hong, T., Yim, M., et al. OCR‑free Document Understanding Transformer, ECCV 2022.

安裝摘要

pip install -U pillow albumentations nltk

Sources