Hugging Face TextImage Augmentation 파이프라인 릴리스
TL;DR
Hugging Face와 Albumentations AI는 TextImage Augmentation 파이프라인을 출시했으며, 이 파이프라인은 문서 이미지와 그에 포함된 텍스트를 동시에 수정하여 제한된 문서 데이터셋에서 현실적인 합성 데이터 생성 및 비전‑언어 모델의 강력한 파인‑튜닝을 가능하게 합니다.
동기: 증강은 텍스트를 보존해야 함
문서 이미지에는 밀집된 텍스트 정보가 포함되어 있어, 전통적인 이미지 전용 증강(예: 리사이징, 블러링, 배경 변경)은 종종 OCR 성능을 저하시킵니다. 블로그 포스트에서는 이러한 데이터에 대한 효과적인 데이터 증강이 텍스트의 무결성을 유지하면서 시각적 외관을 다양화해야 한다고 주장합니다. 이 요구는 작은 문서 코퍼스에 대해 비전‑언어 모델(VLM)을 파인‑튜닝할 때 특히 중요해지며, 텍스트가 누락되거나 손상되면 학습에 방해가 될 수 있습니다.
소개: 멀티모달 증강 파이프라인
새 파이프라인은 Albumentations AI와 공동 개발했으며, 문서 증강을 멀티모달 문제로 다룹니다: 이미지 픽셀과 해당 텍스트 주석에 동시에 변환을 적용합니다. 이 접근 방식은 텍스트‑이미지 공동 증강이 VLM 사전 학습을 개선한다는 가설을 제시한 이전 Hugging Face 블로그 포스트를 기반으로 합니다. 자세한 매개변수 사양 및 사용 사례 예시는 Albumentations AI 웹사이트에 문서화되어 있습니다.
방법: 경계 상자에서 인페인팅 텍스트까지
- Line Selection –
fraction_range하이퍼파라미터를 기반으로 수정할 경계 상자의 비율을 제어하여 문서 라인을 무작위로 선택합니다. - Text Augmentation – 선택된 라인에 여러 NLP 스타일 작업 중 하나를 적용합니다:
- Random Insertion (불용어 삽입)
- Random Deletion (무작위 삭제)
- Random Swap (무작위 교환)
- Stopword Replacement (불용어 교체)
- Image Update – 원본 텍스트 영역을 검은색으로 가린 뒤, 새로 생성된 텍스트로 인페인팅합니다. 글꼴 크기는
font_size_fraction_range를 통해 경계 상자 높이에서 파생됩니다. 파이프라인은 변형된 이미지와 업데이트된 텍스트 메타데이터를 모두 반환하여, 다운스트림 학습 파이프라인이 변환된 쌍을 사용할 수 있게 합니다.
TextImage Augmentation의 주요 기능
1. 합성 텍스트 오버레이
임의의 텍스트를 모든 배경 이미지에 렌더링하여 완전한 합성 문서 샘플을 생성합니다. 이는 OCR‑free 문서 이해 트랜스포머의 SynthDOG와 같은 기술을 반영합니다.
2. 증강된 텍스트 오버레이
시각적 현실감을 유지하면서 텍스트 수준의 교란을 적용합니다. 지원되는 작업은 다음과 같습니다:
- Random Deletion – 무작위로 단어를 제거합니다.
- Random Swapping – 라인 내 단어 순서를 교환합니다.
- Stop‑word Insertion – 일반적인 불용어(예: "the", "and")를 삽입합니다.
이러한 증강은 모든 Albumentations 이미지 변환(예: 색상 지터, 어파인 왜곡)과 결합할 수 있으며, 변환된 텍스트는 overlay_data 필드를 통해 추출할 수 있습니다.
Note: 이전 버전의 레포에는 동의어 교체가 포함되어 있었지만, 상당한 실행 시간 오버헤드 때문에 제거되었습니다.
Installation
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
Visualization Helper
def visualize(image):
plt.figure(figsize=(20,15))
plt.axis('off')
plt.imshow(image)
Loading Document Data
파이프라인은 라인 수준 경계 상자(정규화된 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])
Text Augmentation Examples
Random Swap
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'])
Random Deletion
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'])
Random Insertion (Stop‑word Insertion)
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'])
Combining with Other Albumentations Transforms
복합 파이프라인은 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'])
Extracting the Altered Text
overlay_data 필드에는 다음과 같은 사전들의 리스트가 포함됩니다:
bbox_coords: 수정된 영역의 픽셀 좌표text: 새로 증강된 텍스트original_text: 원본 라인bbox_index: 원본 메타데이터 리스트에서의 인덱스font_color: 렌더링 색상
print(out['overlay_data'])
샘플 출력은 레이아웃을 유지하면서 교환되거나 삽입된 단어를 보여줍니다.
Synthetic Data Generation
기존 문서를 교란하는 것 외에도, 파이프라인은 임의의 텍스트를 모든 템플릿에 렌더링할 수 있습니다:
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'])
이 기능을 통해 수동 주석 없이 대규모 라벨이 지정된 문서 이미지를 생성할 수 있습니다.
Conclusion
TextImage Augmentation 라이브러리는 문서 이미지에 대한 통합된 멀티모달 증강 워크플로우를 제공합니다. 고전적인 NLP 교란(무작위 삽입, 삭제, 교환, 불용어 교체)을 Albumentations의 강력한 이미지 변환과 결합함으로써, 실무자는 다양하고 현실적인 학습 데이터를 생성하고 부족한 문서 코퍼스에서 VLM 파인‑튜닝을 향상시킬 수 있습니다. 자세한 매개변수 문서와 예시는 Albumentations AI 사이트에서 확인할 수 있습니다.
References
- Kim, G., Hong, T., Yim, M., et al. OCR‑free Document Understanding Transformer, ECCV 2022.
Installation Summary
pip install -U pillow albumentations nltk