Привет, это 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 поддерживает этот тип, который может быть прочитан их движком:

  1. JPG
  2. PNG
  3. Гифка
  4. PNM
  5. 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.

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

Заключение

Повеселившись с Tesseract OCR, я могу сказать, что движок потрясающий !! Вот список интересных, на мой взгляд, моментов от Tesseract:

  1. Открытый исходный код.
  2. Легко использовать.
  3. Хороший результат вытяжки.
  4. Поддержка нескольких языков (латинский и нелатинский).

Если вы столкнулись с некоторыми проблемами и считаете OCR своим решением, было бы неплохо попробовать Tesseract! Надеюсь, эта статья была для вас полезной, спасибо !!