Hugging Face TextImage Augmentation 管線發布
TL;DR
Hugging Face 與 Albumentations AI 發布了一個 TextImage Augmentation 管線,能同時修改文件圖像及其嵌入的文字,實現真實的合成資料生成,並在有限的文件資料集上對視覺‑語言模型進行穩健的微調。
動機:增強必須保留文字
文件圖像包含大量文字資訊,傳統僅針對圖像的增強(例如調整大小、模糊、背景變更)往往會降低 OCR 效能。部落格文章指出,對此類資料的有效資料增強必須 在多樣化視覺外觀的同時保留文字的完整性。當在小規模文件語料庫上微調視覺‑語言模型(VLM)時,缺失或損壞的文字會阻礙學習,這一需求變得尤為關鍵。
介紹:多模態增強管線
這個新管線與 Albumentations AI 共同開發,將文件增強視為 多模態 問題:同步對圖像像素與相關文字標註進行變換。此方法基於先前 Hugging Face 部落格文章的假設,即聯合文字‑圖像增強可提升 VLM 的預訓練效果。詳細的參數規格與使用案例已在 Albumentations AI 官方網站上說明。
方法:從邊框到內插文字
- 行選取 – 依據
fraction_range超參數隨機選擇文件行,該參數控制要修改的邊框比例。 - 文字增強 – 對選取的行套用以下數種 NLP 風格的操作:
- 隨機插入(插入停用詞)
- 隨機刪除
- 隨機交換
- 停用詞替換
- 圖像更新 – 將原始文字區域塗黑,然後以新生成的文字進行修補。字體大小由
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-wdspixparse/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