Сколько нужно программистов и прописей, чтобы распознать рукописный паспорт?
Как думаете, часто ли встречаются рукописные паспорта в нашей стране? Когда мы в Smart Engines начинали проектировать систему распознавания паспортов, казалось, что достаточно научить систему качественно распознавать машинописные документы. На тот момент наличие рукописных паспортов, которые не поддавались автоматическому распознаванию, не представлялось важной проблемой: нерешенных задач хватало и без этого. Год назад, анализируя качество работы Smart IDReader, мы поняли, что добрались до того уровня, когда рукописные паспорта составляют значимый класс ошибок. В соответствии с научным подходом, изучили проблему и принялись за решение. Сегодня будет рассказ о том, как мы сделали распознавание рукописного общегражданского паспорта РФ, успешно решив тем самым последнюю задачу на пути полной автоматизации ввода паспортных данных.
Задача распознавания рукописного текста в общем виде звучит фундаментально, масштабно и нерешаемо. Поэтому вначале важно правильно ограничить формализовать задачу. Итак, будем распознавать рукописный текст основного разворота российского общегражданского паспорта. Такие паспорта заполняются аккуратным каллиграфическим (хотя бы по мнению паспортиста) почерком. С одной стороны, это облегчает задачу: нам не придется распознавать «врачебные каракули» и прочие слабо читаемые тексты. Но, с другой стороны, нам предстоит столкнуться со всей вариативностью каллиграфических начертаний кириллических букв. Ну, что же, это скорее серьезный вызов, а не непреодолимая проблема.
Задачу распознавания рукописного текста в паспорте мы разбили на три подзадачи:
- Детекция наличия рукописи в паспорте.
- Сегментация рукописной строки на символы.
- Распознавание символов и постобработка.
Далее в статье мы расскажем подробнее про решение каждой подзадачи. Но сначала обсудим одну очень важную проблему, которая всегда первой возникает при распознавании – датасеты. Без датасетов нормальное распознавание не сделать: даже если удастся обучить нейронные сети на синтезированных данных, все равно нужны данные, которые позволят измерить точность работы обученной системы. Как оказалось, на просторах сети нет сколько-нибудь годных датасетов рукописи. Поэтому наш список подзадач был дополнен нулевым пунктом – «Подготовка датасета». К этому процессу мы подошли творчески: раздали тетрадки «в линеечку» и попросили всех наших программистов «вжиться в роль» мастеров каллиграфии – переписать красивым почерком некоторые заранее подготовленные тексты. Это были стихи А.С. Пушкина.
Тут нас ждало первое разочарование. Как бы это жестко ни звучало, но оказалось, что наши программисты совсем разучились писать. И нельзя сказать, что они не старались. Нет, они просто забыли как пишутся буквы от руки. Вот пример того, что получалось:
Согласитесь, совсем не то, что надо. Буквы пляшут, размеры не соблюдены… Пришлось искать в интернете прописи, и, как в первом классе, сажать всех за прописи в прямом смысле этого слова! Мы до сих пор вспоминаем это время с улыбкой: весь коллектив (без исключений, от студентов третьего курса до заслуженных докторов наук) сидит за партой и аккуратно выводит буковки.
За два дня, набив руку, мы были готовы повторить попытку сбора «сырых» данных для датасета рукописного текста. Буквы стали ровнее, слова — читабельнее. А некоторые умудрялись даже привносить какие-то элементы каллиграфии. Вот, посмотрите сами на новые образцы:
В результате таких заготовок с разными текстами и почерками мы собрали около 1000 штук, аккуратно оцифровали и разметили на строчки и символы. Всё, поздравляю, датасет рукописи готов. Вернёмся к алгоритмам.
Детекция наличия рукописи в паспорте
Детекция наличия рукописи – важный элемент промышленной системы распознавания документов. Эта функциональность относится к категории «понимание документа» и крайне востребована на стороне бизнес-заказчика. Мы обучили бинарную свёрточную нейронную сеть, которая анализировала подаваемые на вход изображения отдельных текстовых строк паспорта. Каждое из полей паспорта анализируется на предмет рукописи с помощью данной сети и далее путём взвешивания полученных оценок принимается общее решение о «рукописности» паспорта в целом.
Сегментация рукописной строки на символы
Сегментация рукописного текста принципиально отличается от сегментации машинописного текста. Для понимания первого уровня проблемы просто попробуйте написать от руки слово «шиншилла» и посмотрите на эти «стройные ряды крючков». Для сегментации рукописных тестов мы снова применили нейронные сети. Мы обучили специальную нейронную сеть, которая в качестве ответа возвращает оценку наличия «разреза» между буквами в каждой точке входного изображения текста. Далее, применяя принципы динамического программирования, строятся разрезы букв.
Проблема проставления разрывов между буквами – это далеко не вся боль сегментации. Надо правильно ограничить каждый символ по вертикали. И тут поиск «базовых» линий, который часто используется при распознавании печатного текста, совсем не применим – высота рукописных букв скачет в неограниченных пределах.
Распознавание символов и постобработка
Проблема распознавания рукописных символов в основном заключается в одинаковости начертания разных символов. Посмотрите на пример выше: какая фамилия написана — “Петров” или “Нетров”? Человек, когда читает рукописный текст, никогда не читает его посимвольно, а всегда в рамках заданного контекста. Так же должна вести себя и система распознавания в данном случае. Так, нейронная сеть, распознающая рукописные символы, должна быть «толерантна» к различным буквам, имеющим одинаковое начертание (с математической точки зрения, должна возвращать одинаковые значения уверенности (confidence) для таких символов), а последующие алгоритмы анализа и обработки результатов распознавания (так называемые «постпроцессоры») должны учитывать особенности распознаваемого поля.
Чего в итоге мы добились?
Вот так за год мы научились распознавать рукописные паспорта, оставив позади эту фундаментальную проблему, которая казалась нерешаемой несколько лет назад! А что дальше? Дальше как обычно — работа над качеством и новые рубежи.
P.S. Чуть не забыли про ответ на вопрос, заявленный в заголовке. Итак, у нас в компании 62 программиста. Мы купили 150 тетрадок и распечатали 2000 листов прописей.