Оптическое распознавание символов в Raspberry Pi с помощью Tesseract

Способность современных машин (вычислительных устройств) использовать камеры для получения информации об окружаем мире и способность интерпретировать/обрабатывать эти данные с каждым годом оказывает все большее влияние на жизнь современного общества. Сейчас уже никого не удивишь роботом доставщиком еды (например, Starship Robots) или автомобилем с функцией автопилота (например, Tesla) – эти устройства во время своего движения для принятия решений полагаются на информацию, получаемую от своих высоко технологичных камер. В данной статье мы рассмотрим основы технологии оптического распознавания символов (Optical Character Recognition, OCR), применяемой в современных электронных устройствах для распознавания отдельных символов на изображении.

Внешний вид проекта оптического распознавания символов в Raspberry Pi с помощью Tesseract

У этой технологии очень много возможностей для практического применения в современном мире: считывание информации с визиток, распознавание магазине по его названию, распознавание дорожных знаков и многое другое. Наверняка многие из вас уже слышали о таком приложении как Google Lens, которое представляет собой систему искусственного интеллекта, распознающую в режиме реального времени объекты на фотографии и предоставляющую имеющуюся по ним сведения в сети интернет. В данной статье мы рассмотрим похожий инструмент от компании Google для выполнения задачи оптического распознавания символов (OCR) под названием Tesseract-OCR Engine, работающий на основе языка python и библиотеки OpenCV. Данный инструмент позволяет распознавать/идентифицировать символы на изображениях с помощью платы Raspberry Pi.

Также на нашем сайте вы можете прочитать статьи про использование библиотеки OpenCV в Raspberry Pi для распознавания лиц и про установку OpenCV на Raspberry Pi с помощью CMake.

Установка Tesseract на Raspberry Pi

Для выполнения задачи оптического распознавания символов (OCR) в Raspberry Pi нам необходимо установить на нее Tesseract OCR engine. Чтобы сделать это нам сначала нужно сконфигурировать Debian Package (dpkg), который затем поможет нам установить Tesseract OCR. Для конфигурирования Debian Package выполните следующую команду:

Далее мы можем приступить к установке Tesseract OCR (Optical Character Recognition) с помощью опции apt-get. Выполните для этого команду:

После этого в окне терминала вы должны увидеть примерно следующую картину:

Процесс установки Tesseract OCR

Процесс установки Tesseract OCR займет около 5-10 минут.

Теперь, когда у нас Tesseract OCR установлен, нам необходимо установить еще пакет PyTesseract с помощью установщика пакетов pip. Pytesseract – это python оболочка для Tesseract OCR engine, которая позволяет использовать возможности Tesseract из языка python. Для установки  PyTesseract выполните следующую команду:

Прежде чем продолжать далее убедитесь в том, что на вашей плате установлена библиотека pillow. О том, как ее установить, можно прочитать в статье про распознавание лиц с помощью платы Raspberry Pi. После завершения установки pytesseract вы в окне терминала должны увидеть примерно следующую картину:

Процесс установки pytesseract завершен

Tesseract 4.0 на Windows/Ubuntu

Проект оптического распознавания символов изначально начинал разрабатываться компанией Hewlett Packard в 1980 году. Затем он был выкуплен компанией Google, которая и осуществляет его поддержку вплоть до настоящего времени. Многие годы Tesseract хорошо работал только на изображениях определенного формата. К примеру, если фон изображения был сильно зашумлен или объект для распознавания был не в фокусе, то Tesseract работал не очень хорошо.

Для преодоления этой проблемы последние версии tesseract (к примеру, версия Tesseract 4.0) стали использовать технологии машинного обучения (Deep Learning) для улучшения распознавания символов и даже почерка. Tesseract 4.0 использует Long Short-Term Memory (LSTM) и рекуррентную нейронную сеть (Recurrent Neural Network, RNN) для повышения точности распознавания символов. К сожалению, на момент написания оригинала данной статьи (август 2019 г., ссылка на оригинал в конце статьи) Tesseract 4.0 был доступен для использования только в операционных системах Windows и Ubuntu, а для Raspberry Pi он находился в стадии бета тестирования. Поэтому в оригинале данной статьи автор использовал ее версию Tesseract 3.04 на Raspberry Pi. На момент прочтения вами данной статьи, скорее всего, будут доступны уже и более свежие версии Tesseract для Raspberry Pi. Но мы надеемся, что после прочтения данной статьи у вас их применение не вызовет никаких затруднений.

Простое распознавание символов в Raspberry Pi

В предыдущем пункте статьи мы уже установили на плату Raspberry Pi библиотеку Tesseract OCR и пакет Pytesseract. Поэтому в данном разделе статьи мы напишем небольшую программу чтобы проверить как работает распознавание символов на тестовом изображении. В качестве тестового изображения мы будем использовать следующее:

Тестовое изображение для распознавания символов

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

В представленной программе мы пытаемся прочитать текст с изображения под названием ‘1.png’, которое расположено в том же самом каталоге, что и наша программа. Для открытия этого изображения используется пакет Pillow, после чего оно сохраняется в переменной img. Затем мы используем метод image_to_string из пакета pytesseract для обнаружения любого текста на изображении и сохраняем его в переменной text. И, наконец, мы выводим значение переменной text на экран чтобы проверить результат работы программы.

Как вы можете видеть, тестовое изображение содержит текст Explain that Stuff! 01234567890”, а в результате работы нашей небольшой программы мы получили текст “Explain that stuff! Sdfiosiefoewufv”. Это означает, что наша программа не смогла распознать цифры на изображении. Для преодоления этой проблемы обычно используют библиотеку OpenCV чтобы удалить шум (зашумленность) из программы и затем настраивают Tesseract OCR engine чтобы получить более впечатляющие результаты. Но помните о том, что не стоит ожидать 100% точности распознавания от Tesseract OCR Python.

Настройка Tesseract OCR для улучшения результатов

Pytesseract позволяет нам производить настройку Tesseract OCR engine при помощи установки флагов (flags), которые влияют на способ поиска символов на изображении. Для настройки Tesseract OCR используется 3 основных флага:

  • language (-l) (язык);
  • OCR Engine Mode (--oem) (режим работы "движка" распознавания символов);
  • Page Segmentation Mode (- -psm) (режим сегментации страниц).

Кроме английского языка (по умолчанию) Tesseract также поддерживает множество других языков: Hindi, Турецкий, Французский и др. Мы в нашем проекте будем использовать только английский язык (English), но вы можете скачать соответствующие обучающие пакеты со страницы на github и добавить их в свой пакет чтобы иметь возможность распознавать символы на других языках. Также возможно производить распознавание двух или более языков на одном и том же изображении. Язык распознавания устанавливается с помощью флага language, значение этого флага –l соответствует английскому языку (English), для других языков необходимо использовать другие значения этого флага.

Следующим флагом является OCR Engine Mode, с помощью которого можно использовать 4 различных режима распознавания. Каждый режим использует свой собственный алгоритм для распознавания символов на изображении. По умолчанию используется алгоритм, который устанавливается вместе с пакетом. Но мы можем изменить его чтобы использовать LSTM или Neural nets (нейронные сети). 4 доступных режима OCR Engine Mode показаны на следующем рисунке. Этот флаг устанавливается с помощью префикса --oem, то есть чтобы использовать mode 1 (режим 1), необходимо ввести -- oem 1.

Возможные значения флага OCR Engine Mode

И, наконец, один из самых значимых флагов, которые используются для настройки Tesseract OCR – это флаг режима сегментации страниц (page segmentation mode flag). Этот флаг очень полезен когда фон вашего изображения имеет много незначащих деталей (шум) или символы на изображении написаны в различной ориентации и с различными размерами. Всего доступно 14 различных режимов сегментации страниц, которые представлены на рисунке ниже. Флаг устанавливается с помощью префикса –psm, в нашем случае мы будем использовать –psm 11.

Возможные значения флага режима сегментации страниц

Использование флагов oem и psm в Tesseract на Raspberry Pi для улучшения результатов распознавания

Проверим эффективность рассмотренных режимов. На представленном ниже рисунке мы сделали попытку распознавания символов на дорожном знаке, обозначающем ограничение скорости. На знаке написано “SPEED LIMIT 35”. Как вы можете видеть из представленного рисунка, число 35 на нем значительно большего размера, чем все остальные символы. Это обстоятельство существенно затрудняет работу Tesseract, поэтому он смог распознать с этого изображения “SPEED LIMIT”, а цифры не распознал.

Распознавание знака ограничения скорости

Чтобы преодолеть эту проблему, мы попробуем настроить флаги. В ранее рассмотренной программе флаг настройки пуст (config=’’), исправим это. Текст на изображении на английском языке, поэтому используем флаг –l eng, флаг oem оставим в режиме по умолчанию, то есть –oem 3 (режим 3). Теперь нам осталось только настроить флаг psm, нам необходимо найти больше символов на изображении, поэтому мы будем использовать режим 11, то есть получим флаг –psm 11. Окончательная настройка флагов будет выглядеть следующим образом:

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

Улучшенное распознавание знака ограничения скорости

Улучшение точности распознавания с помощью доверительного уровня

Другой интересной особенностью, присутствующей в Tesseract, является метод image_to_data. Этот метод может определить нам такие детали распознавания как позицию символов на изображении, доверительный уровень (confidence level) обнаружения символов, линии и номера страниц. Попробуем использовать это при распознавании следующего изображения.

Распознавание названия таблицы

На этом приведенном изображении мы имеем много "шума", затрудняющего восприятие полезной информации. Значащая часть на этом изображение – это название больницы (“Fortis Hospital”). Но вместе с названием этой больницы изображение также содержит много фоновой информации, например, логотип здания. Поэтому Tesseract попытался сконвертировать все это в текст и получил много шума, например, “$C” “|” “S_______S==+” и т.д.

И в подобных ситуациях использование метода image_to_data очень удобно. Как вы можете видеть из представленного рисунка, алгоритм оптического распознавания символов возвращает нам значение доверительного уровня каждого распознанного символа. Как мы можем видеть, доверительный уровень слова Fortis составляет 64, а слова HOSPITAL – 24. Для остальной "шумовой" информации доверительный уровень равен или менее 10. Таким образом, основываясь на значении доверительного уровня для каждого распознанного элемента изображения, мы можем отфильтровать полезную для нас информацию и, таким образом, улучшить качество распознавания.

Оптическое распознавание символов (OCR) в Raspberry Pi

Хотя результаты использования Tesseract на Raspberry Pi нельзя назвать впечатляющими, его можно объединить с OpenCV для фильтрации шума и нежелательных элементов на изображении. Автор статьи с помощью Tesseract на Raspberry Pi проанализировал 7 различных изображений и для каждого изображения пытался настроить оптимальную модель распознавания.

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

Программа открывает указанное изображение для распознавания и конвертирует его в черно-белое изображение с оттенками серого (grayscale). Это уменьшит количество ненужных деталей на изображении и сделает работу Tesseract по ее распознаванию более простой. Далее для уменьшения фонового шума мы используем размытие (blur) изображения с помощью билатерального сглаживающего фильтра (bilateral filter) – это метод из библиотеки OpenCV. И, наконец, мы запускаем распознавание символов на изображении и выводим результаты распознавания на экран. Результаты работы этой программы выглядят следующим образом:

Результат распознавания дорожного знака

Надеемся, вам понравился этот проект оптического распознавания символов в плате Raspberry Pi. Также на нашем сайте вы можете посмотреть все проекты, связанные с обработкой изображений.

Исходный код программы на Python

Источник статьи

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

(Проголосуй первым!)
Загрузка...
162 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *