Что означает термин ocr технологии
Помогите прочитать, что здесь написано? (OCR)
Тонны архивных бумаг, чеков и счетов проходят сканирование и оцифровку во многих отраслях: в розничной торговле, логистике, банковских услугах и т.п. Компании получают конкурентное преимущество, если быстро оцифровывают и находят нужную информацию.
В 2020 году нам тоже пришлось решать проблему качественной оцифровки документов, и над этим проектом мы с коллегами работали совместно с компанией Verigram. Вот как мы проводили оцифровку документов на примере заказа клиентом SIM-карты прямо из дома.
Оцифровка позволила нам автоматически заполнять юридические документы и заявки на услуги, а также открыла доступ к аналитике фискальных чеков, отслеживанию динамики цен и суммарных трат.
Для преобразования различных типов документов (отсканированные документы, PDF-файлы или фото с цифровой камеры) в редактируемые форматы с возможностью поиска мы используем технологию оптического распознавания символов – Optical Character Recognition (OCR).
Работа со стандартными документами: постановка задачи
Заказ SIM-карты для пользователя выглядит так:
пользователь решает заказать SIM-карту;
фотографирует удостоверение личности для автоматического заполнения анкеты;
курьер доставляет SIM-карту.
Важно: пользователь фотографирует удостоверение личности своим смартфоном со специфическим разрешением камеры, качеством, архитектурой и другими особенностями. А на выходе мы получаем текстовое представление информации загруженного изображения.
Цель проекта OCR: построить быструю и точную кросc-платформенную модель, занимающую небольшой объем памяти на устройстве.
Верхнеуровневая последовательность обработки изображения стандартного документа выглядит так:
Выделяются границы документа, исключая не интересующий нас фон и исправляя перспективу изображения документа.
Выделяются интересующие нас поля: имя, фамилия, год рождения и т.п. На их основе можно построить модель предсказания соответствующего текстового представления для каждого поля.
Post-processing: модель вычищает предсказанный текст.
Локализация границ документа
Загруженное с камеры устройства изображение документа сравнивается с набором заранее подготовленных масок стандартных документов: фронтальная или задняя часть удостоверения, документ нового или старого образца, страницы паспорта или водительские права.
Предварительно делаем pre-processing обработку изображения и в результате ряда морфологических операций получаем соответствующее бинарное (черно-белое) представление.
Техника работает так: в каждом типе документа есть фиксированные поля, не меняющиеся по ширине и высоте. Например, название документа в правом верхнем углу как на картинке ниже. Они служат опорными полями, от которых рассчитывается расстояние до других полей документа. Если количество обнаруженных полей от опорного выше определенного порога для проверочной маски, мы останавливаемся на ней. Так подбирается подходящая маска.
Так выглядит подбор подходящей маски
исправляется перспектива изображения;
определяется тип документа;
изображение обрезается по найденной маске c удалением фона.
В нашем примере мы выявили, что загруженное фото — это фронтальная часть удостоверения личности Республики Казахстан образца позднее 2014 года. Зная координаты полей, соответствующие этой маске, мы их локализуем и вырезаем для дальнейшей обработки.
Следующий этап — распознавание текста. Но перед этим расскажу, как происходит сбор данных для обучения модели.
Распознавание текста
Данные для обучения
Мы подготавливаем данные для обучения одним из следующих способов.
Первый способ используется, если достаточно реальных данных. Тогда мы выделяем и маркируем поля с помощью аннотационного инструмента CVAT. На выходе получаем XML-файл с названием полей и их атрибутами. Если вернуться к примеру, для обучения модели по распознаванию текста, на вход подаются всевозможные локализованные поля и их соответствующие текстовые представления, считающиеся истинными.
Но чаще всего реальных данных недостаточно или полученный набор не содержит весь словарь символов (например, в реальных данных могут не употребляться некоторые буквы вроде «ъ» или «ь»). Чтобы получить большой набор бесплатных данных и избежать ошибок аннотаторов при заполнении, можно создать синтетические данные с аугментацией.
Сначала генерируем рандомный текст на основе интересующего нас словаря (кириллица, латиница и т.п.) на белом фоне, накладываем на каждый текст 2D-трансформации (повороты, сдвиги, масштабирование и их комбинации), а затем склеиваем их в слово или текст. Другими словами, синтезируем текст на картинке.
Примеры 2D-трансформаций
Показательный пример 2D-трансформации представлен в библиотеке для Python Text-Image-Augmentation-python. На вход подается произвольное изображение (слева), к которому могут применяться разные виды искажений.
Применяем разные виды искажений Дисторсия, перспектива и растяжение изображения с помощью библиотеки Text-Image-Augmentation-python
После 2D-трансформации на изображение текста добавляются композитные эффекты аугментации: блики, размытия, шумы в виде линий и точек, фон и прочее.
Пример изображений в сформированной нами обучающей выборке на основе применения аугментации
Так можно создать обучающую выборку.
Обучающая выборка
Распознавание текста
Следующий этап — распознавание текста стандартного документа. Мы уже подобрали маску и вырезали поля с текстовой информацией. Дальше можно действовать одним из двух способов: сегментировать символы и распознавать каждый по отдельности или предсказывать текст целиком.
Посимвольное распознавание текста
В этом методе строится две модели. Первая сегментирует буквы: находит начало и конец каждого символа на изображении. Вторая модель распознает каждый символ по отдельности, а затем склеивает все символы.
Предсказывание локального текста без сегментации (end-2-end-решение)
Мы использовали второй вариант — распознавание текста без сегментирования на буквы, потому что этот метод оказался для нас менее трудозатратным и более производительным.
В теории, создается нейросетевая модель, которая выдает копию текста, изображение которого подается на вход. Так как текст на изображении может быть написан от руки, искажен, растянут или сжат, символы на выходе модели могут дублироваться.
Отличие результатов распознавания реальной и идеальной модели
Чтобы обойти проблему дублирования символов, добавим спецсимвол, например «-», в словарь. На этапе обучения каждое текстовое представление кодируется по следующим правилам декодировки:
два и более повторяющихся символа, встретившиеся до следующего спецсимвола, удаляются, остается только один;
повторение спецсимвола удаляется.
Так во время тренировочного процесса на вход подается изображение, которое проходит конволюционный и рекуррентный слои, после чего создается матрица вероятностей встречаемости символов на каждом шаге.
Истинное значение получает различные представления с соответствующей вероятностью за счет СТС-кодировки. Задача обучения — максимизировать сумму всех представлений истинного значения. После распознавания текста и выбора его представления проводится декодировка, описанная выше.
Архитектура модели по распознаванию текста
Мы попробовали обучить модель на разных архитектурах нейросетей с использованием и без использования рекуррентных слоев по схеме, описанной выше. В итоге остановились на варианте без использования рекуррентных слоев. Также для придания ускорения inference части, мы использовали идеи сетей MobileNet разных версий. Граф нашей модели выглядел так:
Схема итоговой модели
Методы декодирования
Хочу выделить два наиболее распространенных метода декодирования: CTC_Greedy_Decoder и Beam_Search.
CTC_Greedy_Decoder-метод на каждом шаге берет индекс, с наибольшей вероятностью соответствующий определенному символу. После чего удаляются дублирующиеся символы и спецсимвол, заданный при тренировке.
Метод «Beam_Search» — лучевой алгоритм, в основании которого лежит принцип: следующий предсказанный символ зависит от предыдущего предсказанного символа. Условные вероятности совстречаемости символов максимизируются и выводится итоговый текст.
Post-processing
Есть вероятность, что в продакшене при скоринге на новых данных модель может ошибаться. Нужно исключить такие моменты или заранее предупредить пользователя о том, что распознавание не получилось, и попросить переснять документ. В этом нам помогает простая процедура постобработки, которая может проверять на предсказание только ограниченного словаря для конкретного поля. Например, для числовых полей выдавать только число.
Другим примером постобработки являются поля с ограниченным набором значений, которые подбираются по словарю на основе редакторского расстояния. Проверка на допустимость значений: в поле даты рождения не могут быть даты 18 века.
Оптимизация модели
Техники оптимизации
На предыдущем этапе мы получили модель размером 600 килобайт, из-за чего распознавание были слишком медленным. Нужно было оптимизировать модель с фокусом на увеличение скорости распознавания текста и уменьшение размера.
В этом нам помогли следующие техники:
Квантование модели, при котором вычисления вещественных чисел переводятся в более быстрые целочисленные вычисления.
«Стрижка» (pruning) ненужных связей. Некоторые веса имеют маленькую магнитуду и оказывают малый эффект на предсказание, их можно обрезать.
Для увеличения скорости распознавания текста используются мобильные версии архитектур нейросеток, например, MobileNetV1 или MobileNetV2.
Так, в результате оптимизации мы получили снижение качества всего на 0,5 %, при этом скорость работы увеличилась в 6 раз, а размер модели снизился до 60 килобайт.
Вывод модели в продуктив
Процесс вывода модели в продуктив выглядит так:
Мы создаем 32-битную TensorFlow модель, замораживаем ее и сохраняем с дополнительными оптимизациями типа weight или unit pruning. Проводим дополнительное 8-битное квантование. После чего компилируем модель в Android- или iOS-библиотеку и деплоим ее в основной проект.
Рекомендации
На этапе развертывания задавайте статическое выделение тензоров в графе модели. Например, в нашем случае скорость увеличилась в два раза после указания фиксированного размера пакета (Batch size).
Не используйте LSTМ- и GRU-сети для обучения на синтетических данных, так как они проверяют совстречаемость символов. В случайно сгенерированных синтетических данных последовательность символов не соответствует реальной ситуации. Помимо этого они вызывают эффект уменьшения скорости, что важно для мобильных устройств, особенно для старых версий.
Аккуратно подбирайте шрифты для обучающей выборки. Подготовьте для вашего словаря набор шрифтов, допустимых для отрисовки интересующих символов. Например, шрифт OCR B Regular не подходит для кириллического словаря.
Пробуйте тренировать собственные модели, поскольку не все opensource-библиотеки могут подойти. Перед тем как тренировать собственные модели, мы пробовали Tesseract и ряд других решений. Так как мы планировали развертывать библиотеку на Android и iOS, их размер был слишком большим. Кроме того, качество распознавания этих библиотек было недостаточным.
Распознавание текста с помощью OCR
Tesseract — это движок оптического распознавания символов (OCR) с открытым исходным кодом, является самой популярной и качественной OCR-библиотекой.
OCR использует нейронные сети для поиска и распознавания текста на изображениях.
Tesseract ищет шаблоны в пикселях, буквах, словах и предложениях, использует двухэтапный подход, называемый адаптивным распознаванием. Требуется один проход по данным для распознавания символов, затем второй проход, чтобы заполнить любые буквы, в которых он не был уверен, буквами, которые, скорее всего, соответствуют данному слову или контексту предложения.
На одном из проектов стояла задача распознать чеки с фотографий.
Инструментом для распознавания был использован Tesseract OCR. Плюсами данной библиотеки можно отметить обученные языковые модели (>192), разные виды распознавания (изображение как слово, блок текста, вертикальный текст), легкая настройка. Так как Tesseract OCR написан на языке C++, был использован сторонний wrapper c github.
Различиями между версиями являются разные обученные модели (версия 4 имеет большую точность, поэтому мы использовали её).
Нам потребуются файлы с данными для распознавания текста, для каждого языка свой файл. Скачать данные можно по ссылке.
Чем лучше качество исходного изображения (имеют значение размер, контрастность, освещение), тем лучше получается результат распознавания.
Также был найден способ обработки изображения для его дальнейшего распознавания путем использования библиотеки OpenCV. Так как OpenCV написан на языке C++, и не существует оптимального для нашего решения написанного wrapper’а, было решено написать собственный wrapper для этой библиотеки с необходимыми для нас функциями обработки изображения. Основной сложностью является подбор значений для фильтра для корректной обработки изображения. Также есть возможность нахождения контуров чеков/текста, но не изучено до конца. Результат получился лучше (на 5-10%).
language — язык текста с картинки, можно выбрать несколько путем их перечисления через «+»;
pageSegmentationMode — тип расположения текста на картинке;
charBlacklist — символы, которые будут игнорироваться ignoring characters.
Использование только Tesseract дало точность
70% при идеальном изображении, при плохом освещении/качестве картинки точность была
Vision + Tesseract OCR
Так как результат был неудовлетворителен, было решено использовать библиотеку от Apple — Vision. Мы использовали Vision для нахождения блоков текста, дальнейшего разделения изображения на отдельные блоки и их распознавания. Результат был лучше на
5%, но и появлялись ошибки из-за повторяющихся блоков.
Недостатками этого решения были:
MLKit
Еще одним из методов определения текста является MLKit от Google, развернутый на Firebase. Данный метод показал наилучшие результаты (
90%), но главным недостатком этого метода является поддержка только латинских символов и сложная обработка разделенного текста в одной строке (наименование — слева, цена — справа).
В итоге можно сказать, что распознать текст на изображениях — задача выполнимая, но есть некоторые трудности. Основной проблемой является качество (размер, освещенность, контрастность) изображения, которую можно решить путем фильтрации изображения. При распознавании текста при помощи Vision или MLKit были проблемы с неверным порядком распознавания текста, обработкой разделенного текста.
Распознанный текст может быть в ручную откорректирован и пригоден к использованию; в большинстве случаев при распознавании текста с чеков итоговая сумма распознается хорошо и не нуждается в корректировках.
Как мы создавали технологию оптического распознавания текста. OCR в Яндексе
Привет! Сегодня я расскажу читателям Хабра о том, как мы создавали технологию распознавания текста, работающую на 45 языках и доступную пользователям Яндекс.Облака, какие задачи мы ставили и как их решали. Будет полезно, если вы работаете над схожими проектами или хотите узнать, как так получилось, что сегодня вам достаточно сфотографировать вывеску турецкого магазина, чтобы Алиса перевела её на русский.
Технология Optical character recognition (OCR) развивается в мире уже десятки лет. Мы в Яндексе начали разрабатывать собственную технологию OCR, чтобы улучшить свои сервисы и дать пользователям больше возможностей. Картинки — это огромная часть интернета, и без способности их понимать поиск по интернету будет неполным.
Решения для анализа изображений становятся все более востребованными. Это связано с распространением искусственных нейронных сетей и устройств с качественными сенсорами. Понятно, что в первую очередь речь идет о смартфонах, но не только о них.
Сложность задач в области распознавания текста постоянно растет — все начиналось с распознавания отсканированных документов. Потом добавилось распознавание Born-Digital-картинок с текстом из интернета. Затем, с ростом популярности мобильных камер, — распознавание хороших снимков с камеры (Focused scene text). И чем дальше, тем больше параметры усложнялись: текст может быть нечетким (Incidental scene text), написанным с любым изгибом или по спирали, самых разных категорий — от фотографий чеков до прилавков магазинов и вывесок.
Какой путь мы прошли
Распознавание текста — это отдельный класс задач компьютерного зрения. Как и многие алгоритмы компьютерного зрения, до популярности нейросетей оно во многом основывалось на ручных признаках и эвристиках. Однако за последнее время, с переходом на нейросетевые подходы, качество технологии существенно выросло. Посмотрите на пример на фото. Как это происходило, я расскажу дальше.
Сравните сегодняшние результаты распознавания с результатами в начале 2018 года:
Какие трудности нам встретились сначала
В начале своего пути мы делали технологию распознавания для русского и английского языков, а основными сценариями использования были сфотографированные страницы текста и картинки из интернета. Но в ходе работы мы поняли, что этого недостаточно: текст на изображениях встречался на любом языке, на любой поверхности, а картинки порой оказывались самого разного качества. Значит, распознавание должно работать в любой ситуации и на всех типах входящих данных.
И тут мы столкнулись с рядом сложностей. Вот только некоторые:
Выбор модели детекции
Первый шаг к распознаванию текста — определение его положения (детекция).
Детекцию текста можно рассматривать как задачу распознавания объектов, где в качестве объекта могут выступать отдельные символы, слова или строки.
Нам было важно, чтобы модель впоследствии масштабировалась на другие языки (сейчас мы поддерживаем 45 языков).
Во многих исследовательских статьях про детекцию текста используются модели, которые предсказывают положения отдельных слов. Но в случае универсальной модели такой подход имеет ряд ограничений — например, само понятие слова для китайского языка принципиально отличается от понятия слова, к примеру, в английском языке. Отдельные слова в китайском не отделены пробелом. В тайском языке пробелом отбиваются только отдельные предложения.
Вот примеры одного и того же текста на русском, китайском и тайском языках:
Сегодня отличная погода. Замечательный день для прогулки.
今天天气很好 这是一个美丽的一天散步。
สภาพอากาศสมบูรณ์แบบในวันนี้ มันเป็นวันที่สวยงามสำหรับเดินเล่นกันหน่อยแล้ว
Строки же в свою очередь бывают очень вариативными по соотношению сторон. Из-за этого возможности таких распространенных детекционных моделей (например, SSD или RCNN-based) для предсказания линий ограничены, так как эти модели основаны на регионах-кандидатах / анкорных боксах с множеством предопределенных соотношений сторон. Кроме того, линии могут иметь произвольную форму, например изогнутую, поэтому для качественного описания строк недостаточно исключительно описывающего четырехугольника, даже с углом поворота.
Несмотря на то, что положения отдельных символов локальные и описываемые, их недостаток состоит в том, что требуется отдельный этап постобработки — нужно подобрать эвристики для склеивания символов в слова и строки.
Поэтому за основу для детекции мы взяли модель SegLink, основная идея которой — декомпозировать строки/слова на две более локальные сущности: сегменты и связи между ними.
Архитектура детектора
Архитектура модели основывается на SSD, который предсказывает положения объектов сразу на нескольких масштабах признаков. Только помимо предсказания координат отдельных «сегментов» предсказываются также и «связи» между соседними сегментами, то есть принадлежат ли два сегмента одной и той же строке. «Связи» предсказываются как для соседних сегментов на одинаковом масштабе признаков, так и для сегментов, находящихся в смежных областях на соседних масштабах (сегменты c разных масштабов признаков могут незначительно отличаться по размерам и принадлежать одной линии).
Иллюстрация принципов работы детектора SegLink из статьи Detecting Oriented Text in Natural Images by Linking Segments
По таким предсказаниям, если взять в качестве вершин все сегменты, для которых вероятность того, что они являются текстом больше порога α, а в качестве ребер все связи, вероятность которых больше порога β, то сегменты образуют связные компоненты, каждый из которых описывает линию текста.
Полученная модель имеет высокую обобщающую способность: даже обученная в первых подходах на русских и английских данных, она качественно находила китайский и арабский текст.
Десять скриптов
Если для детекции нам удалось создать модель, которая работает сразу для всех языков, то для распознавания найденных линий такую модель получить заметно сложнее. Поэтому мы решили использовать отдельную модель для каждого скрипта (кириллический, латинский, арабский, иврит, греческий, армянский, грузинский, корейский, тайский). Отдельная общая модель используется для китайского и японского языков из-за большого пересечения по иероглифам.
Общая для всего скрипта модель отличается от отдельной модели для каждого языка менее чем на 1 п.п. качества. В то же время и создание, и внедрение одной модели проще, чем, к примеру, 25 моделей (количество латинских языков, поддерживаемых нашей моделью). Но из-за частого присутствия во всех языках вкраплений английского все наши модели умеют помимо основного скрипта предсказывать также символы латинского алфавита.
Чтобы понять, какую модель необходимо использовать для распознавания, мы вначале определяем принадлежность полученных линий одному из 10 доступных для распознавания скриптов.
Стоит отдельно отметить, что не всегда по линии можно однозначно определить её скрипт. К примеру, цифры или одиночные латинские символы содержатся во многих скриптах, поэтому один из выходных классов модели — «неопределенный» скрипт.
Определение скрипта
Для определения скрипта мы сделали отдельный классификатор. Задача определения скрипта существенно проще, чем задача распознавания, и на синтетических данных нейронная сеть легко переобучается. Поэтому в наших экспериментах существенное улучшение качества модели давало предобучение на задаче распознавания строк. Для этого мы вначале обучали сеть для задачи распознавания для всех имеющихся языков. После этого полученный backbone использовался для инициализации модели на задачу классификации скрипта.
В то время как скрипт у отдельной линии часто бывает достаточно шумным, картинка в целом чаще всего содержит текст на одном языке, либо помимо основного вкрапления английского (или в случае наших пользователей русского). Поэтому для увеличения стабильности мы агрегируем предсказания линий с картинки с целью получения более стабильного предсказания скрипта картинки. Линии с предсказанным классом «неопределённый» не учитываются при агрегации.
Распознавание строк
Следующим шагом, когда мы уже определили положение каждой линии и ее скрипт, нам необходимо распознать последовательность символов из заданного скрипта, которая на ней изображена, то есть из последовательности пикселей предсказать последовательность символов. После множества экспериментов мы пришли к следующей sequence2sequence attention based модели:
Использование CNN+BiLSTM в encoder позволяет получить признаки, улавливающие как локальный, так и глобальный контекст. Для текста это важно — зачастую он написан одним шрифтом (отличить схожие буквы, имея информацию о шрифте, гораздо проще). И чтобы отличить две буквы, написанные через пробел, от идущих подряд, тоже нужны глобальные для линии статистики.
Интересное наблюдение: в полученной модели выходы маски attention для конкретного символа можно использовать для предсказания его позиции на изображении.
Это вдохновило нас попробовать явно «фокусировать» внимание модели. Такие идеи встречались и в статьях — например, в статье Focusing Attention: Towards Accurate Text Recognition in Natural Images.
Так как механизм attention дает вероятностное распределение над пространством признаков, если взять в качестве дополнительного loss сумму выходов attention внутри маски, соответствующей предсказываемой на данном шаге букве, мы получим ту часть «внимания», которая фокусируется непосредственно на ней.
Для тех обучающих примеров, для которых местоположение отдельных символов неизвестно или неточно (не для всех обучающих данных имеется разметка на уровне отдельных символов, а не слов), — это слагаемое в финальном loss не учитывалось.
Еще одна приятная особенность: такая архитектура позволяет без дополнительных правок предсказывать распознавание линий right-to-left (что важно, к примеру, для таких языков как арабский, иврит). Модель сама начинает выдавать распознавание справа налево.
Быстрая и медленная модели
В процессе мы столкнулись проблемой: для «высоких» шрифтов, то есть шрифтов, вытянутых по вертикали, модель работала плохо. Вызвано это было тем, что размерность признаков на уровне attention в 8 раз меньше, чем размерность исходной картинки из-за страйдов и пулингов в архитектуре сверточной части сети. И местоположения нескольких соседних символов на исходной картинке могут соответствовать местоположению одного и того же вектора признаков, что может приводить к ошибкам на таких примерах. Использование архитектуры с меньшим сужением размерности признаков приводило к росту качества, но также к росту времени обработки.
Чтобы решить эту проблему и избежать увеличения времени обработки, мы сделали следующие доработки модели:
Мы обучили одновременно и быструю модель с большим количеством страйдов, и медленную с меньшим. На слое, где параметры модели начинали отличаться, мы добавили отдельный выход сети, который предсказывал, у какой модели будет меньше ошибка распознавания. Суммарный loss модели складывался из Lsmall + Lbig + Lquality. Таким образом, на промежуточном слое модель училась определять «сложность» данного примера. Далее на этапе применения общая часть и предсказание «сложности» примера считались для всех линий, а в зависимости от его выхода по значению порога в дальнейшем применялась либо быстрая, либо медленная модель. Это позволило нам получить качество, почти не отличающееся от качества долгой модели, при этом скорость увеличилась лишь на 5% процентов вместо предполагаемых 30%.
Данные для обучения
Важный этап создания качественной модели — подготовка большой и разнообразной обучающей выборки. «Синтетическая» природа текста дает возможность генерировать примеры в большом количестве и получать достойные результаты на реальных данных.
После первого подхода к генерации синтетических данных мы внимательно посмотрели на результаты полученной модели и выявили, что модель недостаточно хорошо распознает одиночные буквы ‘I’ из-за смещения в текстах, используемых для создания обучающей выборки. Поэтому мы явно сгенерировали набор «проблемных» примеров, и когда добавили его к исходным данным модели, качество ощутимо выросло. Этот процесс мы повторяли многократно, добавляя все больше сложных срезов, на которых хотели повысить качество распознавания.
Важный момент состоит в том, что сгенерированные данные должны быть разнообразными и похожими на реальные. И если вы хотите от модели, чтобы она работала на фотографиях текста на листках бумаги, а весь синтетический датасет содержит текст, написанный поверх пейзажей, то это может не сработать.
Еще одним важным шагом является использование для обучения тех примеров, на которых текущее распознавание ошибается. При наличии большого количества картинок, для которых нет разметки, можно взять те выходы текущей системы распознавания, в которых она не уверена, и разметить только их, тем самым сократив затраты на разметку.
Для получения сложных примеров мы просили пользователей сервиса Яндекс.Толока за вознаграждение сфотографировать и отправить нам изображения определенной «сложной» группы — например, фотографии упаковок товаров:
Качество работы на «сложных» данных
Мы хотим дать нашим пользователям возможность работать с фотографиями любой сложности, ведь распознать или перевести текст может понадобиться не только на странице книги или отсканированном документе, но и на уличной вывеске, объявлении или упаковке продукта. Поэтому, сохраняя высокое качество работы на потоке книг и документов (этой теме посвятим отдельный рассказ), мы уделяем особое внимание «сложным наборам изображений».
Описанным выше способом мы собрали набор изображений, содержащих текст in the wild, который может быть полезен нашим пользователям: фотографии вывесок, объявлений, табличек, обложек книг, тексты на бытовых приборах, одежде и предметах. На этом наборе данных (ссылка на который ниже) мы оценили качество работы нашего алгоритма.
В качество метрики для сравнения мы использовали стандартную метрику точности и полноты распознавания слов в датасете, а также F-меру. Распознанное слово считается правильно найденным, если его координаты соответствуют координатам размеченного слова (IoU > 0.3) и распознавание совпадает с размеченным с точностью до регистра. Цифры на получившемся датасете:
Система распознавания | Полнота | Точность | F-мера |
Yandex Vision | 73.99 | 86.57 | 79.79 |
Датасет, метрики и скрипты для воспроизведения результатов доступны по ссылке.
Upd. Друзья, сравнение нашей технологии с аналогичным решением от Abbyy вызвало много споров. Мы с уважением относимся ко мнению сообщества и коллег по индустрии. Но при этом уверены в своих результатах, поэтому решили так: мы уберем из сравнения результаты других продуктов, обсудим еще раз вместе с ними методику тестирования и вернемся с результатами, в которых придем к общему согласию.
Следующие шаги
На стыке отдельных шагов, таких как детекция и распознавание, всегда возникают проблемы: малейшие изменения в модели детекции влекут за собой необходимость изменений модели распознавания, поэтому мы активно экспериментируем над созданием end-to-end решения.
Помимо уже описанных путей усовершенствования технологии мы будем развивать направление анализа структуры документа, которая принципиально важна при извлечении информации и востребована у пользователей.
Заключение
Пользователи уже привыкли к удобным технологиям и не задумываясь включают камеру, наводят на вывеску магазина, меню в ресторане или страницу в книжке на иностранном языке и быстро получают перевод. Мы распознаем текст на 45 языках с подтвержденной точностью, и возможности будут только расширяться. Набор инструментов внутри Яндекс.Облака дает возможность любому желающему использовать те наработки, которые в Яндексе долгое время делали для себя.
Сегодня можно просто взять готовую технологию, интегрировать в собственное приложение и использовать для того, чтобы создавать новые продукты и автоматизировать собственные процессы. Документация по нашему OCR доступна по ссылке.