Русский
Русский
English
Статистика
Реклама

Ocr

Ковидная индустрия и системы распознавания

21.04.2021 14:19:32 | Автор: admin

Прошло больше года с момента введения жестких ограничительных мер, связанных с распространением COVID-19. Сейчас мир постепенно возвращается в нормальный режим жизни, хотя угроза новых вспышек заболевания остается. Поэтому принимаются все необходимые меры: маски, перчатки и сдача ПЦР-тестов по разным поводам. С административной точки зрения, это, скорее всего, правильно. А вот с организационной система не готова. Главная проблема слабо организованная система проведения ПЦР-тестов. В сегодняшней статье поговорим о том, как ее усовершенствовать.

С точки зрения организации администрирования всего процесса, в целом, ПЦР-тестирование это не просто мазок из носоглотки. Необходимо организовать следующие процессы:

  • регистрация клиента и взятие мазка из ротоглотки ПЦР-теста (в стационарных или мобильных пунктах);

  • логистика биоматериала до исследовательской лаборатории;

  • проведение анализа биоматериала;

  • предоставление результатов тестирования;

  • контроль результатов на пропускных пунктах (в аэропортах, гостиницах, офисах и т.п.).

Оказывается, в качестве bottle neck в приведенном списке выступают первая и последняя позиции. Действительно, логистика и проведение самого анализа биоматериала давно автоматизированные и проработанные со стороны лабораторий процессы. А вот процедура взятия мазка и последующий контроль результатов исследования на пропускных пунктах в условиях массового наплыва клиентов новая задача.

Впрочем, сам по себе мазок это минутное дело. Большую часть времени занимает регистрация клиента в базе данных лаборатории, ввод персональных данных, проведение анкетирования, заключение договора, оплата услуг. Получается, что процедура проведения ПЦР-теста на 70% представляет из себя утомительный процесс, связанный с заполнением различных документов.

Регистрация клиента в лаборатории

Первый этап автоматизации ввод персональных данных клиента и заключение договора на оказание медицинских услуг. Smart Engines уже выпустил продукт для автоматизации ввода персональных данных. Намного проще вводить паспортные данные, просто сфотографировав документ на веб-камеру или приложив его на секунду к специализированному паспортному сканеру. Банки, мобильные операторы, транспортные компании уже оценили удобство технологии распознавания документов. Кстати, даже в РЖД автоматизировали кассы на вокзалах волшебными коробочками, которые за мгновение вводят паспортные данные.

Почему бы не использовать данный опыт в пунктах сдачи биоматериала? Сотрудник лаборатории с помощью веб-камеры или паспортного сканера за мгновение может заполнить анкету клиента. Другой вариант использование специального мобильного программно-аппаратного комплекса, состоящего из терминала сбора данных и портативного принтера, который используется для мгновенной печати наклеек на пробирки.

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

Если честно, не важно, какой способ автоматизации при регистрации клиентов использовать. Главное, чтобы специалисты биохимических лабораторий занимались своим профессиональным делом, а не заполнением различных бумаг, которые уже можно и нужно доверить искусственному интеллекту.

Контроль результатов ПЦР-теста

Второй этап автоматизации это контроль валидности выданных тестов. Нет ничего сложного, если надо проверить результаты теста у 100 человек. А если их тысячи (крупные офисы в мегаполисе) или десятки и даже сотни тысяч человек (аэропорта, ж/д вокзалы, речные и морские порты)? И каждый идет со своим индивидуальным бланком справки (как бы это смешно ни звучало, но нет единого шаблона таких справок о результатах ПЦР тестирования).

Помимо проверки непосредственно результата теста, важно следить за валидностью и подлинностью таких справок. Помните этот громкий международный скандал, когда 190 пассажиров рейса Москва Чжэнчжоу предоставили идентичные результаты серологического теста на антитела к COVID-19, что в результате привело к проблемам международного авиасообщения?

Система распознавания Smart Document Engine не только автоматически контролирует результаты в сертификатах тестирования COVID-19 для трех основных лабораторий России (Гемотест, Инвитро и Хеликс), но и возвращает все необходимые данные (как текстовые, так и графические), которые могут быть использованы для анализа валидности и подлинности таких сертификатов.

Помимо мобильного кейса, на базе Smart Document Engine можно построить полноценный роботизированный комплекс - автономный программно-аппаратный комплекс сканирования и анализа данных, совместимый с различными системами СКУД. Роботизированный комплекс способен за мгновение распознать данные из сертификата, контролировать наличие или отсутствие РНК и передавать управляющее действие в СКУД. Таким образом удастся полностью исключить человека из контроля тестов на загруженных пропускных пунктах.

Итого

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

Update. Буквально вчера была опубликована новость о том, что россиян, прибывающих из Турции и Танзании до 1 мая, а после 1 мая всех граждан, прибывающих из-за границы, обязали дважды сдать тест на COVID-19. Такие нововведения лишь подтверждают, что крайне необходима автоматизация процесса проведения ПЦР тестирования и контроля полученных результатов.

Подробнее..

Перевод Почему так сложно извлекать текст из PDF?

13.10.2020 16:15:52 | Автор: admin
Перевод статьи с сайта компании FilingDB, составляющей базу данных из документации европейских компаний

Согласно распространённым представлениям, извлечение текста из PDF не должно быть такой уж сложной задачей. Ведь вот он, текст, прямо у нас перед глазами, и люди постоянно и с большим успехом воспринимают содержимое PDF. Откуда взяться трудностям в автоматическом извлечении текста?

Оказывается, точно так же, как работа с именами людей сложна для алгоритмов из-за множества пограничных случаев и неправильных предположений, так и работа с PDF сложна из-за чрезвычайной гибкости PDF-формата.

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

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

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

Ниже описывается, какие особенности PDF-файлов делают сложной или даже невозможной задачу извлечения из них текста.

Защита от чтения PDF


Вы могли встречать PDF-файлы, запрещающие копировать из них текстовое содержимое. К примеру, вот, что выдаёт программа SumatraPDF при попытке скопировать текст из защищённого от копирования документа:



Интересно, что текст виден, но при этом программа для просмотра отказывается передавать выделенный текст в буфер обмена.

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

Естественно, это на самом деле не защищает от извлечения текста из PDF, поскольку любая достаточно продвинутая библиотека для работы с PDF позволит пользователю либо поменять эти флаги, либо проигнорировать их.

Символы за пределами страниц


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



К этой странице прикреплено больше текста, чем видно. В частности, в содержимом, связанном с нею, можно найти следующее:
KitKat отметила свой 75-й день рождения в 2010-м, но остаётся молодой и успевает за тенденциями, имея более 2,5 млн фанатов на Facebook. Её продукция продаётся в более чем 70 странах, а продажи хорошо растут в развитых странах и на развивающихся рынках, например, на Среднем Востоке, в Индии и России. Япония второй по величине рынок компании.


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

Такое иногда бывает из-за принимаемых в последнюю минуту решений о замене или удалении текста в процессе утверждения.

Мелкие или невидимые символы


Иногда на странице PDF можно встретить очень маленькие или вообще невидимые символы. Вот, к примеру, страница из отчёта Nestle за 2012 год.



На странице имеется мелкий белый текст на белом фоне, где написано следующее:
Wyeth Nutrition logo Identity Guidance to markets

Vevey Octobre 2012 RCC/CI&D


Иногда это делается для повышения доступности, с теми же целями, которым служит тег alt в HTML.

Слишком много пробелов


Иногда в PDF между буквами слов вставлены дополнительные пробелы. Это наверняка сделано в целях кернинга (изменения интервала между символами).

К примеру, в отчёте Hikma Pharma от 2013 года есть такой текст:



Если его скопировать, получим:

ch a i r m a n ' s s tat em en t

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

Недостаточно пробелов


Иногда в PDF не хватает пробелов, или они заменены другим символом.

Пример 1: следующая выдержка сделана из ежегодного отчёта SEB за 2017.



Извлечённый текст:

Tenyearsafterthefinancialcrisisstarted

Пример 2: отчёт Eurobank от 2013 содержит следующее:



Извлечённый текст:

On_April_7,_2013,_the_competent_authorities

И снова лучше всего оказалось использовать для таких страниц OCR.

Встроенные шрифты


PDF работает со шрифтами, мягко говоря, сложным образом. Чтобы понять, как хранятся в PDF текстовые данные, сначала нам нужно разобраться в глифах, названиях глифов и шрифтах.
  • Глиф это набор инструкций, описывающих, как изображать символ или букву.
  • Название глифа это название, связанное с этим глифом. К примеру, торговая марка для или а для глифа а.
  • Шрифт это список глифов и связанных с ними названий. К примеру, в большинстве шрифтов есть глиф, который большинство людей распознает, как букву а, при этом в разных шрифтах содержатся различные способы изображения этой буквы.


В PDF символы хранятся в виде чисел, кодов символов [codepoints]. Чтобы понять, что нужно выводить на экран, рендерер должен пройти цепочку от кода символа к названию глифа, а потом к самому глифу.

К примеру, PDF может содержать код символа 116, который он сопоставляет с названием глифа t, который, в свою очередь, сопоставлен глифу, описывающему, как выводить на экран символ t.



Большинство PDF используют стандартную кодировку символов. Кодировка символов это набор правил, присваивающих смысл самим кодам символов. К примеру:
  • В ASCII и Unicode для обозначения буквы tиспользуется код символа 116.
  • Unicode сопоставляет код символа 9786 глифу белый смайлик, который выводится, как, а в ASCII такой код не определён.


Однако в PDF-документе иногда используется собственная кодировка символов и специальные шрифты. Это может показаться странным, но документ может обозначать букву t кодом символа 1. Он сопоставит код символа 1 названию глифа c1, которое будет сопоставлено глифу, описывающему, как выводить букву t.



Хотя для человека итоговый результат ничем не отличается, машина запутается из-за таких кодов символов. Если коды символов не соответствуют стандартной кодировке, программным способом почти невозможно понять, что обозначают коды 1, 2 или 3.

Зачем же в PDF нужно включать нестандартные шрифты и кодировку?
  • Одна причина усложнить извлечение текста.
  • Вторая использование субшрифтов. В большинстве шрифтов есть глифы для очень большого числа кодовых символов, при этом в PDF может использоваться небольшое их подмножество. Для экономии места создатель PDF может обрезать все ненужные глифы и создать компактный субшрифт, который скорее всего будет использовать нестандартную кодировку.


Один из способов обойти это извлечь глифы шрифтов из документа, прогнать их через OCR, построить соответствие между шрифтом и Unicode. Это позволит вама переводить кодировку, связанную со шрифтом, в Unicode, к примеру: код символа 1 соответствует названию c1, которое, судя по глифу, должно обозначать t, которому соответствует код Unicode 116.

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

Распознавание слов и параграфов


Воссоздание параграфов и даже слов из аморфного символьного супа PDF-файлов задача сложная.

PDF-документ содержит список символов на странице, а распознавать слова и параграфы должен потребитель. Люди от природы эффективно справляются с этим, поскольку чтение навык распространённый.

Чаще всего используется алгоритм группировки, сравнивающий размеры, расположение и выравнивание символов, с целью определить, что является словом или параграфом.

У простейших реализаций таких алгоритмов сложность легко может достичь O(n), из-за чего обработка плотно забитых страниц может проходить долго.

Порядок текста и параграфов


Распознавание текста и порядка параграфов задача сложная по двум причинам.

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



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

Рассмотрим данное расположение компонентов в два столбца, где описано приготовление овощного салата.



В западном мире разумно предположить, что чтение идёт слева направо и сверху вниз. Поэтому мы, не изучая содержимого текста, можем свести все варианты к двум: A B C D и A C B D.

Изучив содержание, поняв, о чём там говорится, и зная, что овощи моют перед нарезкой, мы можем понять, что правильным порядком будет A C B D. Алгоритмически это определить крайне сложно.

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

Встроенные изображения


Нередко часть содержимого документа (или весь документ) оказывается отсканированным изображением. В таких случаях в нём нет текстовых данных, и приходится прибегать к OCR.

К примеру, ежегодный отчёт Yell от 2011 года доступен только в виде скана:



Почему бы просто всё не распознать?


Хотя OCR может помочь с некоторыми описанными проблемами, у него тоже есть свои недочёты.
  • Длительное время обработки. Запуск OCR на скане из PDF обычно отнимает на порядок больше времени (а то и ещё дольше), чем прямое извлечение текста из PDF.
  • Сложности с нестандартными символами и глифами. Алгоритмам OCR сложно работать с новыми символами смайликами, звёздочками, кружочками, квадратиками (в списках), надстрочными индексами, сложными математическими символами, и т.п.
  • Нет подсказок о последовательности текста. Упорядочивать текст, извлекаемый из PDF-документа, легче, поскольку большую часть времени этот порядок соответствует порядку вставки текста в файл. При извлечении текста с изображений таких подсказок не будет.


Тестирование


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

Что мы можем посоветовать для извлечения текста из PDF? Прежде всего убедиться, что у текста нет более удобного источника.

Если интересующие вас данные идут только в формате PDF, тогда важно понимать, что эта проблема кажется простой лишь на первый взгляд, а решить её со 100% точностью может и не получиться.
Подробнее..

Перевод Как машинное обучение помогает открыть мир Древней Японии

16.02.2021 18:22:34 | Автор: admin


Богатая история человечества оставила после себя огромное количество исторических документов и артефактов. Однако практически все документы, содержащие рассказы и записанный опыт, имеющие существенное значение для нашего культурного наследия, понятны только специалистам по причине языковых и письменных изменений, происходящими со временем. Специально к старту нового потока курса по Машинному Обучению делимся статьёй Алекса Лэмба аспиранта Монреальского университета и Монреальского института алгоритмов обучения (MILA), посвящённой использованию ML для распознавания древних рукописных текстов.


Относительно недавно были обнаружены десятки тысяч глиняных таблеток из Древнего Вавилона [1], но только несколько сотен учёных могут их перевести. Подавляющее большинство этих документов никогда не были прочитаны, даже если они были обнаружены в XIX веке. В качестве дополнительной иллюстрации задачи такого масштаба: в 1851 году в ходе экспедиции была собрана табличка из Повести о Гильгамеше, но о её значении стало известно лишь в 1872 году. Эта табличка содержит добиблейское повествование о потопе, имеющее огромное культурное значение как предвестник повествования о Ноевом ковчеге. Это глобальная проблема, но одним из наиболее ярких примеров является случай Японии.

С 800 до 1900 года нашей эры в Японии использовалась система письма под названием кудзусидзи, которую исключили из учебной программы в 1900 году, когда было реформировано начальное школьное образование. В настоящее время подавляющее большинство говорящих на японском языке не умеют читать тексты, которым более 150 лет. Объём этих текстов, состоящий из более чем трёх миллионов книг, но читаемый лишь горсткой учёных, прошедших специальное обучение, поражает. Только в одной библиотеке оцифровано 20 миллионов страниц таких документов. Общее количество (включая письма и личные дневники, но не ограничиваясь ими) оценивается более чем в миллиард документов. Учитывая, что очень немногие люди могут понять эти тексты (в основном имеющие докторскую степень по классической японской литературе и японской истории), было бы очень дорого и затратно в смысле времени финансировать учёных для перевода этих документов на современный японский язык. Это мотивировало использовать машинное обучение, чтобы разобраться в таких текстах автоматически.

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

Учитывая значение кудзусидзи для японской культуры, задачу использования компьютеров для содействия распознаванию кудзусидзи тщательно изучили в [2] посредством использования различных методов в глубоком обучении и компьютерного зрения. Однако эти модели не смогли достичь высоких показателей распознавания кудсусидзи. Это было вызвано недостаточным пониманием японской исторической литературы в сообществе оптического распознавания символов (OCR) и отсутствием стандартизированных наборов данных высокого качества.

Для решения этой проблемы Национальный институт японской литературы (NIJL) создал и выпустил набор данных кудзусидзи, курируемый Центром открытых данных в области гуманитарных наук (CODH). В настоящее время набор данных содержит более 4000 классов символов и миллион символьных изображений. До выхода этого набора данных кудзусидзи исследователи OCR пытались создавать наборы данных самостоятельно. Однако количество символов было очень ограниченным, что заставляло их модели работать плохо, когда они оценивались по всему спектру данных. NIJL-CODH решил эту проблему, предоставив большой и полный набор данных кудзусидзи для обучения и оценки модели.

Есть несколько причин, по которым распознавание кузусидзи является сложной задачей:

  • Большое значение имеет учёт как локального, так и глобального контекста. В связи с тем, что некоторые символы написаны в зависимости от контекста, при классификации важно учитывать несколько символов, а не рассматривать каждый символ в отдельности.
  • Общее количество символов в словаре очень велико. В частности, набор данных NIJL-CODH содержит более 4300 символов, на самом же деле их гораздо больше. Более того, набор данных следует распределению длинный хвост, поэтому в наборе данных, содержащем 44 книги, много символов, которые появляются лишь несколько раз или даже один раз.
  • Многие символы могут быть написаны несколькими способами на основе хентайганы. Хэнтайгана это старый способ написания хираганы или японских фонетических иероглифов с такой спецификой, что сегодня многие иероглифы могут быть нанесены на один иероглиф. Для современных японских читателей принципы хэнтайганы представляются сложными для понимания.
  • Тексты кудзусидзи часто пишутся вместе с иллюстрациями и замысловатыми фонами, которые трудно чисто отделить от текста. Они распространены потому, что самой популярной системой печати в современной Японии была печать на ксилографии, которая включает в себя резьбу по целому куску дерева вместе с иллюстрациями. Поэтому макет страницы может быть сложным и художественным, и не всегда его легко представить в виде последовательности.

Техника печати по дереву с использованием чернил и кисти

Текст кудзусидзи, вырезанный на ксилографическом брусе для печати

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

Образец стиля письма Чирасигаки в документе кудзусидзи

KuroNet


KuroNet это транскрипционная модель кудзусидзи, которую я разработал совместно с моими коллегами Тарином Клануватом и Асанобу Китамото из Центра открытых данных в гуманитарных науках ROIS-DS при Национальном институте информатики в Японии. Метод KuroNet мотивирован идеей обработки всей страницы текста целиком с целью захвата как большого диапазона, так и локальных зависимостей. KuroNet передаёт изображения, содержащие целую страницу текста, через остаточную архитектуру U-Net (FusionNet) для получения представления признака. Однако общее количество классов символов в нашем наборе данных относительно велико и насчитывает более 4300. Поэтому мы обнаружили, что прогнозирование точного символа в каждой позиции было слишком дорогостоящим с вычислительной точки зрения, и в надежде решить эту проблему ввели аппроксимацию, которая изначально оценивает, содержит ли некая пространственная позиция символ. Оттуда KuroNet рассчитывает только относительно дорогой классификатор символов в позициях, которые содержат символы, в соответствии с наблюдаемой истиной. Эта методика, являющаяся примером Teacher Forcing [обучения с принуждением], помогает значительно снизить использование памяти и сократить вычисления.

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

Работа [3], в которой интерполировали небольшое количество в направлении случайных различных примеров, сохраняя при этом исходную метку. Многие книги написаны на относительно тонкой бумаге, поэтому содержание соседней страницы часто слабо просматривается через бумагу. Изображения, создаваемые Mixup, выглядят несколько похожими на изображения, где слабо просматривается содержимое соседней страницы. Таким образом, Mixup может иметь дополнительное преимущество, помогая побудить модель игнорировать соседнюю страницу.

Для получения дополнительной информации о KuroNet, пожалуйста, ознакомьтесь с нашей работой KuroNet: Pre-Modern Japanese Kuzushiji Character Recognition with Deep Learning, которая была принята на Международной конференции по анализу и распознаванию документов (ICDAR) в 2019 году. [4].

Примеры транскрипции KuroNet на страницах со значением F1 выше 0,9

KuroNet может транскрибировать целую страницу кудзусидзи со средним временем 1,2 секунды на страницу, включая конвейер постобработки, который не оптимизировался тщательно. Несмотря на то что производительность всё ещё сильно различается на разных книгах, мы обнаружили, что ксилографические печатные книги периода Эдо (XVIIXIX веков) это те книги, на которых KuroNet показывает хорошие результаты. Мы обнаружили, что модель борется с необычными размерами и редкими символами. Кроме того, мы оценили модель на контрольном наборе страниц из различных книг и обнаружили, что худшими книгами оказались словари, содержащие много необычных символов, и кулинарная книга с множеством иллюстраций и необычных макетов.

Конкурс по распознаванию кудзусидзи на Kaggle



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

В конечном счёте после трёх месяцев соревнований, в которых приняли участие 293 команды, 338 участников и 2652 заявки, победитель получил оценку F1 в 0,950 баллов. Когда мы оценивали KuroNet в тех же обстоятельствах, то обнаружили, что она получила оценку F1 0,902, с ней нейросеть оказалась бы на двенадцатом месте, что, хотя и приемлемо, намного ниже лучших решений.

Финал конкурса Распознавание кудзусидзи на Kaggle (топ-10)

Есть несколько важных уроков, которые мы извлекли из этого конкурса:

  • Некоторые существующие алгоритмы обнаружения объектов достаточно хорошо работают над этой задачей, даже когда применяются как есть, из коробки. Например, Faster R-CNN и Cascade R-CNN дали отличные результаты без модификаций или каких-либо специфических для кудзусидзи приёмов. Учитывая то, насколько распознавание со страниц с кудзусидзи отличаются от обычных задач по обнаружению объектов, было довольно удивительно, что эти нейросети справляются так хорошо.
  • В то же время другие методы без модификации работают плохо. Например, You Only Look Once (YOLO) выполнил задачу довольно плохо, несмотря на значительные усилия. Другие методики, использующие CenterNet, работали хорошо, но требовали больших усилий и специфической для домена настройки, чтобы заставить их работать.
  • Несколько ведущих подходов имели модели, которые выполняли обнаружение и классификацию совместно. Которые не использовали искусные методы включения окружающих символов в своём классификационном конвейере.
  • Лишь немногие из лучших решений использовали языковые модели или пытались трактовать символы как последовательность.

Будущие исследования


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

Даже в области расшифровки кудзусидзи всё ещё существуют значительные открытые проблемы. Одна из проблем заключается в том, что размеченные данные обучения, как правило, поступают с целых страниц текста, с акцентом на документы из определённого периода (в основном позднего периода Эдо, XVIIXIX веков). Однако есть много других типов текста кудзусидзи, которые человек может захотеть расшифровать. Некоторые документы написаны от руки, а другие напечатаны (обычно с использованием ксилографии). Некоторые типы страниц имеют нетипичное содержание, которое редко встречается, например титульные страницы книг. В Японии я встретил человека, который путешествовал по горам и нашёл каменный указатель пути, написанный на кудзусидзи, и хотел, чтобы его расшифровали. Обобщение этих очень разных типов данных, особенно при изменении носителя записи, может быть довольно трудным, хотя привлекает всё большее внимание как область исследований в машинном обучении (методика минимизации инвариантного риска).

Работа [5] фокусируется именно на этой проблеме.

Ещё одна интересная открытая проблема возникает из-за того, что все предложенные методы только конвертируют документы кудзусидзи в современный японский шрифт. Это делает отдельные символы узнаваемыми, но весь текст по-прежнему довольно трудно читать. Из разговоров с носителями японского языка у меня сложилось впечатление, что обычный японец сможет читать, но это умеренно труднее, чем для современных англоговорящих людей читать Шекспира. Таким образом, захватывающей и самой открытой проблемой машинного обучения будет преобразование старого языка в лексику и грамматику современного японского. Эту проблему можно решить, так как часто устаревшее слово можно заменить более современным, но также эта проблема очень глубокая, поскольку правильно перевести поэзию и красивую прозу с её многочисленными нюансами может быть почти невозможно. Кроме того, отсутствие (или небольшой объем) чётко согласованных парных данных из классического и современного японского может мотивировать воспользоваться недавними исследованиями неконтролируемого машинного перевода с низким уровнем ресурсов.

Я считаю, что это одно из самых эффективных приложений для машинного обучения сегодня, и для достижения прогресса потребуется сотрудничество как между теми, кто имеет опыт работы с историческими документами в конкретной предметной области, так и исследователями прикладного машинного обучения, а также исследователями базовых алгоритмов ML. Это требует междисциплинарных усилий. Историки могут помочь определить наиболее важные подзадачи и интуитивно судить о том, действительно ли полезны метрики. Исследователи прикладного машинного обучения могут создавать модели для оптимизации этих показателей и выявления недостатков современных алгоритмов. Исследователи базового машинного обучения могут помочь улучшить алгоритмы. Например, наша работа по японскому языку требует более совершенных алгоритмов для Few-shot Learning, а также лучшего обобщения для меняющейся среды, и обе эти проблемы всё более широко изучаются в сообществе исследователей ML.

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

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




image
Подробнее..

Распознаем номера автомобилей. Разработка multihead-модели в Catalyst

11.06.2021 08:06:47 | Автор: admin

Фиксация различных нарушений, контроль доступа, розыск и отслеживание автомобилей лишь часть задач, для которых требуется по фотографии определить номер автомобиля (государственный регистрационный знак или ГРЗ).

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

Сделать модель для распознавания можно с помощью разных подходов, например, путем поиска и определения отдельных символов, или в виде задачи image-to-text. Мы рассмотрим модель с несколькими выходами (multihead-модель). В качестве датасета возьмём датасет с российскими номерами от проекта Nomeroff Net. Примеры изображений из датасета представлены на рис. 1.

Рис. 1. Примеры изображений из датасета

Общий подход к решению задачи

Необходимо разработать модель, которая на входе будет принимать изображение ГРЗ, а на выходе отдавать строку распознанных символов. Модель будет состоять из экстрактора фичей и нескольких классификационных голов. В датасете представлены ГРЗ из 8 и 9 символов, поэтому голов будет девять. Каждая голова будет предсказывать один символ из алфавита 1234567890ABEKMHOPCTYX, плюс специальный символ - (дефис) для обозначения отсутствия девятого символа в восьмизначных ГРЗ. Архитектура схематично представлена на рис. 2.

Рис. 2. Архитектура модели

В качестве loss-функции возьмём стандартную кросс-энтропию. Будем применять её к каждой голове в отдельности, а затем просуммируем полученные значения для получения общего лосса модели. Оптимизатор Adam. Используем также OneCycleLRWithWarmup как планировщик leraning rate. Размер батча 128. Длительность обучения установим в 10 эпох.

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

Кодирование

Далее рассмотрим основные моменты кода. Класс датасета (листинг 1) в общем обычный для CV-задач на Pytorch. Обратить внимание стоит лишь на то, как мы возвращаем список кодов символов в качестве таргета. В параметре label_encoder передаётся служебный класс, который умеет преобразовывать символы алфавита в их коды и обратно.

class NpOcrDataset(Dataset):   def __init__(self, data_path, transform, label_encoder):       super().__init__()       self.data_path = data_path       self.image_fnames = glob.glob(os.path.join(data_path, "img", "*.png"))       self.transform = transform       self.label_encoder = label_encoder    def __len__(self):       return len(self.image_fnames)    def __getitem__(self, idx):       img_fname = self.image_fnames[idx]       img = cv2.imread(img_fname)       if self.transform:           transformed = self.transform(image=img)           img = transformed["image"]       img = img.transpose(2, 0, 1)             label_fname = os.path.join(self.data_path, "ann",                                  os.path.basename(img_fname).replace(".png", ".json"))       with open(label_fname, "rt") as label_file:           label_struct = json.load(label_file)           label = label_struct["description"]       label = self.label_encoder.encode(label)        return img, [c for c in label]

Листинг 1. Класс датасета

В классе модели (листинг 2) мы используем библиотеку PyTorch Image Models для создания экстрактора фичей. Каждую из классификационных голов модели мы добавляем в ModuleList, чтобы их параметры были доступны оптимизатору. Логиты с выхода каждой из голов возвращаются списком.

class MultiheadClassifier(nn.Module):   def __init__(self, backbone_name, backbone_pretrained, input_size, num_heads, num_classes):       super().__init__()        self.backbone = timm.create_model(backbone_name, backbone_pretrained, num_classes=0)       backbone_out_features_num = self.backbone(torch.randn(1, 3, input_size[1], input_size[0])).size(1)        self.heads = nn.ModuleList([           nn.Linear(backbone_out_features_num, num_classes) for _ in range(num_heads)       ])     def forward(self, x):       features = self.backbone(x)       logits = [head(features) for head in self.heads]       return logits

Листинг 2. Класс модели

Центральным звеном, связывающим все компоненты и обеспечивающим обучение модели, является Runner. Он представляет абстракцию над циклом обучения-валидации модели и отдельными его компонентами. В случае обучения multihead-модели нас будет интересовать реализация метода handle_batch и набор колбэков.

Метод handle_batch, как следует из названия, отвечает за обработку батча данных. Мы в нём будем только вызывать модель с данными батча, а обработку полученных результатов расчёт лосса, метрик и т.д. мы реализуем с помощью колбэков. Код метода представлен в листинге 3.

class MultiheadClassificationRunner(dl.Runner):   def __init__(self, num_heads, *args, **kwargs):       super().__init__(*args, **kwargs)       self.num_heads = num_heads    def handle_batch(self, batch):       x, targets = batch       logits = self.model(x)             batch_dict = { "features": x }       for i in range(self.num_heads):           batch_dict[f"targets{i}"] = targets[i]       for i in range(self.num_heads):           batch_dict[f"logits{i}"] = logits[i]             self.batch = batch_dict

Листинг 3. Реализация runnerа

Колбэки мы будем использовать следующие:

  • CriterionCallback для расчёта лосса. Нам потребуется по отдельному экземпляру для каждой из голов модели.

  • MetricAggregationCallback для агрегации лоссов отдельных голов в единый лосс модели.

  • OptimizerCallback чтобы запускать оптимизатор и обновлять веса модели.

  • SchedulerCallback для запуска LR Schedulerа.

  • AccuracyCallback чтобы иметь представление о точности классификации каждой из голов в ходе обучения модели.

  • CheckpointCallback чтобы сохранять лучшие веса модели.

Код, формирующий список колбэков, представлен в листинге 4.

def get_runner_callbacks(num_heads, num_classes_per_head, class_names, logdir):   cbs = [       *[           dl.CriterionCallback(               metric_key=f"loss{i}",               input_key=f"logits{i}",               target_key=f"targets{i}"           )           for i in range(num_heads)       ],       dl.MetricAggregationCallback(           metric_key="loss",           metrics=[f"loss{i}" for i in range(num_heads)],           mode="mean"       ),       dl.OptimizerCallback(metric_key="loss"),       dl.SchedulerCallback(),       *[           dl.AccuracyCallback(               input_key=f"logits{i}",               target_key=f"targets{i}",               num_classes=num_classes_per_head,               suffix=f"{i}"           )           for i in range(num_heads)       ],       dl.CheckpointCallback(           logdir=os.path.join(logdir, "checkpoints"),           loader_key="valid",           metric_key="loss",           minimize=True,           save_n_best=1       )   ]     return cbs

Листинг 4. Код получения колбэков

Остальные части кода являются тривиальными для Pytorch и Catalyst, поэтому мы не станем приводить их здесь. Полный код к статье доступен на GitHub.

Результаты эксперимента

Рис. 3. График лосс-функции модели в процессе обучения. Оранжевая линия train loss, синяя valid loss

В списке ниже перечислены некоторые ошибки, которые модель допустила на тест-сете:

  • Incorrect prediction: T970XT23- instead of T970XO123

  • Incorrect prediction: X399KT161 instead of X359KT163

  • Incorrect prediction: E166EP133 instead of E166EP123

  • Incorrect prediction: X225YY96- instead of X222BY96-

  • Incorrect prediction: X125KX11- instead of X125KX14-

  • Incorrect prediction: X365PC17- instead of X365PC178

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

Заключение

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

Спасибо за внимание! Надеемся, что наш опыт был вам полезен.

Больше наших статей по машинному обучению и обработке изображений:

Подробнее..

Как мы роботизировали документооборот крупнейшего европейского ритейлера

28.01.2021 12:17:06 | Автор: admin

В последнее время все чаще слышно про RPA или Robotic Process Automation. С одной стороны, говорят о его эффективности для банковского сектора и крупных корпораций, с другой про применимость и в среднем, и даже в малом бизнесе. На днях на Хабре вышла обзорная статья про интеллектуальную обработку документов с помощью RPA и мы подумали, что хабравчанам также будет интересен рассказ про наш опыт реализации такого проекта в деталях.

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

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

Идеальный сценарий для RPA! А для нас отличная возможность показать, как он грамотно и продуктивно реализуется.

С чем предстояло работать

Итак, нам предстояло создать робота, который будет трудиться в одном из звеньев стандартной рабочей схемы любого ритейла. Схема очень простая и расхожая: ритейлер формирует заказ на поставку товаров в свои магазины, после его доставки поставщиком производится приемка и после обработки документов оплата.

Описанные выше проблемы возникали на этапе обработки документов. На стороне заказчика каждый день на эту задачу тратилось 72 часа. Это 9 полноценных бухгалтерских рабочих дней! Роботизации этого проекта от нас и ждали.

Подробное описание процесса сверки, с которым мы должны были работать:

Итак, что нужно сделать бухгалтеру, чтобы сверить доки? По готовым к сверке заказам в учетной системе формируется еxcel-отчет реестр заказов с их номерами, номерами приемки, магазином, наличием расхождений по количеству и стоимости и т.д. Чтобы сэкономить время, при работе с бумажными первичными документами бухгалтер выгружает их сканы из ЭХД (поиск в Directum по штрихкоду из отчета). Сканы нужны для того, чтобы сверить цены в заказе с ценами из документа поставщика.

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

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

После согласования бухгалтер выполняет процесс сопоставления счетов-фактур в системе. Этот процесс может занимать достаточно много времени, эта функция работает нестабильно.

Как видите, большая часть этого процесса механическая рутина. Идеальная цель для автоматизации! Однако классический путь доработки ERP-системы с интеграцией ее с СХД был заказчику закрыт: бэклог команд, занимающихся сопровождением и развитием этих систем, был расписан на месяцы вперед, а доработка системы сложна и дорога. В общем, классический кейс а давайте лучше робота: с ним не нужно будет дорабатывать информационные системы.

В качестве платформы роботизации был выбран UiPath: абсолютный лидер на рынке РФ и один из лидеров глобального рынка RPA, кроме того, уже обкатанный в головном офисе нашего партнера в Европе.

Чего мы хотели от робота?

У этой роботизации было несколько основных и вспомогательных целей. Основные цели были достаточно стандартные: процесс нужно было автоматизировать не менее чем на 90% (звучит впечатляюще, но для мира RPA это норма), сократив затраты на него по сравнению с ручным трудом. Второстепенные цели были любопытнее:

выявить аномальные расхождения, которые человек может пропустить;

снизить риск ошибки специалистов по товарному предложению;

предотвратить расширение штата бухгалтеров при увеличении объемов поставок;

ускорить проведение оплат поставщикам.

На основе всего этого мы поставили перед собой такие задачи:

разработать роботов, которые будут выполнять работу бухгалтеров;

разработать сервис их взаимодействия с бухгалтерами и СТП; не допускающий использования вил и факелов

реализовать процесс извлечения данных из сканов бумажных документов;

интегрировать роботов с системой распознавания бумажных документов.

Ну и как же без дополнительных требований от заказчика:

runtime-лицензии роботов должны использоваться максимально эффективно. Лишние действия, задержки все это должно быть сведено к минимуму;

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

отсутствие у роботов дублирования функций;

приоритизация срочных задач (например, отчетов);

минимизация поддержки решения после ввода в эксплуатацию;

автоматический онлайн-расчет окупаемости (дэшборд в Confluence);

и еще, чтоб участников процесса письмами/уведомлениями не спамило.

Подход к проблеме и проект

С самого начала заказчику было ясно, что автоматизировать процесс на 100% невозможно, да и не нужно: не все бумажные документы нормально распознаются, не во всех бумагах будут артикулы для сопоставления с заказами ритейлера, поставщики наверняка будут допускать ошибки Поэтому человека мы из процесса не исключали: он в любом случае должен был остаться в роли супервайзера, а также для решения нестандартных задач.

Итак, сформулировав процесс AS-IS, мы декомпозировали его на подпроцессы для роботизации. Получилось вот так:

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

Однотипные задачи мы сразу стали собирать в совместную обработку, помня о требовании об эффективном расходовании runtime-лицензии. На практике это значило, что если нужно выгрузить из ЭХД 10 доков, то открывать его мы будем 1 раз, выгружать нужное и 1 раз закрывать, а не открывать и закрывать для каждого документа.

Архитектуру системы полностью определило решение формировать списки задач для каждого роботизируемого процесса в СУБД (MS SQL). Тем более что, как мы выяснили, отчёт из учетной системы (на базе СУБД ORACLE) можно выгружать запросом. Поэтому мы решили сделать Link к БД учетной системы и настроить Job в БД для регулярной выгрузки новых приемок, готовых к сопоставлению. Этот Job будет также анализировать полученные данные и переводить приемки на нужный этап обработки: Требует согласования с СТП, Требует выгрузки в систему распознавания, Передать в оплату и т.д.

Роботу оставалась только грязная работа по выполнению механических операций в соответствии с установленным статусом.

Что еще нужно было определить перед тем, как приступить к работе?

Архитектура распознания документов

Наш робоподопечный должен был уметь распознавать документы такое зрение ему мы сделали на известной платформе ABBYY FlexiCapture. У нее есть, во-первых, готовые шаблоны распознавания для первичных документов (мы лишь немного докрутили их под примеры заказчика). Во-вторых, она предоставляет удобный интерфейс для верификации результатов распознавания, а это экономит время тому, кто верифицирует.

В этом процессе было несколько критически важных точек: качественное извлечение табличной части документа; проверка артикулов в БД (да, номенклатура также выгружалась из БД ERP-системы); сверка суммы документов; проверка совпадения штрихкода на документе и в ERP.

В общем виде процесс распознавания получился следующий:

1. Робот получает сразу все задачи по выгрузке бумажных документов из ЭХД. При этом в базе данных для каждого процесса подготовлена соответствующая вьюха, возвращающая список приемок и необходимые атрибуты для конкретного процесса.

2. Робот открывает ЭХД и начинает выгрузку сканированных образов бумажных документов в горячую папку ABBYY FlexiCapture. Для каждого документа формируется файл описания, чтобы система ABBYY понимала, о какой приемке идет речь, и могла корректно выполнять запросы к справочникам ERP.

3. Файл изображения попадает в систему распознавания, типизируется, из него извлекаются табличная часть, штрихкод и общая сумма документа. При этом совпадение штрихкода, наличие артикулов в БД, соответствие суммы всех цен на товары в таблице итоговой сумме документа гарантирует, что документ был распознан верно и ошибок тут быть не может. Значит, можно пропустить пользовательский этап верификации!

3.5. Если же ошибки присутствуют, то бухгалтеру ответственного за этот документ отдела приходит через e-mail напоминание о необходимости верифицировать документ. В приложении верификации видно документы с ошибками.

4. ABBYY FlexiCapture экспортирует проверенные данные в БД и устанавливает статус для соответствующих приемок Готово к дальнейшей обработке.

Формирование интерфейса

Для взаимодействия с пользователями изначально планировали использовать Jira, но затем мы приняли решение упростить интерфейс. Мы разработали собственный сервис по взаимодействию с пользователями. Если требуется согласовать расхождение, робот присылает сотруднику по товарному предложению ссылку в письме. При переходе по ней формируется web-страница, при этом проверяется, не был ли этот заказ уже согласован, а также имеет ли данный человек все необходимые права. На этой странице сотрудник выполняет согласование и вводит комментарий. После этого приемка в БД получает соответствующий статус для дальнейшей обработки роботом.

Что важно отслеживать в такой ситуации? Согласованные приемки, сотрудника, который их согласовал, а также его возможный комментарий. Но главное обязательно нужно выполнить дополнительную проверку согласования бухгалтером (в компании уже был случай, когда СТП по ошибке согласовал очень крупное расхождение в цене).

Формирование отчетности

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

Всего отчетов было реализовано четыре:

отчет по задачам бухгалтеров (требуются ли действия от бухгалтера?);

отчет главного бухгалтера (по задачам всех бухгалтеров);

общий отчет по выявленным расхождениям;

детальный отчет по расхождениям (с суммами по приёмкам и по поставщикам).

Каждый из них формируется на основе вьюхи из БД, в которой есть все необходимые данные. Роботу остается только сделать запрос, красиво и удобно его оформить и предоставить пользователю на блюдечке с голубой каемочкой.

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

Формирование графиков в Confluence

Помимо отчетов, робот также должен был строить real-time графики окупаемости самого себя. Для этого был разработан набор представлений в БД, в которых рассчитываются ключевые метрики робота. Методология расчета метрик включает в себя все затраты на роботизацию процесса, в том числе стоимость лицензий, серверов, стоимость наших услуг, а также зарплату бухгалтеров, ведь полностью мы их не исключили из процесса. Для отображения графика на странице в Confluence используется плагин Database Query.

С какими трудностями мы столкнулись

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

Проблемы при заказе отчетов как сделать так, чтобы робот выполнял приоритетные задачи раньше других?

После реализации персонализированных отчетов мы столкнулись с проблемой приоритизации задач.

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

Для решения проблемы мы выделили срочные задачи в отдельную очередь и настроили робота на проверку наличия заданий в ней. Если такие возникают, обычные процессы останавливаются, и стартует срочный. Также было решено сделать робота-диспетчера (мы назвали его Доминатор), который запускался после каждого процесса и выбирал, какой процесс запустить следующим.

Таким образом, при наличии в очереди задач на формирование отчета, робот практически сразу брался за их выполнение.

Как заставить робота самого себя поднимать

С самого начала заказчик предупредил нас, что системы, с которыми предстояло работать роботу, нестабильны. Соответственно, ему предстояло качественно обрабатывать их ошибки.

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

В качестве основы всех процессов мы использовали Enhanced REFramework. Нас устраивали его расширенное логирование и централизованная обработка исключений.

Робот копил информацию о произошедших ошибках и выполнял соответствующие действия в зависимости от типа ошибки. В алгоритмы обработки ошибок были заложены попытки решить проблему локально, например, перезапустить текущую страницу в браузере. Если это не удавалось, то ошибка передавалась на централизованную обработку. Если ошибка повторялась 3 раза, то робот переходил к следующей приемке, а для этой устанавливался статус Завершено с ошибкой с отправкой уведомления администратору.

Переиспользование частоиспользуемых процессов (инвоуков)

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

Кастомные активности

Не обошлось без разработки собственных активностей. Например, мы не нашли в публичном доступе активностей для группировки, условного форматирования, задания размера колонок и строк в Excel. Также не было функционала, чтобы отметить письмо как непрочитанное, и других возможностей при работе с почтой Exchange. Мы разработали как свои собственные активности с нуля, так и расширили возможности уже существующих в UiPath активностей. Далее мы упаковали их в библиотеки UiPath с некоторыми общими пространствами имен, например:

работа с БД (получение данных по приемкам, по отчетам, сохранение статусов и т.д.);

работа с почтой (получение запросов от бухгалтеров, отправка уведомлений);

работа с Excel (форматирование, группировка, сортировка и т.д.);

работа с учетными системами (авторизация, проверка ошибок).

Все это используется в разных роботизируемых процессах разными роботами и хранится в Оркестраторе, оставаясь доступным для всех разработчиков.

Курьезный случай исчезновение штрихкодов

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

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

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

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

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

Результаты

Как мы говорили в самом начале, от нас требовалась оптимизация рабочего процесса на 90%. Как вычислить этот показатель? Для этого нужно сравнить время, которое будет потрачено на нужный процесс с роботом и без него. Мы определили, сколько занимали все составляющие роботизированной работы выгрузка актов, работа в ABBYY, составление отчетов и даже написание писем; задали резерв на обслуживание робота.

И выяснили, что с задачами, на которые штат бухгалтеров ежедневно тратил время девяти полностью занятых профессионалов, робот справляется примерно за половину одного рабочего дня (0,47 рабочего дня, если быть точным). Точный показатель 94% оптимизации. Это была победа!

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

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

В частности, прямо сейчас мы роботизируем для него два других процесса, в том числе обработку актов сверки поставщиков.

Спасибо всем дочитавшим до этого момента. Если у вас возникли вопросы, мы будем рады на них ответить!

Подробнее..

Как документ на мобильнике распознается от простого к сложному

17.09.2020 10:15:44 | Автор: admin

Привет, хабр! С 2015-го года мы публикуем в нашем блоге посты, в которых описываем различные аспекты распознавания документов, удостоверяющих личность, (и не только) на мобильных устройствах (и не только). В комментариях нас несколько раз просили рассказать в целом о том, как устроена наша система распознавания, но мы долго откладывали, т.к. описать это в двух словах достаточно сложно.

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

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

Принципы

В первую очередь очертим требования, которые мы закладывали при проектировании системы. Четыре основных принципа, лежащих в основе Smart IDReader:

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

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

3. Автономность. Безопасность данных - превыше всего. Самый безопасный способ хранения данных - не хранить данные, самый безопасный способ передачи данных - не передавать данные. По нашему мнению, мобильная система распознавания обязана быть построена так, чтобы при распознавании никакие данные за пределы оперативной памяти конечного устройства не уходили. Следовательно, вся обработка изображений и все распознавание должно происходить непосредственно на устройстве, что накладывает дополнительные ограничения (см. п. 2) на используемые алгоритмы.

4. Масштабируемость. Наша первая система распознавания для мобильников (вот эта) поддерживала только внутренний паспорт РФ. При этом в мире существуют тысячи документов, удостоверяющих личность, и система должна быть устроена таким образом, чтобы добавить поддержку нового документа можно было быстро. Кроме того, добавление нового типа документа не должно требовать большого количества примеров, поскольку их неоткуда взять.

Трудности

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

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

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

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

Поиск документа

Система Smart IDReader в её современном состоянии поддерживает большое количество разнообразных документов, но при её проектировании главным образом рассматривались документы, обладающие жесткой структурой. Грубо говоря, документом (точнее, страницей документа) с жёсткой структурой является документ, в котором все статические элементы совпадают на просвет - если стереть с двух разных экземпляров документа все реквизиты, то полученные бланки будут совпадать.

На первом этапе обработки изображения системой Smart IDReader мы детектируем страницы документа (мы их условно называем шаблонами). Шаблоны документов, которые мы ищем, нам заранее известны, все они представляются как изначально плоские прямоугольники (с известными физическими размерами), однако на изображении они могут быть проективно искажены. Кроме того, у одного документа могут быть несколько шаблонов: к примеру, передняя и оборотная стороны ID-карточки, или две страницы паспорта.

Для поиска шаблонов на изображении мы используем (иногда совместно) три основных подхода:

1. Быстрый поиск проективно искаженного прямоугольного объекта с известными соотношениями сторон. Метод основан на предварительном поиске прямых линий быстрым преобразованием Хафа и аккуратной переборной схеме. Про этот метод мы уже писали на Хабре, также про него можно почитать в этом докладе.

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

3. Наиболее общий подход, основанный на связке: особые точки + дескрипторы + RANSAC. Вначале на входном изображении производится поиск особых точек (мы используем модификацию особых точек YAPE для изображений с большим разбросом локального контраста, про эту модификацию можно почитать в этом докладе) и для каждой точки вычисляется локальный дескриптор (в нашем случае - методом RFD, модифицированным с целью ускорения). Далее в индексе известных дескрипторов запуском серии поисков ближайших соседей выявляются шаблоны-кандидаты. После этого кандидаты верифицируются при помощи метода RANSAC с учетом геометрического расположения особых точек. Этот метод используется в Smart IDReader для поиска и типизации подавляющего числа типов идентификационных документов. Подробнее про него можно почитать в этом докладе.

Поиск полей

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

На этапе поиска полей мы прибегаем к (слабо определенному) понятию зоны документа - региону шаблона, который содержит набор нужных нам полей, обладающих примерно одинаковой структурой. К примеру, если поля повернуты на какой-то угол из-за дефекта печати, но в рамках зоны все поля повернуты на один и тот же угол. Для того, чтобы найти поля, вначале изображение зоны проективно вырезается из исходного изображения документа, с минимальным разрешением, достаточным для работы дальнейших алгоритмов.

Непосредственно поиск полей производится в два этапа: в начале морфологическими преобразования изображения зоны стирается шум и текстовые поля превращаются в почти однотонные прямоугольники.

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

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

Обработка и распознавание полей

Теперь, когда мы наконец нашли текстовые поля, пришло время их распознавать, верно? Не совсем. Сначала задачу для распознавателя текста можно несколько облегчить, предварительно обработав изображения текстовых полей, исходя из априорных знаний о документе и о структуре распознаваемых полей. К примеру, зная, что на этом типе документа вот это конкретное поле содержится в ячеистой разграфке, или, если оно подчеркнуто, - прямые линии можно предварительно снять, используя морфологические операции. Или если мы знаем, что текстовые поля напечатаны курсивом, или если они рукописные, то предварительно можно исправить их наклон, используя поиск угла наклона букв при помощи быстрого преобразования Хафа (про это можно почитать здесь). При предварительной обработке полей зачастую рассматривается не каждое поле в отдельности, а сразу группа полей, поскольку несколько полей в рамках одной зоны, как правило, наклонены на один и тот же угол, либо написаны от руки одним и тем же почерком.

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

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

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

Для некоторых полей, используя априорную информацию о синтаксисе и семантике, могут применяться алгоритмы статистической пост-обработки результатов распознавания, которые также позволяют повысить ожидаемую точность результата. Про алгоритмы пост-обработки мы уже писали в этой статье.

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

Использование нескольких кадров

При использовании последовательности кадров Smart IDReader предполагает, что в рамках одной сессии распознавания на разных кадрах видеопотока виден один и тот же документ (это не означает, однако, что один и тот же шаблон - к примеру, при съемке ID-карты в рамках одной сессии документ можно перевернуть, показав оборотную сторону). Аккумулирование информации с нескольких кадров может быть полезно почти на любом этапе процесса анализа документа - начиная с поиска документа (как для дополнительной фильтрации набора возможных кандидатов, так и для уточнения геометрического позиционирования), и заканчивая распознаванием конкретного поля.

В системе Smart IDReader используется подход комбинирования результатов распознавания текстовый полей с нескольких кадров, что позволяет значительно повысить точность распознавания в видеопотоке и использовать даже информацию о частичном распознавании поля (если, к примеру, на каком-то кадре поле было прикрыто бликом). О методах комбинирования результатов распознавания текстовых строк можно прочитать, например, в этой статье.

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

Последним по порядку, но не по значению, аспектом работы с видеопотоком является анализ голограмм и других OVD (Optical Variable Devices) - элементов защиты документов, которые меняют свой внешний вид при изменении освещения или угла обзора. Для того, чтобы их детектировать и верифицировать их наличие, последовательность кадров просто необходима по определению. Рассматривая только одно изображение, верифицировать наличие такого элемента защиты нельзя.

Детали, детали

В этой статье мы постарались описать основные блоки нашей системы и ключевые принципы, на которые мы ориентировались при разработке. Разумеется, в таком формате невозможно охватить полный набор компонентов и нюансов системы распознавания документов. Поэтому в данную статью не вошли описания таких компонентов, как детектор рукописи, детектирование ключевых объектов (гербы, фотографии, подписи, печати), быстрое детектирование машиночитаемой зоны (MRZ) и её использование для уточнения позиционирования и типизации документов, форматирование полей до межкадрового комбинирования, определение степени уверенности распознавания и многое-многое другое. Даже грубое описание системы потребовало с десяток ссылок на научные тексты, и решение задачи, которая кому-то может показаться простой, достигается с помощью серьезных научных достижений большого коллектива. По теме распознавания документов мы публикуем порядка 40 научных текстов в год и регулярно подаем заявки на патенты.

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

Спасибо вам за внимание! Если вам интересно подробнее узнать о каких-то специфических компонентах нашей системы распознавания, пишите нам в комментариях!

Подробнее..

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

25.11.2020 10:14:05 | Автор: admin


Сегодня мы, Smart Engines, расскажем историю, как работали в пандемию и что у нас из этого получилось. Расскажем, когда и для кого размер приложения имеет значение, что такое живость документов и куда катится этот дивный мир распознавания.

История о том, как мы фактически перезапустили Smart Engines в продуктовом плане. И этот рассказ будет совсем не про то, как мы привлекли миллиардные инвестиции за счет копеечного ребрендинга или удачно на дистанционке ухватили государственных субсидий для поддержания бизнеса. Нет, мы по натуре не из тех, кто, как говорится, и рыбку съесть, и в пруд не лезть. Причиной многомесячных упорных работ было полное переосмысление концепции, архитектуры и назначения наших движков распознавания. Но обо всем по порядку.

Пять лет назад мы вышли на рынок с простым продуктом движок распознавания паспорта на мобильных устройствах. Функциональность была крайне проста: вы показываете движку паспорт в видеопотоке, а он возвращает в текстовом виде атрибуты документа (причем делал он это без какой-либо связи с внешними серверами, непосредственно все распознавание осуществлялось на устройстве). Никаких сверок с базами валидных паспортов, никаких запросов автоматических в МВД на предмет мошенничества, никаких других сервисов KYC. Только быстрое и качественное распознавание, которое, по нашим представлениям, должно было отчасти перевернуть цифровой мир.

Получилось. В марте 2015 года мы представили первую версию продукта Smart PassportReader, о чем трубили на всех ресурсах (чего только стоит наша статья на Хабре, где мы во всех красках рассказываем об особенностях поставленной задачи и о способах применения технологии в бизнесе). Хотя первоначально рынок вяло отреагировал на нашу инновацию, сегодня же только отдельные банки не используют эту технологию в мобильных приложениях.

С ростом количества клиентов росло и количество запросов на добавление новых функций и возможностей. Расширялась база поддерживаемых типов документов, увеличивался список поддерживаемых языков, количество используемых, раздувалась кодовая база (несмотря на то, что за прошедшие пять лет отдельные подсистемы были переписаны несколько раз с нуля, чтобы не утонуть в будущем в поддержке легаси кода). Конечно, это все сказывалось на финальном объеме SDK объем Smart IDReader в полной комплектации под iOS стал весить больше 200 Мб. Много? Да, безумно много! Однако в глаза скорее бросался огромный список возможностей ПО, чем какие-то мегабайты.

Дистанционная работа с ее размеренностью и однообразностью дала нам возможность детально проанализировать наш продукт и пообщаться с клиентами, как они используют наше SDK. Оказалось, что многие клиенты используют функционал распознавания платежных карт и штрихкодов отдельно от паспортов (фактически, в разных бизнес-кейсах и приложениях), что дало нам осознание необходимости продукта распознавания таких объектов. Назвали мы этот продукт Smart Code Engine. Само собой, мы не только выделили ограниченную функциональность из предыдущего SDK, сформировали отдельную команду мощных ребят, которые существенно расширили возможности движка в части распознавания кодифицированных объектов. А главное, сформировали ключевые требования к продукту: работать быстро, работать при любых условиях, работать точно.

В результате Smart Code Engine обеспечивает автоматическое считывание данных банковских карт, машиночитаемой зоны и баркодов в широком классе условий захвата изображений. Система устойчива к перепадам освещения, ракурсу съемки, перекосам, углу поворота, избыточному и недостаточному освещению. Система работает в реальном времени и способна на современных устройствах распознавать банковские карты и другие объекты со скоростью 25 кадров в секунду.

Smart Code Engine позволяет сканировать и распознавать банковские дебетовые и кредитные карты платежных систем Мир, Visa, Mastercard, American Express, JCB, MIR, Maestro, Unionpay и Diners Club, выпущенные различными странами мира, обеспечивая извлечение не только номера (12-19 цифр), но и срока действия и имени владельца. Поддерживается распознавание любых видов банковских карт: с нанесением данных выдавливанием (embossed), гравировкой (indent) и плоской печатью (flat printed), с горизонтальным и вертикальным расположением идентификационных данных, и тех карт, на которых данные расположены как на лицевой, так и на обратной стороне. В новом продукте пользователям стало доступно распознавание банковских карт с номером IBAN, которые широко распространены в странах Евросоюза. Модуль чтения баркодов поддерживает распознавание QR Code (включая различные дизайнерские версии), AZTEC, PDF 417, Data Matrix, CODABAR, CODE_39, CODE_93, CODE_128, EAN_8, EAN_13, ITF, UPC_A, UPC_E. Модуль распознавания данных машиночитаемых зон документов (MRZ) помимо международного стандарта ISO/ICAO (IEC 7501-1/ICAO Document 9303 ISO), учитывает локальные нормативные акты (Россия, Франция, Швейцария, Болгария, Эквадор).

Второе переосмысление относится к нашему флагманскому решению движку распознавания ID-документов. Хотя в самом начале мы позиционировали наш продукт для решения целого спектра задач, начиная от СКУД и заканчивая сложными системами искусственного интеллекта, автономно обслуживающих людей, основное применение Smart IDReader нашел в задачах удаленной идентификации и аутентификации личности. Вот лишь несколько живых кейсов: регистрация самозанятых в сервисе Мой Налог, приобретение и активация сим-карты, регистрация в мобильном клиенте Тинькофф.

Для решения таких задач требуется больше, чем просто распознавание текстовых реквизитов. Так мы создали новый продукт Smart ID Engine, который помимо распознавания данных обеспечивает многофакторную аутентификацию за счет встроенного механизма проверки лиц, анализа живости (liveness) предъявляемого документа, а также выделения признаков компрометации.

Помимо анализа отдельных текстовых и графических элементов (в том числе элементов, изменяющихся во времени при изменении окружающих условий, как например, голограмм), Smart ID Engine содержит коллекцию методов, предупреждающих физическое вмешательство в целостность документа (например, детекцию подмены фотографии).

Такой вектор в создание комплексной системы идентификации и аутентификации личности открывает перед нами новые рубежи и новые рынки сбыта, во всех смыслах расширяя географию применимости системы. И тут мы тоже решили выстрелить: сделали распознавания арабской письменности и языков индоиранской группы. На минуточку, речь идет о 21 юрисдикциях с общим населением 500 млн человек, которые не используют надписи на латинице в национальных документах. Распознавание арабского языка внедрено для 73 типов документов, включая паспорта, ID-карты и водительские удостоверения следующих государств: Алжир, Бахрейн, Государство Палестина, Египет, Иордания, Ирак, Иран, Йемен, Катар, Коморы, Кувейт, Ливан, Ливия, Мавритания, Марокко, ОАЭ, Оман, Саудовская Аравия, Сирия, Судан, Тунис. Итого, на сегодняшний день мы поддерживаем 99 языков мира, а начинали 5 лет назад с двух русского и английского.

Наконец, последнее третье переосмысление действительности и представление нового продукта, который так оперативно родился за время острой фазы пандемии Smart Document Engine. Этот движок решает задачи автоматического извлечения данных из типовых форм документов, форм строгой отчетности, первичных бухгалтерских, финансовых, налоговых, юридических, нотариальных и других документов. Так же, как и все остальные движки распознавания Smart Engines, строго на устройстве, без использования внешний высокопроизводительных серверов. Плюс множество вспомогательных функций, таких как проверка наличия подписи и печати, распознавание рукописного заполнения, контроль топологической целостности документа и т. п.

Конечно, скептики могут махнуть рукой и сказать, что тема совершенно бессмысленная и бестолковая, ибо кому может понадобиться распознавать документы на мобильники или планшете. На это у меня готов ответ. Во-первых, оптимизация алгоритмов под слабые вычислительные архитектуры позволяет сделать нам решение, работающее с непревзойденной скоростью на рабочих станциях и серверах (время обработки 1 страницы документа А4 на AMD Ryzen 7 3700X составляет порядка 2 секунд). А во-вторых, ровно такие скептические прогнозы мы уже встречали, 5 лет назад, когда выпускали продукт распознавания паспорта.

А что же дальше? Выход на западные рынки? Развитие продаж? PR и маркетинг и прочее бла-бла-бла? Конечно же нет. На Западе, как и на Востоке, мы и так есть. Продажи развиваются. PR и маркетинг уже настроен (раз вы дочитали эту статью до конца). Поэтому сосредоточимся на деле:

  • добавление новых кодифицированных объектов: распознавание отдельных текстовых строк, распознавание VIN номеров, распознавание показаний приборов учета и другие;
  • добавление новых языков и письменностей, например в Индии используется более 20 языков;
  • повышение скорости распознавания;
  • расширение списка поддерживаемых типов документов;
  • много другой интересной работы.
Подробнее..

Эксперимент в распознавании рукописных текстов на кириллице

16.12.2020 14:07:22 | Автор: admin

Введение

Распознавание рукописного текста (англ. Handwritten Text Recognition, HTR) - это автоматический способ расшифровки записей с помощью компьютера. Оцифрованный текст рукописных записей позволило бы автоматизировать бизнес процессы множества компаний, упростив работу человека. В данной работе рассматривается модель распознавания рукописного текста на кириллице на основе искусственной нейронной сети. В исследовании использовалась система SimpleHTR разработана Гаральдом, а также LineHTR, расширенной версией системыSimple HTR. Подробнее о SimpleHTR можно почитать здесь.

Датасет

В этом разделе опишу два типа наборов данных: Первый набор данных содержит рукописные цитаты на кириллице. Он содержит 21 000 изображений из различных образцов почерка (названия стран и городов). Мы увеличили этот набор данных для обучения, собрав 207 438 изображений из доступных форм или образцов.

Второй HKR для рукописной казахско-русской базы данных состоял из отдельных слов (или коротких фраз), написанных на русском и казахском языках (около 95% русского и 5% казахского слова/предложения, соответственно). Обратите внимание, что оба языка являются кириллическими написаны и разделяют одни и те же 33 символа. Кроме этих персонажей, в казахском алфавите есть еще 9 специфических символов. Некоторые примеры набора данных HKR показаны ниже:

Некоторые образцы набора данныхНекоторые образцы набора данных

Этот окончательный набор данных был затем разделен на обучающие (70%), валидация (15%) и тестовые (15%) наборы данных. Сам тестовый набор данных был разделен на два субданных (по 7,5% каждый): первый набор данных был назван TEST1 и состоял из слов, которые не были включены в обучающий и проверочный наборы данных; другой субдатасет был назван TEST2 и состоял из слов, которые были включены в обучение набор данных, но полностью различные стили почерка. Основная цель разбиения тестового набора данных на наборы данных TEST1 и TEST2 нужно было проверить разница в точности между распознаванием невидимых слов и слов, видимых на стадии обучения, но с невидимыми стилями почерка.

SimpleHTR модель

Предлагаемая система использует ANN, при этом для извлечения объектов используются многочисленные слои CNN с входной фотографии. Затем выход этих слоев подается в RNN. RNN распространяет информацию через последовательность. Вывод RNN содержит вероятности для каждого символа в последовательности. Для прогнозирования конечного текста реализуются алгоритмы декодирования в выход RNN. Функции CTC отвечают за декодирование вероятностей в окончательный текст. Для повышения точности распознавания декодирование может также использовать языковую модель. CTC используется для получения знаний; выход RNN представляет собой матрицу, содержащую вероятности символов для каждого временного шага. Алгоритм декодирования CTC преобразует эти символические вероятности в окончательный текст. Затем, чтобы повысить точность, используется алгоритм, который продолжает поиск слов в словаре. Однако время, необходимое для поиска фраз, зависит от размеров словаря, и он не может декодировать произвольные символьные строки, включая числа.

Операции: CNN: входные изображения подаются на слои CNN. Эти слои отвечают за извлечение объектов. Есть 5х5 фильтры в первом и втором слоях и фильтры 3х3 в последних трех слоях. Они также содержат нелинейную функцию RELU и максимальный объединяющий слой, который суммирует изображения и делает их меньше, чем входные данные. Хотя высота изображения уменьшается в 2 раза в каждом слое, карты объектов (каналы) добавляются таким образом, чтобы получить выходную карту объектов (или последовательность) размером от 32 до 256. RNN: последовательность признаков содержит 256 признаков или симптомов на каждом временном шаге. Соответствующая информация распространяется РНН через эти серии. LSTM-это один из известных алгоритмов RNN, который переносит информацию на большие расстояния и более эффективное обучение, чем типичные РНН. Выходная последовательность RNN сопоставляется с матрицей 32х80.

CTC: получает выходную матрицу RNN и прогнозируемый текст в процессе обучения нейронной сети, а также определяет величину потерь. CTC получает только матрицу после обработки и декодирует ее в окончательный текст. Длина основного текста и известного текста не должна превышать 32 символов

Модель SimpleHTR, где зеленые значки - это операции, а розовые- потоки данныхМодель SimpleHTR, где зеленые значки - это операции, а розовые- потоки данных

Данные: Входные данные: это файл серого цвета размером от 128 до 32. Изображения в наборе данных обычно не имеют точно такого размера, поэтому их исходный размер изменяется (без искажений) до тех пор, пока они не станут 128 в ширину и 32 в высоту. Затем изображение копируется в целевой образ размером от 128 до 32 дюймов Белый. Затем значения серого цвета стандартизированы, что упрощает процесс нейронной сети.

LineHTR модель

Модель LineHTR - это просто расширение предыдущей модели SimpleHTR, которая была разработана для того, чтобы позволить модели обрабатывать изображения с полной текстовой строкой (а не только одним словом), таким образом, чтобы еще больше повысить точность модели. Архитектура модели LineHTR очень похожа на модель SimpleHTR, с некоторыми различиями в количестве слоев CNN и RNN и размере входных данных этих слоев: она имеет 7 слоев CNN и 2 слоя Bidirectinal LSTM (BLSTM) RNN.

Ниже кратко представлен конвейер алгоритма LineHTR:

  • На входе изображение в градациях серого фиксированного размера 800 x 64 (Ш x В).

  • Слои CNN сопоставляют это изображение в градациях серого с последовательностью элементов размером 100 x 512.

  • Слои BLSTM с 512 единицами отображают эту последовательность признаков в матрицу размером 100 x 205: здесь 100 представляет количество временных шагов (горизонтальных позиций) в изображении с текстовой строкой; 205 представляет вероятности различных символов на определенном временном шаге на этом изображении)

  • Слой CTC может работать в 2 режимах: режим LOSS - чтобы научиться предсказывать правильного персонажа на временном шаге при обучении; Режим ДЕКОДЕР - для получения последней распознанной текстовой строки при тестировании

  • размер партии равен 50

Экспериментальные Материалы

Все модели были реализованы с использованием Python и deep learning библиотеки Tensorflow. Tensorflow позволяет прозрачно использование высоко оптимизированных математических операций на графических процессорах с помощью Python. Вычислительный граф определяется в скрипте Python для определения всех операций, необходимых для конкретных вычислений. Графики для отчета были сгенерированы с помощью библиотеки matplotlib для Python, а иллюстрации созданы с помощью Inkscape-программы векторной графики, аналогичной Adobe Photoshop. Эксперименты проводились на машине с 2-кратным " Intel Процессоры Xeon(R) E-5-2680, 4x " NVIDIA Tesla k20x и 100 ГБ памяти RAM. Использование графического процессора сократило время обучения моделей примерно в 3 раза, однако это ускорение не было тщательно отслежено на протяжении всего проекта,поэтому оно могло варьироваться.

SimpleHTR эксперименты

SimpleHTR модель-это обучение, валидация и тестирование на двух различных датасетах. Для того чтобы запустить процесс обучения модели на наших собственных данных, были предприняты следующие шаги:

Создан словарь слов файлов аннотаций

Файл DataLoader для чтения и предварительного владения набором данных изображений и чтения файла аннотаций принадлежит изображениям

Набор данных был разделен на два подмножества: 90% для обучения и 10% для проверки обученной модели. Для повышения точности и снижения частоты ошибок мы предлагаем следующие шаги: во-первых, увеличить набор данных, используя данные увеличение; во-вторых, добавьте больше информации CNN слоев и увеличение ввода размера; в-третьих, удалить шум на изображении и в скорописи стиле; В-четвертых, заменить ЛСТМ двусторонними ГРУ и, наконец, использование декодера передача маркера или слово поиска луча декодирование, чтобы ограничить выход в словарь слова.

Первый Набор Данных: Для обучения на собранных данных была обработана модель SimpleHTR, в которой есть 42 названия стран и городов с различными узорами почерка. Такие данные были увеличены в 10 раз. Были проведены два теста: с выравниванием курсивных слов и без выравнивания. После изучения были получены значения по валидации данных, представленных в Таблице ниже.

Алгоритм

выравнивание скорописи

нет выравнивания

CER

WAR

CER

WAR

bestpath

19.13

52.55

17.97

57.11

beamsearch

18.99

53.33

17.73

58.33

wordbeamsearch

16.38

73.55

15.78

75.11

Эта таблица показывает точность распознавания SimpleHTR для раличных методов декодирования (bestpath, beamsearch, wordbeamsearch). Декодирование наилучшего пути использует только выход NN и вычисляет оценку, принимая наиболее вероятный символ в каждой позиции. Поиск луча также использует только выход NN, но он использует больше данных из него и, следовательно, обеспечивает более детальный результат. Поиск луча с character-LM также забивает символьные последовательности, которые еще больше повышают исход.

Результаты обучения можно посмотреть на рисунке ниже:

Результаты эксперимента с использованием SimpleHTR (lr=0,01): точность модели.Результаты эксперимента с использованием SimpleHTR (lr=0,01): точность модели.Результаты эксперимента с использованием SimpleHTR (lr=0,01): погрешность модели.Результаты эксперимента с использованием SimpleHTR (lr=0,01): погрешность модели.

На рисунке ниже показано изображение с названием региона, которое было представлено на вход, а на другом рисунке мы видим узнаваемое слово " Южно Казахстанская с вероятностью 86 процентов.

Пример изображения с фразой " Южно-Казахстанская на русском языкеПример изображения с фразой " Южно-Казахстанская на русском языкеРезультат распознаванияРезультат распознавания

Второй набор данных (HKR Dataset): Модель SimpleHTR показала в первом тесте набора данных 20,13% символьной ошибки (CER) и второго набора данных 1,55% CER. Мы также оценили модель SimpleHTR по каждому показателю точности символов(рисунок ниже). Частота ошибок в словах (WER) составил 58,97% для теста 1 и 11,09% для теста 2. Результат например TEST2 показывает что модель может распознавать слова которые существуют в обучающем наборе данных но имеют полностью различные стили почерка. Набор данных TEST1 показывает, что результат не является хорошим, когда модель распознает слова, которые не существуют в обучении и наборы данных проверки.

Следующий эксперимент проводился с моделью LineHTR, обученной на данных за 100 эпох. Эта модель продемонстрировала производительность со средним CAR 29,86% и 86,71% для наборов данных TEST1 и TEST2 соответственно (рисунок ниже). Здесь также наблюдается аналогичная тенденция переобучения обучающих данных.

Заключение

Эксперименты по классификации рукописных названий городов проводились с использованием SimpleHTR и LineHTR на тестовых данных были получены следующие результаты по точности распознавания: 57,1% для SimpleHTR рекуррентного CNN с использованием алгоритмов декодирования с наилучшим путем, 58,3% для Beamsearch и 75,1% wordbeamsearch. Лучший результат был показан для Wordbeamsearch, который использует словарь для окончательной коррекции текст при распознавании.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru