Как ИИ распознаёт рукописный текст

Женя Карташев — ML-инженер в службе компьютерного зрения Яндекса. Поговорили с ним о сложностях распознавания текстов нейросетями и о последних трендах в области компьютерного зрения

Расскажи, чем ты занимаешься

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

Улучшать качество распознавания рукописного текста важно, потому что пока оно не такое высокое, как у печатного текста. В печатном есть требования, которые соблюдает устройство, печатая буквы определённым и, главное, читаемым образом. А в рукописных текстах такой определённости нет. Даже один и тот же человек в разных словах одну и ту же букву может написать по-разному. У кого-то почерк более понятный, у кого-то — менее, кто-то пишет ручкой с жирными чернилами, и текст получается смазанным. Вариативность данных очень большая, поэтому рукописный текст — это сложный домен и его нужно улучшать.

С помощью технологий распознавания рукописного текста, например, оцифровывают конспекты или архивные документы. Хочется, чтобы можно было их сфотографировать и получить готовый текст на устройстве. Так с ним будет удобнее работать: вместо того чтобы листать выцветшие страницы, можно просто нажать Ctrl + F и быстро найти нужную информацию. А если самостоятельно перепечатывать рукописный текст, на это уйдёт много времени. К тому же в архивных документах не всегда можно разобрать, что написано, потому что там устаревшие нормы языка. И чтобы такой текст был доступен и понятен каждому, как раз и нужно развивать распознавание рукописного текста.

На какие этапы можно разделить твою работу с искусственным интеллектом?

Поиск данных. Это должна быть картинка с текстом и её печатный «перевод», например в txt-файле. Дальше эти данные надо разметить: обычно я иду в краудсорсинговый сервис Яндекса и составляю там проект, чтобы люди делали разметку. Это помогает расширить датасет.

Выбор архитектуры. Здесь я читаю статьи, изучаю, какие решения существуют. Этот этап ресёрча съедает много времени, но он критически важный. Неправильно подобранная архитектура или какая-то не учтённая на старте деталь могут вылиться в большую головную боль. Придётся потратить много времени на исправление того, что не учёл в самом начале.

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

Тюнинг. Здесь провожу ещё несколько экспериментов и смотрю, где модель переобучается, какие присутствуют артефакты (например, нейросеть путает буквы «е» и «а» или обрезает хвост предложения) и как их можно исправить.

Внедрение в продакшн. Чаще всего это переписывание модели на другой язык, её ускорение и сжатие, чтобы, например, она работала на мобильных устройствах. А потом я смотрю на онлайн-метрики и пытаюсь понять, насколько модель справляется с задачей в полевых условиях.

Круто! А за счёт чего искусственный интеллект распознаёт рукописный текст? Какие шаги ему нужно пройти для этого?

  1. Поиск текста на картинке. Это можно сделать по-разному: кто-то ищет буквы, кто-то — слова, а кто-то сразу распознаёт строки. Но так или иначе первый шаг — найти текст и вырезать его. Из одной картинки получается несколько — допустим, со строками, и они уже подаются в нейронку.

  2. Предварительное обучение модели. На этом этапе выделяются признаки. Ты учишь нейронку понимать, какие типы букв бывают: как выглядит, например, рукописная буква «р», как пишут по-русски и по-английски. Нейросеть учится жить в пространстве этих букв и понимать, что есть что.

  3. Декодирование признаков и предсказание. Когда нейросеть научилась выделять признаки, ты добавляешь декодер, который из этих признаков собирает текст, и обучаешь encoder-decoder-архитектуру. Декодеры бывают разные: например, рекуррентная нейронная сеть или трансформерный декодер. Их задача — учитывать контекст для предсказания и понимать, как один токен связан с другими.

  4. Постпроцессинг и аналитика. После получения предсказаний модели их нужно обработать: перевести индексы предсказанных токенов в текст, убрать спецсимволы, провести анализ качества и выявить аномалии — на что модель переобучается, а чего, наоборот, не видит.

Получается, одна нейросеть может работать сразу с несколькими языками? Или на каждый язык — своя нейронка?

Зависит от объёма информации, который способна выучить нейросеть. Она не всегда может распознавать два языка одинаково хорошо: это разные домены. Это то же самое, что учить нейросеть детектировать домашних котов и диких манулов: и там и там коты, но выглядят по-разному.

В теории можно обучить нейронку детектировать и манулов, и домашних котов, но тогда будет сложно следить за балансом данных. А если домашний кот появится на природе? Не попытается ли нейронка предсказать его как манула, которых она привыкла там видеть? Или наоборот: манул дома может быть распознан как домашний кот.

Здесь надо проводить эксперименты. Например, объединять похожие языки. Так они могут даже улучшать качество распознавания друг друга. За счёт того, что нейросеть видит, например, испанский, она начинает лучше работать на итальянском.

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

Как понять, что алгоритм требует усовершенствования, и что можно с этим сделать?

Есть метрики, по которым видно, насколько хорошо работает твоя модель. Одни показывают, как нейросеть предсказывает каждую букву, вторые — как она распознаёт слова, третьи — как находит текст и так далее.

Что сигнализирует о том, что надо улучшать нейронку? Плохие метрики. Другой важный показатель — выход новых зарубежных статей. Каждый участник нашей команды мониторит разные источники, я обычно слежу за порталом Papers With Code. Мы все изучаем, что происходит в мире компьютерного зрения и распознавания символов.

Например, Google выпустил что-то интересное — и мы думаем: «Вау! А может, нам такую штуку попробовать?» Смотрим, что они использовали такой-то подход, и тоже его тестируем. Сфера развивается, и мы прилагаем большие усилия, чтобы не отставать и привносить свои идеи.

И как часто нужно этим заниматься?

Не было ни одного дня, когда я не следил бы за метриками. Ты смотришь сначала на них, а потом — на картинку. Например, метрики плохие, ты открываешь картинку и понимаешь, что не распознаётся вертикальный или перевёрнутый текст. И ты всё время дообучаешь, смотришь метрики, сравниваешь их с предыдущими. Это происходит каждый день.

Женя Карташев

С какими сложностями ты сталкиваешься в ходе работы?

Привычная для ML-инженера проблема — сложно чего-то ожидать от нейронки. Ты думаешь: «Сейчас досыплю новых данных, обучу — и метрика должна стать лучше, потому что нейронная сеть увидела ещё больше текста и стала умнее». Но становится только хуже, и приходится разбираться, что случилось.

Часто распознавание рукописного текста — будто чтение записок сумасшедшего. Например, слово «шиншилла» бывает сложно прочитать даже людям. Это, кстати, любимое слово в нашей команде. У всех разный почерк, и это создаёт большую вариативность данных. Порой сам не понимаешь, что написано, а алгоритм каким-то образом понимает.

Текст, в том числе рукописный, может быть изогнутым, перевёрнутым, напечатанным по кругу банки колы или написанным с орфографическими ошибками. Нейронная сеть обучалась на данных с правильным написанием. Если она встретит слово с перечёркиванием или кляксой, попытается ли она его исправить? А нужно ли нам вообще уметь исправлять такие кейсы? Всё зависит от решаемой задачи и от того, кому модель предназначается. Это в меру интересно и в меру сложно.

Расскажи о последних трендах в сфере компьютерного зрения

Мультимодальные модели. Например, новый сервис Яндекса «Нейро»: ты можешь отправить картинку и попросить определить, что на ней изображено, или посчитать объекты. Здесь идёт обработка твоего сообщения и картинки. Разные модальности могут улучшать друг друга, а такие нейронные сети становятся больше похожими на людей. Мы общаемся, слышим, видим — и хочется, чтобы нейронная сеть тоже умела работать с разными типами данных.

Генерализация моделей. Хочется научиться создавать модели, которые могли бы фокусироваться не на чём-то одном вроде классификации котиков, а на максимальном количестве информации. Обобщённые модели должны уметь сегментировать, находить или распознавать любые объекты за счёт большого объёма знаний. Раньше это казалось невозможным, но сейчас к этому всё идёт.

Что посоветуешь тем, кому интересна эта область?

Книга Тарика Рашида «Создаём нейронные сети». Это была моя первая книга по нейронным сетям, и идеи, которые в ней изложены, зажгли во мне интерес к такого рода алгоритмам. Книга очень простая и с картинками. Подойдёт тем, кто только пытается войти в эту область.

ШАД Яндекса. Это одно из лучших мест в стране для погружения в анализ данных. Туда нелегко поступить, но там сконцентрированы самые актуальные знания. Статья, которая вышла вчера, сегодня уже у тебя в домашке. Преподаватели очень сильные и сами работают в сфере. Например, команда Алисы рассказывает тебе, как обрабатывать звук, а команда управления беспилотниками — как работать с LiDAR-технологиями. У ШАДа есть хендбук по машинному обучению: если пока нет времени на то, чтобы учиться на программе, можно погружаться в своём темпе.

Deep Learning School от МФТИ, где я начинал свой путь. Место классное, даёт серьёзную основу и отличное комьюнити. Там я приобрёл базовые навыки и знания в области компьютерного зрения.

Журнал и подкасты Яндекс Образования. В своё время очень много их читал и слушал — и делаю это до сих пор. Материалы оттуда помогают расширять кругозор: можно найти статьи и на технические темы, и о том, например, как научиться печатать вслепую и зачем нужно вести свой телеграм-канал.

Краткий пересказ от Yandex GPT