Качественным, быстрым, устойчивым — именно таким должен быть распознаватель!  Всем привет! Распознаватель строки — элемент системы распознавания, о котором в первую очередь подумает обыватель, услышав о распознавании документов. А учитывая нынешний хайп вокруг нейронных сетей многим обязательно представится какая‑то магия, замешанная на трансформерах и рекуррентности. Однако, как известно, магия вне Хогвартса запрещена и может быть опасна. Так что сегодня хотим рассказать, почему мы не используем рекуррентность и трансформеры в нашей системе и как же мы всё‑таки получаем высокое качество. И приведем несколько замеров. Для начала поговорим про популярные ныне рекуррентные сети (в частности, LSTM) и трансформеры. И те, и те используются для end‑to‑end распознавания. LSTM‑сети (по‑русски сети долгой краткосрочной памяти) — вид рекуррентных сетей, изобретенный в 1997 году [LSTM_orig] и изначально использующийся для машинного перевода. Как и все рекуррентные сети, завязывается на предыдущие состояния. Трансформеры — новая архитектура, опубликованная в 2017 году [Transformer] и опять‑таки для задачи машинного перевода. Представляет собой автоэнкодер из слоев внимания. Для оригинального трансформера принципиально отсутствие рекуррентных слоев. Главная фишка трансформеров — возможность параллельного обучения. Дело в том, что обучение рекуррентного слоя (а значит, и всей сети) в рамках одного обучающего примера распараллелить нельзя — оно опирается на предыдущие состояния, а вот у слоев внимания такой проблемы нет. Соответственно, такие сети реально обучить гораздо глубже при использовании тех же вычислительных мощностей. Ожидаемо, в 2021 году появилась работа о применении трансформера в задачи классификации объектов [ViT], а совсем недавно опубликовали работу о трансформерах для распознавания строк в документах [TrOCR], что нам особо интересно. Итак, чем же нам не угодили LSTM‑сети и трансформеры? На текущем этапе развития ни LSTM‑сети, ни трансформеры не удовлетворяют требованиям к скорости, безопасности и объяснимости и при этом не показывают супер качество. За цифрами вам нужно в секцию «эксперименты в числах». И в LSTM‑сети, и в трансформеры изначально на уровне архитектуры вшита связь между всеми элементами входа и всеми элементами выхода. В машинном переводе это круто, можно найти и связать подлежащее и сказуемое, разделенные 20 дополнительными словами, можно выучить типичные структуры предложений в разных языках. В распознавании документов — нет. Так чего же в этом плохого?  Наверняка вы слышали (а многие и переживали) истории, где личные данные были вбиты неправильно. Хорошо, что если речь про абонемент в фитнес‑зал, а если такое случится в паспорте — то придется потом менять документы. Зачастую такие ошибки вызваны не просто опечатками, а «внутренними контекстами» оператора, и вот уже в паспорте потеряна «Ё» или подменился слог в редком имени. Автоматическая система должна бороться с таким, а никак не примыкать к подобному. По LSTM есть исследования [LSTM_LM], показывающие на примере английского и французского, как скрытая языковая модель ухудшает качество распознавания. Все опубликованные работы по круто распознающим LSTM‑сетям и трансформерам содержат сети с большим числом умножений.  И что? Запустить такие сети на мобильнике — это некоторое действо, а смысла в мобильном распознавании, которое будет работать дольше, чем ручной ввод — нет. Распознаватель должен быть устойчив к атакам злоумышленников, в частности, к состязательным примерам [Base_adv, UniAdv]. Про подбор состязательных примеров известен следующий факт — в нем можно опираться и на архитектуру, и на датасет.  А тут что не так? Проблема в размерах итоговых сетей, в особенности трансформеров. Такие сети практически никогда не учат с нуля. И даже «ведущие» российские компании в области ИИ не брезгуют предобученными моделями. А для открыто выложенных предобученных моделей кто угодно может сгенерировать состязательные примеры и радостно пойти проверять системы на уязвимость.  Распознаватель должен быть устойчив к естественным искажениям, например, распознавая смазанный затертый документ под розовой лампой предсказуемым образом. А в чем проблема? Проблема всё также в предобученных моделях, которые лишь слегка дообучают, например, взяв модель, работающую с английским и досыпав немного искусственных данных с русским. В результате, поведение (в особенности неправильное) таких моделей становится трудно объяснимым для стороннего человека и трудно настраиваемым для разработчиков, ведь во многом оно зависит от исходных выборки и аугментаций. И что со всем этим делать? Вообще, стоит вспомнить классику сразу по двум направлениям: и по сетям, и по распознаванию строки. Сверточные сети — уже в 20 веке успешно применялись ЛеКуном для распознавания символов (например, в классической работе 1998 года [LeCun]). Такие сети содержат как минимум свертки и полносвязный слой в конце. Собственно, полносвязный слой причиняет боль в современных задачах: он дико увеличивает число коэффициентов и умножений в сети, а заодно строго фиксирует размер входа. Полносверточные сети — сетки, в которых есть свертки и другие оконные операции (пуллинг, например), которые не фиксируют размер (предложены для решения задачи семантической сегментации в 2015 году [FCN], где круто себя показали). Когда‑то давным‑давно в распознавание не было end‑to‑end, то есть, изображение строки сначала сегментировали на символы, а потом эти символы распознавали. А потом поняли, что сегментация — очень сложная задача, когда у вас не скан черно‑белого идеального документа, а что‑то из реальной современной жизни. Кстати, именно из‑за этого на современных капчах символы часто пишут впритык и добавляют лишние графические элементы. Какое‑то время в сегментацию вбивали разные костыли (как‑то ограничения на пропорции символов, китайские иероглифы вот квадратные, на разрывность символов и тд) и получали методы, заточенные под конкретные кейсы и выборки, что печально. Так что в какой‑то момент многие стали переходить на end‑to‑end схемы, тем более что уже были рекуррентные сети. Хотя надо признать, что многие не сдаются например, рисунок ниже взят из работы 2017 года [IcdarSegm], где метод работает в предположении, что шрифт моноширинный и что картинка строго обрезана по границам слова. Однако если внимательно посмотреть на проблему, можно понять, что нечто подобное происходило и с распознаванием отдельных символов: изображения из моношрифтовых стали суперразнообразными, обрели фон и искажения, полученные при съемке, и классические методы распознавания (сопоставление шаблонов, подсчет ручных фич и тд) сломались. И все мы знаем, что потом эту область захватили искусственные нейронные сети и в обозримом будущем отступать не собираются. Так почему же не доверить сегментацию строки сети, тем более, что есть полносверточные сети? Исходя из вышеописанных рассуждений мы в начале 2020 года (уже три года назад) опубликовали статью [Recstr], где предложили для сегментации строки и распознавания символов использовать сверточные сети, а результат потом строить с помощью динамического программирования. Во многом подход базировался на давно известном методе эвристической излишней сегментации, но с принципиальным изменением. Это метод из конца 20 века, где сегментатор строки заранее настраивали так, чтобы он нашинковал строку сильнее, чем было нужно, чтобы точно не пропустить настоящие разрезы между символами. Потом все полученные кандидаты в символы распознавали и строили граф, где веса были и на ребрах, и на вершинах, а потом искали в нем лучший путь, для чего часто использовали алгоритм Витерби. У такого подхода была принципиальная проблема — если разрез в граф не попал, то его уже не восстановить. Рисунок ниже взят из статьи ЛеКуна 1998 [LeCun]. Итак, мы взяли и решили создать аналог эвристической сегментации, но устойчивый к потере разрезов и к современным условиям в целом. Итого получился следующий алгоритм: Сначала сеткой получаем проекцию на горизонтальную ось, где есть конфиденсы разрезов. Строим ее модификацию, подавив максимумы. Строим по модификации кандидатов в символы и распознаем их. Динамическим программированием строим лучший путь, максимизируя сумму конфиденсов разрезов и кандидатов в символы. Дораспознаем символы, если в лучшем пути остались разрывы. За формулами и подробными описаниями приглашаем в оригинальную статью, а пока вот вам иллюстрации процесса. В статье качество распознавания строки мы замеряли как посимвольное качество распознавания, используя два датасета, из которых целевым для нас был MIDV-500 - датасет муляжей документов, удостоверяющих личность [MIDV-500]. Из него мы нарезали изображения полей как перечислено в таблице ниже. Тип поля Число картинок Число символов Даты 17735 176142 Имена на латинице 15257 131067 МЧЗ 5096 220992 Номер документа 9329 88294 На этих полях мы сравнивались с Tesseract OCR 4.00 (последней на тот момент версией),  Tesseract OCR 3.05 и FineReader 15 (опять-таки, на тот момент последняя версия). Выбрали мы их по следующим причинам:  Tesseract OCR 4.00 - это система распознавания на основе LSTM, которая регулярно используется как бейзлайн; Tesseract OCR 3.05 - это система распознавания без сетей, так что было любопытно; Abbyy FineReader 15 - это классика коммерческих систем распознавания, которая до последнего времени широко использовалась в нашей стране. Специально для поста на хабр мы взяли трансформер из [TrOCR], модель TrOCR-Small-SROIE, прогнали ее локальной машине и получили результаты. Надо признать, что наша система в 2019 и трансформер из [TrOCR] примерно равны по качеству (часть полей получше, часть похуже). Тип Мы в 2019 4.00 3.05 Abbyy TrOCR Имена 79.04 75.44 37.29 55.76 76.11 Даты 84.59 57.80 41.85 56.67 87.73 МЧЗ 92.98 47.94 58.52 74.11 60.20 Номера 80.06 41.83 27.27 57.11 87.43 А еще мы мерили время (в таблице не будет Abbyy FineReader 15, так как это не API и не возможно замерить, сколько времени уходит на распознавание, а сколько - на работу GUI). Замеры для нашего подхода и для тессерактов были сделаны на AMD Ryzen 7 1700, трансформер замерили на AMD Ryzen 7 5800. Трансформер гоняли через pytorch. Все замеры делались на центральном процессоре в один поток. При этом для трансформера, учитывая время его работы на CPU, мы еще сделали замеры на GPU Nvidia GeForce RTX 3090, хотя ее наличие на конечном устройстве ничем не гарантировано. Но было любопытно, может ли трансформер работать хоть сколько-то быстро. Всё время указано в секундах, необходимых для обработки всех строк одного вида.  Тип поля Число картинок (шт) Smart Engines  в 2019(сек) Tesseract OCR 4.00(сек) Tesseract OCR 3.05(сек) TrOCR(сек) TrOCR GPU(сек)  Имена 15257 112.70   304.27   714.16  3546.28   394.30  Даты 17735 121.76   371.91  696.67  3986.60   438.79   МЧЗ  5096 233.18  586.81  731.76  2399.32   351.69   Номера  9329 110.07  227.96  446.38  2103.87 231.38   Как видно из таблицы, ПО Smart Engines образца 2019 года по скорости распознавания заметно обгоняет другие продукты. Среднее время распознавания имени составляет 0.0074 сек. Для распознавания даты в среднем требуется 0.0069 сек., строки машиночитаемой зоны - 0.0458 сек., номера - 0.0118 сек. Интересно, что в отличие от нашей системы, LSTM‑сети и несетевого метода, трансформер работает на датах гораздо дольше, чем на МЧЗ. Мы видим объяснение в следующем: строки МЧЗ значительно длиннее строк дат, но их гораздо меньше. Для распознавания трансформером изображение скейлится и бьется на патчи 16×16, что значительно уменьшается зависимость между временем работы и длиной строки. Итого, нам есть что сказать: При правильном подборе архитектур и создании качественных данных можно классическими сверточными сетями получать отличное качество распознавания. При использовании полносверточной сети для сегментации строки можно создать универсальный сегментатор. Рекуррентные сети слишком долго работают и зашитая в них языковая модель может отрицательно влиять на распознавание. Предобученные на гигантских объемах данных трансформеры могут показывать неплохие результаты, но работать в реальном времени — нет. Совсем нет. При этом, их предобученность существенно снижает предсказуемость и объяснимость ошибок, а заодно дает простор для творческого создания состязательных примеров. Если хотите посмотреть как круто мы распознаем документы в 2023 (а замеры в посте из 2019 года), скачивайте наши демо-приложения. Если вам нужно полное описание используемого нами подхода к распознаванию и данные, на которых мы учим наши сетки, читайте нашу статью [Recstr]. Там есть ссылка на обучающий датасет строк.  Про наш подход к аугментации можно прочесть в [Aug]. Если вы адепты трансформеров и предобученных моделей или вам просто есть, что сказать, приходите в комментарии. Источники про трансформеры: [Transformer] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin, Attention is All you Need, Advances in Neural Information Processing Systems 30 (NIPS 2017) [ViT] Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, Sylvain Gelly, Jakob Uszkoreit, Neil Houlsby, An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale, ICLR 2021 [TrOCR] Minghao Li, Tengchao Lv, Jingye Chen, Lei Cui, Yijuan Lu, Dinei Florencio, Cha Zhang, Zhoujun Li, Furu Wei, TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models, AAAI 2023. Источники про LSTM: [LSTM_orig] Sepp Hochreiter, Jürgen Schmidhuber, Long Short-Term Memory, Neural Computation (1997) 9 (8): 1735–1780. [LSTM_LM] Ekraam Sabir, Stephen Rawls, Prem Natarajan, Implicit Language Model in LSTM for OCR, https://arxiv.org/pdf/1805.09441.pdf Источники про нас: [Recstr] Chernyshova Y. S., Sheshkus A. V., Arlazarov V. V. Two-step CNN framework for text line recognition in camera-captured images // IEEE Access. — 2020. — Т. 8. — С. 32587-32600. — DOI: 10.1109/ACCESS.2020.2974051. [Aug] A. V. Gayer, Y. S. Chernyshova and A. V. Sheshkus, “Effective real-time augmentation of training dataset for the neural networks learning,” ICMV 2018, 11041 ed., Bellingham, Washington 98227-0010 USA, Society of Photo-Optical Instrumentation Engineers (SPIE), March 2019, vol. 11041, ISSN 0277-786X, ISBN 978-15-10627-48-2, vol. 11041, pp. 110411I1-110411I7, 2019, DOI: 10.1117/12.2522969. [Segm] Шешкус А. В., Чернышова Ю. С., Чирвоная А. Н., Николаев Д. П. Новый критерий обучения нейросетевого энкодера в задаче сегментации строки на символы // Сенсорные системы. — 2019. — Т. 33. — № 2. — С. 173-178. — DOI: 10.1134/S0235009219020094.  Датасет MIDV-500: [MIDV-500] V. V. Arlazarov, K. Bulatov, T. Chernov and V. L. Arlazarov, “MIDV-500: A Dataset for Identity Document Analysis and Recognition on Mobile Devices in Video Stream,” Computer Optics, vol. 43, no 5, pp. 818-824, 2019, DOI: 10.18287/2412-6179-2019-43-5-818-824. Источники про классику: [LeCun] Yann Lecun, Leon Bottou, Y. Bengio, Patrick Haffner, Gradient-Based Learning Applied to Document Recognition, Proceedings of the IEEE 86(11):2278 - 2324 [FCN] Evan Shelhamer, Jonathan Long, Trevor Darrell, Fully Convolutional Networks for Semantic Segmentation, CVPR 2015 [IcdarSegm] F. Jia, C. Shi, Y. Wang, C. Wang, and B. Xiao, “Grayscale-projection based optimal character segmentation for camera-captured faint text recog- nition,” in Proc. ICDAR17, IEEE, Kyoto, Japan, 2017, pp. 1301-1306. Состязательные примеры: [UniAdv] S. -M. Moosavi-Dezfooli, A. Fawzi, O. Fawzi and P. Frossard, "Universal Adversarial Perturbations," 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 2017, pp. 86-94, doi: 10.1109/CVPR.2017.17. [Base_adv] Christian Szegedy, Wojciech Zaremba, Ilya Sutskever, Joan Bruna, Dumitru Erhan, Ian Goodfellow, Rob Fergus, Intriguing properties of neural networks, ICLR 2014.