في منشور المدونة هذا، نقدم برنامجًا تعليميًا حول كيفية استخدام تقنية جديدة لزيادة البيانات لصور المستندات، تم تطويرها بالتعاون مع Albumentations AI.
تحفيز
تشتمل نماذج لغة الرؤية (VLMs) على نطاق هائل من التطبيقات، ولكنها غالبًا ما تحتاج إلى ضبط دقيق لحالات استخدام محددة، خاصة بالنسبة لمجموعات البيانات التي تحتوي على صور المستندات، أي الصور ذات المحتوى النصي العالي. في هذه الحالات، من الضروري أن يتفاعل النص والصورة مع بعضهما البعض في جميع مراحل التدريب النموذجي، ويضمن تطبيق التعزيز على كلتا الطريقتين هذا التفاعل. في الأساس، نريد نموذجًا لتعلم القراءة بشكل صحيح، وهو أمر يمثل تحديًا في الحالات الأكثر شيوعًا التي تكون فيها البيانات مفقودة.
ومن هنا الحاجة إلى زيادة البيانات الفعالة أصبحت تقنيات صور المستندات واضحة عند مواجهة التحديات في نماذج الضبط الدقيق بمجموعات بيانات محدودة. أحد المخاوف الشائعة هو أن تحويلات الصور النموذجية، مثل تغيير الحجم أو التمويه أو تغيير ألوان الخلفية، يمكن أن تؤثر سلبًا على دقة استخراج النص.
لقد أدركنا الحاجة إلى تقنيات زيادة البيانات التي تحافظ على سلامة النص مع زيادة مجموعة البيانات. يمكن أن تؤدي زيادة البيانات هذه إلى تسهيل إنشاء مستندات جديدة أو تعديل المستندات الموجودة، مع الحفاظ على جودة النص.
مقدمة
ولتلبية هذه الحاجة، نقدم أ خط أنابيب جديد لزيادة البيانات تم تطويره بالتعاون مع Albumentations AI. يعالج هذا المسار كلاً من الصور والنصوص بداخلها، مما يوفر حلاً شاملاً لصور المستندات. هذه الفئة من زيادة البيانات الوسائط المتعددة حيث يقوم بتعديل محتوى الصورة والتعليقات التوضيحية النصية في وقت واحد.
كما تمت مناقشته في منشور مدونة سابق، هدفنا هو اختبار الفرضية القائلة بأن دمج التعزيزات على كل من النص والصور أثناء التدريب المسبق لـ VLMs فعال. يمكن العثور على المعلمات التفصيلية والرسوم التوضيحية لحالة الاستخدام في وثائق الألبومات AI. تتيح ميزة Albummentations AI التصميم الديناميكي لهذه التعزيزات وتكاملها مع أنواع التعزيزات الأخرى.
طريقة
لزيادة صور المستند، نبدأ باختيار الخطوط داخل المستند بشكل عشوائي. معلمة مفرطة fraction_range يتحكم في جزء المربع المحيط المراد تعديله.
بعد ذلك، نقوم بتطبيق إحدى طرق تكبير النص المتعددة على الأسطر المقابلة من النص، والتي يتم استخدامها بشكل شائع في مهام إنشاء النص. تتضمن هذه الأساليب الإدراج العشوائي والحذف والمبادلة واستبدال كلمة الإيقاف.
بعد تعديل النص، نقوم بحجب أجزاء الصورة التي تم إدراج النص فيها ونقوم بطلائها باستخدام حجم المربع المحيط الأصلي كبديل لحجم خط النص الجديد. يمكن تحديد حجم الخط باستخدام المعلمة font_size_fraction_range، الذي يحدد النطاق لتحديد حجم الخط كجزء من ارتفاع المربع المحيط. لاحظ أنه يمكن استرجاع النص المعدل والمربع المحيط المقابل واستخدامهما للتدريب. تؤدي هذه العملية إلى مجموعة بيانات تحتوي على محتوى نصي متشابه لغويًا وصور مشوهة بصريًا.
الميزات الرئيسية لتكبير TextImage
يمكن استخدام المكتبة لغرضين رئيسيين:
-
إدراج أي نص على الصورة: تتيح لك هذه الميزة تراكب النص على صور المستندات، مما يؤدي إلى إنشاء بيانات تركيبية بشكل فعال. باستخدام أي صورة عشوائية كخلفية وتقديم نص جديد تمامًا، يمكنك إنشاء نماذج تدريبية متنوعة. تم تقديم تقنية مماثلة، تسمى SynthDOG، في محول فهم المستندات الخالي من التعرف الضوئي على الحروف.
-
إدراج نص معزز على الصورة: يتضمن ذلك تكبيرات النص التالية:
- الحذف العشوائي: يقوم بإزالة الكلمات من النص بشكل عشوائي.
- مبادلة عشوائية: تبديل الكلمات داخل النص.
- وقف إدراج الكلمات: لإدراج كلمات التوقف الشائعة في النص.
يتيح الجمع بين هذه التعزيزات وتحويلات الصور الأخرى من الألبومات إمكانية التعديل المتزامن للصور والنص. يمكنك استرداد النص المعزز كذلك.
ملحوظة: الإصدار الأولي من خط أنابيب زيادة البيانات المقدم في هذا الريبو، يتضمن استبدال المرادفات. تمت إزالته في هذا الإصدار لأنه تسبب في زيادة الوقت بشكل كبير.
تثبيت
!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)
تحميل البيانات
لاحظ أنه بالنسبة لهذا النوع من التعزيز، يمكنك استخدام مجموعات بيانات 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)
مبادلة عشوائية
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"])

الحذف العشوائي
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'])

الإدراج العشوائي
في الإدراج العشوائي نقوم بإدخال كلمات أو عبارات عشوائية في النص. في هذه الحالة، نستخدم كلمات التوقف، وهي كلمات شائعة في لغة غالبًا ما يتم تجاهلها أو تصفيتها أثناء مهام معالجة اللغة الطبيعية (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'])

هل يمكننا دمجها مع التحولات الأخرى؟
دعونا نحدد خط أنابيب تحويل معقد باستخدام 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"])

لاستخراج المعلومات الموجودة على مؤشرات المربع المحيط حيث تم تغيير النص، إلى جانب بيانات النص المحولة المقابلة، قم بتشغيل الخلية التالية. يمكن استخدام هذه البيانات بشكل فعال لنماذج التدريب للتعرف على تغييرات النص في الصور ومعالجتها.
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'}]
توليد البيانات الاصطناعية
يمكن توسيع طريقة التعزيز هذه لتشمل توليد البيانات الاصطناعية، لأنها تتيح عرض النص على أي خلفية أو قالب.
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'])

خاتمة
بالتعاون مع Albumentations AI، قدمنا ميزة TextImage Augmentation، وهي تقنية متعددة الوسائط تعمل على تعديل صور المستندات مع النص. من خلال الجمع بين تكبيرات النص مثل الإدراج العشوائي والحذف والمبادلة واستبدال كلمة الإيقاف مع تعديلات الصورة، يسمح خط الأنابيب هذا بتوليد عينات تدريبية متنوعة.
للحصول على المعلمات التفصيلية والرسوم التوضيحية لحالة الاستخدام، راجع وثائق الألبومات AI. نأمل أن تجد هذه التعزيزات مفيدة لتحسين سير عمل معالجة صور المستندات لديك.
مراجع
@inproceedings{kim2022ocr,
title={Ocr-free document understanding transformer},
author={Kim, Geewook and Hong, Teakgyu and Yim, Moonbin and Nam, JeongYeon and Park, Jinyoung and Yim, Jinyeong and Hwang, Wonseok and Yun, Sangdoo and Han, Dongyoon and Park, Seunghyun},
booktitle={European Conference on Computer Vision},
pages={498--517},
year={2022},
organization={Springer}
}