Tesseract ocr что это
Распознавание текста с помощью 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 были проблемы с неверным порядком распознавания текста, обработкой разделенного текста.
Распознанный текст может быть в ручную откорректирован и пригоден к использованию; в большинстве случаев при распознавании текста с чеков итоговая сумма распознается хорошо и не нуждается в корректировках.
Русские Блоги
Простое использование и обучение Tesseract-OCR
Трансфер из
Tesseract, OCR (Оптическое распознавание символов, оптическое распознавание символов) с открытым исходным кодом, разработанный HP Labs, поддерживаемый Google Продолжайте совершенствовать, если команде это необходимо, вы также можете использовать его в качестве шаблона для разработки механизма распознавания, который соответствует вашим потребностям.
Далее мы установим Tesseract под Windows и осуществим простое преобразование и обучение:
Реализация Тессеракта
Общий процесс: установка Tesseract-> открыть командную строку-> создать целевой файл
Тессеракт установка
Загрузите установочный пакет tesseract-ocr-setup-3.02.02.exe. После успешной установки на соответствующем диске будет находиться папка Tesseract-OCR, как показано на рисунке.
Откройте командную строку
Откройте командную строку, введите tesseract и нажмите Enter, общий вид tesseract следующий:
Создать объектный файл
Сначала подготовьте файл изображения, например test.png
Переключите командную строку в каталог целевого файла изображения, например, мы конвертируем файл в test.png (файл изображения поддерживает несколько форматов), расположенный в C: \ Users \ Lian \ Desktop \ test, а затем введите его в командной строке
[Синтаксис]: база данных вывода tesseract imagename [-l lang] [-psm pagesegmode] [configfile…]
Откройте файл output_1.txt и найдите, что tesseract успешно преобразовал изображение в152408。
Приятно показать, что старый бренд тессеракт все еще очень силен! Но это все еще недостаточно точно, так есть ли способ улучшить точность распознавания символов тессерактом? Далее мы будем использовать вспомогательные средства обученияjTessBoxEditorПриходите на тренировочные образцы, чтобы улучшить нашу точность!
Тессеракт тренинг:
Общий процесс: установить jTessBoxEditor-> получить пример файла-> объединить файл примера-> создать файл BOX-> определить файл конфигурации символа-> исправить символ—> выполнить пакетный файл-> поместить сгенерированные обученные данные в tessdata
Установите jTessBoxEditor
Скачать jTessBoxEditor, адресhttps://sourceforge.net/projects/vietocr/files/jTessBoxEditor/; После распаковки получите jTessBoxEditor, потому что он разработан Java, поэтому мы должны убедиться, что установили JRE (среда выполнения Java, среда выполнения Java) перед запуском jTessBoxEditor.
Получить образцы файлов
Мы можем использовать инструмент рисования для рисования образцов файлов. Чем больше число, тем лучше. Я сам нарисовал 5 картинок, как показано на рисунке:
[Примечание]: формат файла образца изображения должен быть в формате tif \ tiff, в противном случае во время процесса файла слияния может произойти ошибка «Не удается найти».
Пример файла слияния
Откройте jTessBoxEditor, Tools-> Merge TIFF, выберите все файлы примеров и сохраните объединенный файл как num.font.exp0.tif.
Создать файл BOX
Откройте командную строку и перейдите в каталог, где находится num.font.exp0.tif, введите сгенерированный файл с именем num.font.exp0.box
Определить профили персонажей
Создайте текстовый файл с именем font_properties в целевой папке с содержимым
[Синтаксис]:
Коррекция персонажа
много страниц!
Не забудьте сохранить после модификации.
Выполнить пакетный файл
Создать пакетный файл в целевом каталоге
Это может быть выполнено после сохранения, и результат выполнения показан на рисунке:
В последней папке будут находиться следующие файлы, как показано на рисунке:
Поместите сгенерированные обученные данные в tessdata
Наконец, скопируйте num.trainddata в папку tessdata в Tesseract-OCR.
Финальный тест
Выполните предыдущие шаги, используйте командную строку для ввода
FineReader, Tesseract и EasyOCR или нужно ли срочно менять инструмент для OCR
По сравнению со старшими товарищами, EasyOCR очень молодой проект, но с большими амбициями. В статье приводится сравнение качества работы, удобства работы, особенности установки и производительности трёх инструментов.
Одна из популярных задач в аудиторской практике – распознавание текста с документов. Казалось бы, инструменты для решения этой задачи давно известны, всё работает и ничего больше особо и не хочется: бесплатно и руками – Tesseract, платно и легко в использовании – FineReader.
Однако, недавняя статья удивила меня качеством работы и удобством использования инструмента EasyOCR. Разберёмся, насколько всё хорошо в сравнении с самыми популярными инструментами на примере нескольких задач и сравним удобство использования каждого инструмента.
ABBYY FineReader существует с 1993 года и, фактически, стал синонимом «распознавалки текста». Сама отечественная компания ABBYY, по некоторым данным, является лидером в области разработок инструментов интеллектуальной обработки текста. Проприетарная лицензия.
Tesseract разрабатывался Hewlett-Packard с 80-х, но на долгое время был заброшен, пока его не выкупил Google в 2006 году. На данный момент программа работает и продолжает развиваться. Свободно распространяется под лицензией Apache 2.0.
EasyOCR размещён на GitHub, по сведениям PyPI, версия 1.0 вышла 23.04.2020, проект активно развивается. Лицензия – Apache 2.0.
Кратко опишем процесс работы с каждым инструментом.
Для FineReader всё делается мышкой: установил, выбрал файл, нажал пару кнопок и получил результат. Инструмент Hot Folder позволяет создавать задачи по распознаванию с множеством параметров, например, самый банальный вариант: распознать все PDF в папке и для каждого записать текст в TXT с тем же названием. Причём, опять же, всё делается мышью, просто и понятно.
Для Tesseract примерный процесс: скачать Tesseract, установить pytesseract, понять, что Python не видит tesseract.exe, исправить, понять, что нет модели для русского языка в tessdata, скачать и кинуть куда надо. И, хотя, результаты работы местами оставляют желать лучшего и требуют дополнительных настроек, зато можно руками сделать инструмент для любой задачи распознавания. Самый простой вариант для получения текста:
Для EasyOCR на Windows: установить torch и torchvision, установить EasyOCR, загрузить из Python модель нужного языка и использовать. Самый простой вариант для получения текста, разбитого по параграфам:
Далее представлены результаты работы инструментов. FineReader использовался на ПК с Ryzen 3200G, EasyOCR на ноутбуке с Core i3 4100m, Tesseract же запускался и там и там. Всё без видеоускорителей. Возьмём, в том числе, изображения из статьи. Все изображения в формате JPG.
Рисунок 1 — изображение 285х208.
Для того же изображения, что и выше, но в разрешении 1333х1000 результаты следующие:
Рисунок 2 – изображение попугайчика с наклонённым текстом.
Текст на изображении попугайчика с наклонённым текстом был успешно распознан только EasyOCR.
Рисунок 3 – изображение с плохим освещением, расфокусировкой, наклоном.
Для чистоты эксперимента, для того же изображения, что и выше, но c использованием инструмента из статьи результаты следующие:
Рисунок 4 – Изображение, взятое из репозитория Tesseract.
При этом, время работы FineReader для 6 изображений, согласно логу, составило 13 секунд, Tesseract в среднем работает 0,5-3 секунды для изображения вне зависимости от платформы для запуска, а EasyOCR даже на последнем изображении работал почти 20 секунд! При наличии графического ускорителя с поддержкой CUDA время работы должно сократиться, однако, подобные требования делают использование EasyOCR на стандартном офисном «железе» практически невозможным для большинства задач.
Также, исходя из результатов, можно сделать вывод, что качество распознавания символов EasyOCR может посоревноваться с FineReader, а иногда и превосходить его, однако, в разбиении текста на параграфы, как FineReader, так и Tesseract всё ещё лучше. Это можно наблюдать в последнем примере, который является простейшим из всех: каждый инструмент верно распознал сам текст, но, в то время как FineReader разбил текст на параграфы, а Tesseract позволяет даже увидеть где были переносы на новую строку внутри параграфа (‘\n’ и ‘\n\n’ в тексте), EasyOCR вернул результатом одну строку, в которой даже некоторые точки были потеряны.
Таким образом, по результатам сравнения трёх инструментов, можно сделать следующий вывод: EasyOCR, как инструмент распознавания текста обладает большим потенциалом и уже сейчас, при наличии мощной платформы для запуска, может составить конкуренцию FineReader и Tesseract.
Ссылки на используемые инструменты: FineReader, Tesseract, EasyOCR.
Разве Tesseract распознаёт медленно?
Работу каждой программы можно ускорить минимум в десять раз
Рабочая установка разработчиков Smart Engines
Особенностью любого проекта (заказной работы, предназначенной для создания программного или программно-аппаратного комплекса с установленными заранее свойствами, которые невозможно получить покупкой готового продукта) являются наличие ограничений по срокам и ограничений по ресурсам у исполнителя. Другими словами в проекте исполнитель не всегда имеет возможность решать задачи так, как считает нужным, и вынужден искать компромиссные решения, позволяющие достичь необходимой функциональности при соблюдении сроков и других ограничений. В нашем проекте было необходимо в краткие сроки найти способ распознавания 60000 страниц за 8 часов. По различным причинам мы остановились на бесплатном ПО распознавания текстов и выбрали OCR Tesseract. Основанием для выбора было приемлемое качество распознавания текстов, обеспечивающее качество последующей классификации.
После сборки полнофункционального макета системы (кроме полнотекстового OCR в нём были функции распознавания штрих-кодов, анализа образов страниц документов и функции импорта страниц и экспорта результатов) мы обнаружили, что созданное ПО работает достаточно медленно даже для демонстрации функций системы. Например, оказалось, что обработка 100 страничной тестовой пачки документов занимает более 1 часа, что совершенного не годится для показа заказчику — он просто не дождётся, пока исходные 100 страниц попадут в электронный архив!
Анализ быстродействия показал, что бОльшая часть времени уходит именно на распознавание Tesseract. Поиск информации (как в интернете, так и запросы специалистам) о быстродействии Tesseract показал, что многие пользователи отмечают недостаточное быстродействие этой OCR, а рекомендации по ускорению Tesseract носят частный характер и должны быть проверены экспериментально. Мы проверили несколько способов увеличения скорости распознавания и расскажем о тех из них, которые привели к значительному ускорению работы всей системы.
Способы ускорения произвольной программы можно условно разделить на несколько групп, таких как:
Начнем с возможности оптимизации собственно Tesseract. Для версии 3.04.00 встроенный для сборки однопоточной системы с помощью Microsoft Visual Studio 2013 с оптимизацией SSE2 профайлер показывает, что 15-25% всего времени исполнения Tesseract заключено в одной единственной функции IntegerMatcher::UpdateTablesForFeature. Теоретически эта функция является кандидатом на оптимизацию алгоритмов, но легко видеть, что код функции IntegerMatcher::UpdateTablesForFeature явно был многократно оптимизирован, по крайней мере, с точки зрения организации данных и минимизации количества операций обработки. Мы пришли к выводу, что возможности такой оптимизации явно требуют расходов времени, которые мы не могли допустить в нашем проекте. Поэтому мы перешли к более простым способам оптимизации.
Опишем используемые нами основные параметры API Tesseract. Инициализация проводилась в режиме fast mode (tesseract::OEM_TESSERACT_ONLY в методе api.Init()). Распознавалась вся площадь страницы, поскольку для некоторых классов документов недостаточно анализировать заголовок страницы и требует поиск слов в нижней части страницы. Использовался язык распознавания «rus+eng», что выглядит естественным для деловых документов, при печати которых использовались слова как русского, так и английского языка. Страницы были представлены цветными изображениями, хотя в реальности многие страница являлись полутоновыми.
Изменение некоторых из этих параметров позволило существенно ускорить распознавание.
Оценка быстродействия Tesseract проводилась на компьютере Intel® Core(TM) i7-4790 CPU 3.60 GHz, 16,0 GB, Windows 7 prof 64-bit с 4 физическими ядрами и 8 ядрами HT. Для всех описываемых ниже экспериментов мы использовали один набор данных, состоящий из 300 изображений страниц документов различного типа, различной цветности (полутоновые и цветные), различного разрешения (от 150 до 300 точек на дюйм), различного качества (чистые и зашумленные) и с различным количеством букв на странице. Оценка быстродействия Tesseract проводилась с помощью непосредственных замеров времени распознавания одной страницы.
Распознавание всех 300 страниц с первоначальными параметрами заняло t=4928,53 секунд, при этом среднее время распознавания одной страницы tcp составило 16,43 секунды, минимальное время распознавания одной страницы tmin = 0,99 секунды, а максимальное tmax = 143,21 секунды. Рассмотрим интервалы времени по 10 секунд в диапазоне от 0 до 150. Разброс времени распознавания иллюстрируется гистограммой количества страниц с временем распознавания, попавшим в один из интервалов:
а также графиком суммарного времени, затраченным на распознавание всех страниц из соответствующего интервала:
Качественно большой разброс объясняется разнообразием образов страниц в тестовом наборе. В рассмотренном множестве страниц наибольшее время тратится на страницы с большим количеством символов или объектов похожих на символы.
Для ускорения мы, прежде всего, изменили язык распознавания с «rus+eng»на «rus». Это стало возможным из-за внесения изменений в алгоритм дальнейшей классификации, состоящих в анализе только слов, напечатанных кириллицей. Посмотрим, каков оказался выигрыш в быстродействии: суммарное время t=3262,33 сек, среднее время распознавания одной страницы tcp=10,87 секунды, минимальное время распознавания одной страницы tmin=0,99 секунды, максимальное tmax = 83,07.
Результативным оказалось ограничение зоны распознавания в каждой из страниц. Для этого на обучающем множестве из примерно 5000 страниц мы выбрали такое ограничение, чтобы в этой зоне находилось все возможные ключевые слова, необходимые для классификации, и с небольшим запасом выбрали ограничение как 70% по высоте страницы и 90% по ширине. Естественно, что с таким ограничением Tesseract стал распознавать быстрее: суммарное время t=2649,57 сек, среднее время распознавания одной страницы tcp=8,83 секунды, минимальное время распознавания одной страницы tmin=0,83 секунды, максимальное tmax = 77,64.
Отметим, что обе модификации параметров стали возможным только в результате специфики проекта, в других условиях это могло не сработать, например, при наличии во входном потоке англоязычных документов язык распознавания пришлось бы оставить «rus+eng».
Однако после такого «везения» мы продолжили поиск алгоритмов для ускорения обработки страниц. Весьма результативной оказалась процедура бинаризации образов страниц перед распознаванием. Первоначальной целью бинаризации мы считали улучшение собственно точности распознавания благодаря снятию сложного фона и морфологическим операциям. Но бинаризация также дала хорошее ускорение: t=2293,20 сек, tcp=7,64 сек, tmin=0,98 сек, tmax = 59,83 сек. Эти времена были получены для случая распознавания с одним языком «rus «, установленной рамкой 0,7х0,9 и с предварительной бинаризацией. Подчеркнем, что приведенные времена включают в себя суммарное время распознавания Tesseract и времени на бинаризацию.
Мы предполагаем, что бинаризация является универсальным приемом, позволяющим одновременно ускорить распознавание и увеличить точность распознавания.
Теперь расскажем об оптимизации с помощью компиляции. Все предыдущие эксперименты проводились с помощью компилятора Visual Studio 13 (version 12.0.40629.00 Update 5). При компиляции с помощью Intel C++ Compiler XE 15.0 мы получили хорошее ускорение по отношению к предыдущему варианту с бинаризацией, рамкой и одним языком: t=2156,00 сек, tcp=7,19 сек, tmin=0,76 сек, tmax=59,66 сек. Для компилятора была указана опция оптимизации для архитектуры AVX2. Для архитектуры SSE4.2 результаты почти такие же, хотя и не превосходящие результаты для архитектуры AVX2. Здесь необходимо упомянуть о том, что компилятор Intel позволяет оптимизировать быстродействие не только для Tesseract, но и для всех других компонент, используемых в системе.
Дополнительно можно было бы воспользоваться установкой таймаута, ограничивающего время распознавания одной страницы, например для метода TessBaseAPI::ProcessPages. Тогда для значения таймаута, равного 30 000 миллисекунд, был бы получен результат: t=2087,10, tcp=6,96, tmin=0,76 сек, tmax=30,00 сек. Однако мы отказались от такого способа оптимизации по двум причине наблюдаемых потерь, связанных с невозможностью классифицировать страницу, забракованную по таймауту.
Для наглядности мы сохранили результаты описанных экспериментов в таблицу:
№ | Способ оптимизации | Суммарное время t (сек) | Среднее время tcp (сек) | Минимальное время tmin (сек) | Максимальное время tmax (сек) |
---|---|---|---|---|---|
1 | Исходный вариант | 4928,53 | 16,43 | 0,99 | 143,21 |
2 | Язык «rus» вместо «rus+eng» | 3262,33 | 10,87 | 0,99 | 83,07 |
3 | Вариант 2 с ограничением зоны распознавания | 2649,57 | 8,83 | 0,82 | 78,38 |
4 | Вариант 3 с предварительной бинаризацией | 2293,20 | 7,64 | 0,98 | 59,83 |
5 | Вариант 4 с оптимизацией для AVX2 компилятором | 2156,00 | 7,19 | 0,76 | 59,66 |
Из таблицы следует, что в результате принятых способов оптимизации (вариант 5) суммарное время распознавания всех страниц уменьшилось по отношению к суммарному времени для исходного варианта более, чем в два раза. При этом за счет выбранных алгоритмов бинаризации мы улучшили качество распознавания и последующего анализа содержимого страниц. При такой обработке в течение 8 часов будет распознано примерно следующее количество страниц: 86060/7,19 ≈ 4005.
На следующих рисунках для всех рассмотренных вариантов оптимизации приведены гистограммы количества страниц с временем распознавания, попавшим в один из 10-секундных интервалов и графики суммарного времени, затраченным на распознавание всех страниц из тех же интервалов:
Рассмотрим на графике для вариантов 4 и 5 частоты случившихся времен, попавших в односекундные интервалы. На графике видно, что оптимизация для архитектуры AVX2 уменьшает время распознавания страниц для всех интервалов.
Для вариантов 4 и 5 значения суммарного времени работы Tessract (ранее в таблице были даны значения суммарного времени на распознавание и бинаризацию) составляют 2091,86 и 1993,27 секунд, то есть оптимизация для архитектуры AVX2 позволяет ускорить собственно Tesseract примерно на 5%.
Ясно, что распознавание бОльшого объема страниц нельзя организовать без масштабирования. При масштабировании мы использовали одновременно многопоточность и многопроцессорность. При этом важное внимание было уделено алгоритму балансировки нагрузки на вычислительные модули. Эта система была реализована самостоятельно без применения MPI. Проведем эксперименты обработки (не только распознавания Tesseract, но и всех остальных видов обработки) всех 300 тестовых страниц на одном узле, совпадающем с ранее использованном компьютером, будем оценивать время t обработки всех 300 страниц. Результаты сведены в таблицу:
Количество процессов | Количество потоков в процессе | Суммарное время t (сек) | Среднее время tcp (сек) |
---|---|---|---|
1 | 1 | 2361 | 7,87 |
1 | 2 | 1318 | 4,39 |
1 | 3 | 829 | 2,76 |
1 | 4 | 649 | 2,16 |
2 | 1 | 1298 | 4,33 |
2 | 2 | 789 | 2,63 |
2 | 4 | 485 | 1,62 |
2 | 8 | 500 | 1,67 |
Из таблицы следует, что наилучший результат (1,62 секунд на обработку одной страницы) достигается при запуске 2 приложений, в каждом из которых создано по 4 потока для обработки страниц. Это время соответствует случаю, когда в течение 8 часов будет распознано примерно следующее количество страниц: 86060/1,62=17778. Другими словами мы увеличили скорость обработки страниц примерно в 10 раз. А для обработки заявленного объема в 60000 страниц за 8 часов потребуются 4 аналогичных узла.
Разумеется, можно утверждать, что в аналогичных проектах распараллеливание является наиболее эффективным инструментом увеличения скорости обработки, однако проведенные описанные работы по оптимизации позволили нам ускорить обработку еще в 2 раза, или, что то же самое, позволили уменьшить количество узлов в 2 раза.
В заключение перечислим эксперименты и исследования, которые нам было бы интересно провести «в-принципе», если бы мы имели достаточно свободного времени и достаточные ресурсы: