Создание искусственного датасета для обучения модели с использованием Paddle OCR

23fd45e72da82d810aa76dd85bf43592.jpg

Привет, коллеги! Продолжаем тему разработки плагина для распознавания иврита с использованием Paddle OCR. В прошлый раз я забыла представиться, сделаю это в этом посте)
Меня зовут Алексей, я руковожу компанией, которая занимается разработкой с применением ИИ-технологий. Сам я тоже погружен в разработку, но больше доверяю это своей команде — нам удалось собрать команду классных профи. Истории из нашей совместной работы я и планирую рассказывать в своем блоге.

Вернемся к теме статьи. Сегодня остановимся подробнее на создании искусственного датасета для обучения модели с использованием Paddle OCR. Этим занимался мой коллега Александр — экспертв компьютерном зрении.

Когда перед нами встала задача распознавания текста на иврите, стало ясно, что найти готовый датасет с нужными характеристиками практически невозможно. Это подтолкнуло нас к созданию собственного датасета, который оказался не только полезным, но и дал возможность потренироваться в генерации синтетических данных. В этом посте мы подробно расскажем, как именно подошли к этому процессу.

Шаг 1: Сбор данных

Первым делом мы нашли большой и разнообразный словарь иврита. Используя открытые источники, мы собрали базу данных, включающую более 350 тысяч слов, оттуда мы брали каждое пятое слово, чтобы ускорить процесс обучения. Важным аспектом был не только охват стандартных слов, но и включение специализированных терминов, которые могут встречаться в конкретных нишах. Наша задача была как раз связана с распознаванием документации, где используется много лексических штампов и терминов.

Шаг 2: Генерация изображений слов

Для генерации изображений из слов мы использовали Python-библиотеку PIL (Python Imaging Library). Этот этап оказался весьма интересным, поскольку позволил нам создать разнообразные визуальные сценарии, с которыми модель столкнется в реальной жизни.

  1. Выбор шрифтов и размеров текста: Мы выбрали несколько популярных шрифтов и вариаций размеров текста, чтобы обеспечить модель различными стилями. Использование шрифтов с разными характеристиками (например, с засечками и без) помогает модели лучше справляться с реальным текстом.

  2. Фоновые изображения: Чтобы сделать изображения максимально реалистичными, мы использовали несколько вариантов фона — от однотонных до текстурированных. Для создания текстурированных фонов мы взяли изображения бумаги, ткани и других поверхностей, что имитировало реальные условия, где текст может быть напечатан или написан.

  3. Позиционирование текста: Мы сгенерировали несколько вариантов изображений с разным отступом текста по краям.

  4. Шрифты: В иврите существуют шрифты с разной степенью «декоративности» и читаемости. Мы включили как стандартные, так и более сложные, чтобы повысить устойчивость модели к разным типам текста.

  5. Аугментации: Для большего разнообразия во время тренировки применялись такие аугментации как размытие, поворот, шум и т.п.

Вот пример кода для генерации изображения слова с использованием PIL на рандомном фоне:

from random import randint

from PIL import Image, ImageDraw, ImageFont

def draw(p, text="אריאל", max_gap=5, font_size=50):

    fnt = ImageFont.truetype(p, font_size)

    size = fnt.getbbox(text)

    # Получаем координаты бокса с текстом,

    # где x1 и y1 это отступ слева и сверху

    x1, y1, x2, y2 = size

    # Увеличиваем отступы со всех сторон рандомно

    x1 -= randint(0, max_gap)

    y1 -= randint(0, max_gap)

    x2 += randint(0, max_gap)

    y2 += randint(0, max_gap)

    # Задаём рандомный фон

    img = Image.new('RGB', (x2-x1, y2-y1), color = (randint(75,150),            randint(75,150), randint(75,150)))

    d = ImageDraw.Draw(img)

    # Рисуем текст так, чтобы проигнорировать пустые отступы

    # и наш текст полностью попал на экран

    d.text((-x1,-y1), text, font=fnt, fill=(0, 0, 0))

    return img

img = generate_image("path_to_font.ttf”, ”שלום”)

img.show()

Итоги

Зачастую приходится сталкиваться с нехваткой данных и такие ситуации становятся маленьким вызовом, вынуждая к творческому решению проблемы. В итоге создание искусственного датасета оказалось для нас не только необходимым, но и крайне полезным процессом. Модель, обученная на таком датасете, показала отличные результаты в распознавании текста на иврите в различных сценариях.

Если вы тоже сталкиваетесь с нехваткой подходящих данных для обучения вашей модели, не бойтесь экспериментировать и создавать собственные датасеты. Этот процесс не только улучшит ваши навыки, но и даст вам точный контроль над качеством и разнообразием данных, которые вы используете для обучения.

PS.

И снова призываю вас подписываться на тг-канал «Мозги набекрень»: https://t.me/+vpPjcjWrhgViYTA6
Планируем публиковать там авторский контент на схожую тематику.

PPS. Оставьте + в комментариях, если разглядели дельфина в обложке. Оставьте ++, если вы из тех, кто помнит это развлечение из детства…

© Habrahabr.ru