Получи случайную криптовалюту за регистрацию!

​​Синтетические данные и OCR Наверное вы слышали, что синтети | DeepSchool

​​Синтетические данные и OCR

Наверное вы слышали, что синтетика далеко не всегда хороший помощник. Но только не в задаче Optical Character Recognition (распознавание текста). Тут синтетика может сильно помочь.
Кейс из жизни: можно безошибочно распознавать (strmatch) 83% полей на паспортах СНГ с помощью сети, обученной только на синтетике.
В задаче OCR делайте этап предобучения на синтетике, а затем дообучайте на реальных данных. Результат вас обрадует

Напомним, как решают задачу распознавания текста (рис. 1)

0) на вход сети подают картинку со строкой или словом;
1) картинку делят по горизонтали на N частей;
2) классифицируют каждую часть, включая класс «пустота»;
3) результаты классификации схлопывают и получают предсказанный текст.

Как заполучить синтетику

Для генерации выборки нам надо научиться создавать картинки с текстом. В этом нам поможет библиотека PIL. С помощью PIL.ImageFont можно загрузить нужный шрифт и нанести текст поверх любого изображения (рис. 2). Но для лучшего результата надо постараться максимально приблизить домен сгенерированных данных к реальному.

Несколько лайфхаков, которые помогут это сделать:

  Накладывайте текст на реальный фон. Например, разметьте прямоугольники с фоном на боевых картинках в сервисе для разметки (CVAT/LabelStudio/LabelBox/etc). А затем вырежьте прямоугольники с фоном по разметке и используйте как подложку для текста. (рис. 3) Заметим, что на этапе предобучения на синтетике совершенно не обязательно генерировать осмысленные слова. Здесь мы просто учим сеть отличать одни символы от других.

Сгенерируйте цветной прямоугольник (заливку), а с помощью PIL.ImafeFont «маску» с текстом, по которой будете переводить символы с цветного прямоугольника на ваш фон. Регулируя интенсивность «маски», вы сможете наносить полупрозрачный текст. А деформируя маску с помощью аугментаций, можно получить интересные преобразования. Например, комбинируя cutout и блюр, можно получить эффект потертого текста (рис. 4).

Наносите не весь текст целиком, а каждый символ по-отдельности. Варьируйте расстояние между символами, угол поворота, размер, смещение вдоль вертикали — это поможет получить более робастную модель.

Даже если у вас много настоящих картинок, может все равно встречаться сильный дисбаланс в символах. Например, твердый знак «Ъ» может встречаться очень редко, из-за чего сеть будет часто его путать с мягким «Ь». В таком случае докиньте в train синтетику слов с твердым знаком. Это поможет нивелировать дисбаланс, и сетка начнет лучше отличать «Ъ» от «Ь»

 Можно пойти еще дальше и генерировать кропы при помощи GAN. Например, обучить CycleGAN транслировать картинки между синтетическим доменом и реальным. А затем для синтеза кропов оставить только генератор “синтетика → реальные” (рис. 5).