Привет, это 5-й день Рождественского календаря Рвений 2020. Подробная информация о Рождественском календаре написана здесь. Https://medium.com/zeals-tech-blog/zeals-engineers-are-going-to-host-an-advent-calendar-4c94ad46575d. Пожалуйста, ознакомьтесь с другими интересными историями здесь!
Всем привет, меня зовут Бисмо, я работаю Backend Engineer в Zeals. В Zeals я в основном занимаюсь микросервисами. В этой статье я хочу поделиться своим опытом работы с двигателем. Какой двигатель? Давайте прыгнем в это !!
Прежде всего, был ли у вас когда-нибудь опыт перевода текста в ваших документах в редактируемый текстовый формат? Выполнение этого вручную потребует много времени и усилий. Нам нужно что-то, чтобы помочь процессу эффективно. А вот статья, чтобы решить эту проблему, играя с OCR !!
Вступление
Оптическое распознавание символов или оптическое распознавание символов (OCR) - это электронное или механическое преобразование изображений печатного, рукописного или напечатанного текста в машинно-кодированные. текст, будь то из отсканированного документа, фотографии документа, фотографии сцены (например, текст на вывесках и рекламных щитах на альбомной фотографии) или из текста субтитров, наложенного на изображение (например, из телетрансляции). "[источник]"
Чтобы лучше понять, как работает OCR, просмотрите схему процесса на следующем рисунке. Со стороны конечного пользователя процесс OCR очень прост: достаточно просто обработать изображение и получить редактируемый текст.
Библиотека
Существуют различные инструменты OCR не только из платных сервисов (Google, Amazon, Azure и т. Д.), Но и из библиотеки с открытым исходным кодом, одним из которых является Tesseract. На этой игровой площадке мы проведем несколько экспериментов с использованием движка Tesseract, чтобы извлекать текст из текста на основе изображения с несколькими регистрами. Но подождите, что такое Тессеракт? Звучит как объект из фильма Мстители :)
Tesseract - это механизм оптического распознавания символов для различных операционных систем. Это бесплатное программное обеспечение, выпущенное под лицензией Apache License. Первоначально разработанное Hewlett-Packard в качестве проприетарного программного обеспечения в 1980-х годах, оно было выпущено с открытым исходным кодом в 2005 году, а с 2006 года разработка спонсируется Google. [Источник]
Tesseract имеет 37,4 тыс. Звезд + 6,9 тыс. Вилок (28 ноября 2020 г.) на своем github и все еще поддерживается. Это хороший аргумент, почему мы должны попробовать этот движок.
Установка
Перейдите на официальную страницу Tesseract github, чтобы установить пакет в вашей системе. После успешной установки пакета вы сможете запустить команду tesseract
на своем терминале (я использую Mac).
$ tesseract Usage: tesseract --help | --help-extra | --version tesseract --list-langs tesseract imagename outputbase [options...] [configfile...] OCR options: -l LANG[+LANG] Specify language(s) used for OCR. NOTE: These options must occur before any configfile. Single options: --help Show this help message. --help-extra Show extra help for advanced users. --version Show version information. --list-langs List available languages for tesseract engine.
В этой статье моя версия Tesseract - 4.1.1
. Вы можете проверить версию, набрав команду tesseract --version
.
$ tesseract --version tesseract 4.1.1 leptonica-1.80.0 libgif 5.2.1 : libjpeg 9d : libpng 1.6.37 : libtiff 4.1.0 : zlib 1.2.11 : libwebp 1.1.0 : libopenjp2 2.3.1 Found AVX2 Found AVX Found FMA Found SSE
Поддерживаемый файл
Основываясь на информации, которую я нашел, и на моем личном опыте тестирования каждого файла, Tesseract поддерживает этот тип, который может быть прочитан их движком:
- JPG
- PNG
- Гифка
- PNM
- TIFF
К сожалению, движок Tesseract не может читать PDF-файл. Я проверил файл PDF, но выводит сообщение об ошибке, как в сообщении ниже.
Error in pixReadStream: Pdf reading is not supported Error in pixRead: pix not read
В случае с файлом PDF нам необходимо преобразовать его в поддерживаемые файлы, указанные выше, перед извлечением с помощью Tesseract.
Тестирование
Когда наша среда Tesseract будет готова, давайте попробуем протестировать это простое текстовое изображение Lorem ipsum. Как видим, качество изображения довольно хорошее и четкое. Это условие не должно вызывать никаких проблем, когда мы хотим извлечь редактируемый текст.
Извлечь текст с помощью Tesseract довольно просто. Нам просто нужно запустить tesseract IMAGE_PATH OUTPUT
. Вот объяснение команды.
tesseract
: Основная команда.IMAGE_PATH
: расположение параметра изображения.OUTPUT
: выходной параметр. Мы можем использоватьstdout
для вывода вывода в терминал. Или/path/to/txt
получить txt файл.
Вывод стандартного вывода будет выглядеть так.
$ tesseract lorem.jpg stdout Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 376 Lorem ipsum dignis eium fugit aspelluptat eati odis net exeri rectem lia venihil icipsapid qui dolupient quam aceatemque repedi tem lantiae provid quia sitatia temqui- buste voluptatquo comnit fugiat invenit fugia quo ditias ipi- tatat erspel id utesecuptur solorio. Hari veria dis nis et millic tota comnimet inctor sum aut laboressedis deribus illore non et fugitiosam, soluptat in eatur? Endignatem el et ex endicim re occullu ptatem laut audipita num fugit adis delenti cum sus aut iduntur arumqui blam eos molorum quissimint, nis ut aut adisci odic te as everspe ditati accum alit rempel iumque nobis repudamus. ...... Lupieniendis aut volorerio. Daectot aectestium latem volenimus ut velis alibus ulliciis aceaquam derovid elitatet que vel minctume iusam dolupti venis am fugit etus vellit re viducid quiatquiant volestisti torehen tiorestem antis militas nes del ilicaturibus et et est harum, ipsant, natem quos es ipsa velit est, es re volupta temolorum este explant. Pore vid est, audam facia voluptiae pos ut que nullo- ria core nihilita istio tem quiscia volore nulliae corpos eatur
Создание файла Txt просто имеет выходное сообщение, подобное команде stdout на терминале, кроме того, мы также нашли файл txt по указанному нами пути.
$ tesseract lorem.jpg /Users/momo/Desktop/lorem Tesseract Open Source OCR Engine v4.1.1 with Leptonica Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 376
На выходе текст, извлеченный из изображения, совершенно правильный !! Тогда как насчет того, чтобы изображение было отсканировано с реального документа? У меня есть документ, изображенный на следующей картинке. На изображении обнаружено несколько шумов. Мы проверим, будет ли у редактируемого текста хороший результат или нет.
$ tesseract toefl_score.jpg stdout Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 435 Centre for Language Development Institute of Educational Development and Quality Assurance Yogyakarta State University ProTEFL Score Report No. 1553.b/M/P2B-LPPMP.UN Y/ViJ/2015
Вау, из 171 символа мы просто пропустили около 3 символов или мы получили правильный результат на 98% !! Это нормально, потому что на картинке выше UNY/VII
не слишком ясен и неоднозначен для двигателя.
Нелатинские шрифты
Еще одна проблема, связанная с извлечением текста, связана с нелатинскими шрифтами. Чаще всего мы пишем текст на латыни. Но как насчет страны, которая редко использует латынь, например, японский, корейский и китайский?
В своей документации Tesseract поддерживает извлечение текста с опцией языка. Затем нам нужно проверить список языков, используемых в этой команде tesseract — list-langs
.
$ tesseract --list-langs List of available languages (3): eng osd snum
Если язык отсутствует в нашем списке, мы должны его добавить. Для примера мы попытаемся извлечь текст на японском языке. Поскольку я пользователь Mac, я буду использовать команду brew
, чтобы добавить другие языки; brew install tesseract-lang
. После завершения установки я должен увидеть jpn
в tesseract --list-langs
.
Давайте поэкспериментируем с нелатинскими скриптами !! Это простые японские иероглифы, и мы постараемся извлечь их.
Если мы просто воспользуемся стандартной командой, как в предыдущем эксперименте, мы получим неверный результат.
$ tesseract arigatou.jpg stdout Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 556 Detected 9 diacritics HYUPESCCWOES
Как мы это исправим? На самом деле команда очень похожа, нам просто нужно указать параметр языка в конце команды; tesseract arigatou.jpg stdout -l jpn
. И мы успешно получаем японские иероглифы !!
$ tesseract arigatou.jpg stdout -l jpn Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 556 Detected 9 diacritics ありがとうございます
В следующем случае, как если бы текст был смешан как с латинскими, так и с нелатинскими шрифтами? Вот пример.
Конечно, мы все еще можем сделать это, смешав язык !! Просто нужно поставить другой язык с +
вот так tesseract arigatou.jpg stdout -l jpn+eng
$ tesseract arigatou.jpg stdout -l jpn+eng Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 379 Detected 9 diacritics ありがとうございます arigatou gozaimasu: thank you
Результат
Мы проведем несколько экспериментов с различными состояниями изображения, чтобы убедиться, что движок Tesseract работает должным образом. В итоге мы получаем вот такой матричный результат. Извините, я не могу прикрепить изображения из-за личных данных.
Из приведенного выше результата мы делаем временный вывод, что результат действительно зависит от состояния отсканированного документа. Также какой стиль из документа.
Скорость
Тогда как быстро исполняется Тессеракт? Мы будем проводить различные кейсы, чтобы измерить, что делает его быстрее / медленнее. В этом исполнении я буду использовать команду trap
, чтобы показать время для каждой команды.
$ trap 'echo -e "\nStarted at: $(date)\n"' DEBUG $ pwd Started at: Wed Dec 2 10:13:19 WIB 2020 /Users/momo
Как мы видим, метка времени будет добавляться к каждой командной строке. Нам нужно изменить команду (немного сложно), чтобы точно знать, сколько времени это нужно.
$ trap 'echo -e "\nStarted at: $(date)\n"' DEBUG $ tesseract arigatou.jpg stdout -l jpn && echo "finished" Started at: Wed Dec 2 10:33:36 WIB 2020 Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 556 Detected 9 diacritics ありがとうございます Started at: Wed Dec 2 10:33:36 WIB 2020 finished
Из приведенного выше результата мы можем заметить, что время выполнения составляет ‹1 с. Потому что первая и вторая команды стартовали одновременно. Наконец, после нескольких тестов скорости мы получаем такой результат.
Возможно, это не стопроцентно верная точка, из-за которой время выполнения могло быть быстрым или медленным, но размер и тип символа дали какое-то значение, которое повлияло на время. Например, 1-я и 2-я попытки - это одно и то же изображение, только разное по размеру, но больший размер займет больше времени по сравнению с меньшим размером.
В другом случае, с тем же подсчетом символов и почти равным размером, японский символ (нелатинский шрифт) займет примерно в 6 раз больше времени, чем латинский шрифт.
К вашему сведению, я использую эту спецификацию MacBook при проведении теста.
- MacBook Pro (13 дюймов, 2017 г., два порта Thunderbolt 3)
- Процессор 2,3 ГГц, двухъядерный Intel Core i5
- Память 8 ГБ 2133 МГц LPDDR3
- macOS Catalina версии 10.15.7 (19H15)
Пакет языков программирования
Как использовать движок Tesseract на конкретном языке программирования? На самом деле, много библиотек на разных языках, например, с Tesseract.
- Госсеракт (Голанг)
- Tess4J (Java)
- RTesseract (Рубин)
- PyTesseract (Python)
- Tesseract.js (Javascript)
- Тиагоалессио ТессерактOCR (PHP)
- и т.п.
Мы можем ссылаться на приведенную выше библиотеку на основе нашего языка программирования, который мы использовали для упрощения реализации.
Заключение
Повеселившись с Tesseract OCR, я могу сказать, что движок потрясающий !! Вот список интересных, на мой взгляд, моментов от Tesseract:
- Открытый исходный код.
- Легко использовать.
- Хороший результат вытяжки.
- Поддержка нескольких языков (латинский и нелатинский).
Если вы столкнулись с некоторыми проблемами и считаете OCR своим решением, было бы неплохо попробовать Tesseract! Надеюсь, эта статья была для вас полезной, спасибо !!