Простая реализация OCR на Android с помощью Google ML Kit

Новые технологии стремительно развиваются. Некоторые из новейших решений с каждым днем ​​набирают популярность. В оптическом распознавании символов (OCR) нет ничего нового, но его усовершенствование с помощью машинного обучения может пролить новый свет на OCR. Очевидно, это обширная тема. Тем не менее, я постараюсь вкратце познакомить вас с машинным обучением в рамках реализации OCR на Android. Я также расскажу о некоторых его функциях на основе легкодоступного программного обеспечения под названием Google Firebase ML Kit.

Что такое OCR?

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

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

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

Как это работает?

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

Функция обнаружения или интеллектуальное распознавание символов (ICR) используется для определения характерных черт персонажей. Ищет письма, соответствующие заданным требованиям. Например: если вы видите две наклонные линии, которые пересекаются в точке наверху, и между ними есть горизонтальная линия примерно на полпути вниз, это буква А.

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

Реализация OCR на Android

Google Firebase ML Kit - это набор инструментов, который помогает реализовать машинное обучение на Android и iOS - OCR - один из них. Начать использовать машинное обучение относительно просто. ML Kit имеет несколько встроенных модулей, которые позволяют распознавать текст, распознавать лица, сканировать штрих-коды и многое другое. Если у вас есть опыт работы с нейронными сетями и вы хотите использовать более сложное или специализированное машинное обучение, вы можете использовать собственные модели Tensorflow.

ML Kit имеет две версии: на устройстве и в облаке. Здесь вы найдете различия и все особенности обеих версий. Ниже мы остановимся на версии Android для устройств.

Прежде чем мы начнем, нам нужно создать проект Firebase в консоли Firebase. Учебник можно найти здесь. Это требует знания языка программирования Kotlin и RxJava2.

Теперь давайте добавим модуль Firebase ML Kit в AndroidManifest.xml и зависимость от Gradle.

С этой настройкой мы можем приступить к реализации нашего детектора текста. Нам нужно создать FirebaseVisionTextDetector.

Теперь у нас есть экземпляр детектора Vision, который используется для обнаружения текста на изображениях. Для этого мы используем:

Этот метод принимает экземпляр FirebaseVisionImage в качестве параметра и создает Task ‹FirebaseVisionText›. Когда задача готова, мы можем взять FirebaseVisionText. Он содержит данные об обнаруженном тексте и ограничивающие рамки обнаруженных областей.

Вы можете создать FirebaseVisionImage из растрового изображения, используя метод ниже:

Существуют и другие фабричные методы создания FirebaseVisionImage. Мы можем проверить их в документации Firebase. На данный момент мы будем использовать растровую версию.

Ниже я реализовал полный класс детектора. Я использовал RxJava2 для обработки ввода и вывода детектора текста. Я также обернул класс Firebase Task ‹T› в Flowable для обнаружения текста в потоке RxJava.

Полный класс TextDetector:

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

Теперь нам нужно нарисовать детекции на отсканированном изображении. Все ограничивающие рамки взяты из объекта FirebaseVisionText.

FirebaseVisionText содержит блоки, строки и элементы. Блоки - это самые большие области текста, в каждом блоке есть строки, а во всех строках есть элементы.

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

Ниже приведен полный фрагмент:

Выходной код будет выглядеть так:

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

Тестирование распознавания текста на примере чеков

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

Первая квитанция была на польском языке. Ниже мы видим два изображения. Текст, выделенный на левом изображении, показывает, что было обнаружено ML Kit. На правом изображении показаны данные, возвращаемые API, на белом фоне. Кажется, он почти такой же, как на исходном изображении. Конечно, были проблемы с форматированием. Также не были обнаружены или перепутаны некоторые буквы. Кроме того, мы видим, что результаты были довольно хорошими. Я выровнял все линии по вертикали и отрегулировал размер текста по полям, что вы можете видеть ниже. Без этих исправлений беспорядка было гораздо больше.

Второй тест проводился на испанской квитанции. Это было в низком разрешении (225 x 335 пикселей). Как видим, детектор обнаружил только два блока на всем изображении.

И последняя попытка была на швейцарской квитанции на немецком языке. Обнаружение было почти безупречным. Был найден весь текст, кроме «электронной почты» внизу квитанции. Детектор нашел только последнюю букву слова «электронная почта» и принял ее за 1 (цифру один).

Резюме

Я представил вам обзор основ распознавания текста. Я также продемонстрировал реализацию OCR на Android с помощью Google ML Kit. Реализация ML Kit довольно проста и не требует большого количества кода.

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

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

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

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