LINUX.ORG.RU

Как заставить Tesseract распознавать текст посимвольно, без словаря и повысить качество?

 


1

1

Добрый день. Нужно распознать текст с качественно сканированной книги (Каталога латинских названий), без искажений, RGB, преимущественно черно белый. Все знаки - латиница, но часто попадаются из немецкого, французского и испанского. Несколько шрифтов. Часто попадаются слова наклонным шрифтом, знаки в числах всегда на разной высоте, т.е. 069 - хвостики будут выше и ниже строки, такой стиль. Орфография преимущественно латынь, но почти все слова могут, по определению, не иметь никакого смысла, т.е. могут быть произвольным набором букв только подчиняющихся(и то не обязательно) правилам латинского языка. Т.е. заранее построить словарь всего массива текста нельзя. Целью распознавания является построение этого словаря. Объем большой, порядка 10000 страниц. Tesseract ошибается в первом же слове. Качество распознавания очень плохое. Очевидно, что он распознает не буква в букву, а ищет слова или сочетания букв по словарю по максимальной вероятности в заданном языке. Вместо правильного маловероятного «Aaages» пишет более благозвучное и более вероятное «Anages», хотя символы видны достаточно четко. Хотя национальные символы он распознает правильно. Предполагаю, что если частично отключить ему «мозги», то он бы правильнее распознавал.

1. Посоветуйте, как заставить его распознавать текст буквально, а не гадать по вероятностям? Как повысить качество распознавания? Загрузить пример затрудняюсь. Для сравнения, online FineReader распознает почти всё правильно, но дорого для меня.

2. Не получается сделать вывод в PDF-текст, получается PDF-исходное-изображение

Покажите, как запускаете tesseract. Указываете латинский язык явно?

$ tesseract myscan.png out.txt -l lat

fluorite ★★★★★ ()
Ответ на: комментарий от fluorite

tesseract -l lat+eng+fra+deu+por ./pg0001.png pg0001_5 txt Tesseract Open Source OCR Engine v4.00.00alpha with Leptonica contains_unichar_id(unichar_id):Error:Assert failed:in file ../ccutil/unicharset.h, line 513 Segmentation fault # Проверить не смог.

если отключить lat, то завершается без сбоев

tesseract -l eng+fra+deu+por ./pg0001.png pg0001_4 txt Tesseract Open Source OCR Engine v4.00.00alpha with Leptonica #

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

MariaRTI ()
Ответ на: комментарий от fluorite

Если удалить все языки из tessdata и запустить так:

tesseract ./pg0001.png pg0001_3 txt Error opening data file /usr/local/share/eng.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your «tessdata» directory. Failed loading language 'eng' Tesseract couldn't load any languages! Could not initialize tesseract.

Без языков не хочет работать

MariaRTI ()
Ответ на: комментарий от fluorite

одно слово удалось победить. использовал опцию --oem 0 - «только базовый tesseract»

Теперь Aaages правильно, но национальные символы всё же ошибается (видимо, восточно-европейские) и в цифрах ошибается, 2 читает как 1 и т.д.

MariaRTI ()
Ответ на: комментарий от fluorite

Печально...

Вот ещё одна трудность. Тут точно правила латинского языка нужны! Как ошибку сегментации исправить?

При латинизации русских слов, буква «й»-краткое обозначают как i с обратной шляпкой. Это правило латинского языка для кратких звуков.

Например, Баровский -> в каталоге как «Barovskii» но последняя i не такая, а с перевёрнутой шляпкой ^.

tesseract такое вообще ни в каком виде распознать не может. То «l», то «t» распознаёт, не не i и не i-краткое

MariaRTI ()
Ответ на: комментарий от MariaRTI

а на стабильном релизе (3.05.01) тоже сегфолтится?

anonymous ()
Ответ на: комментарий от anonymous

не пробовал. Когда прочитал требования по версиям, поставил всё самое новое

MariaRTI ()
Ответ на: комментарий от anonymous

он сегфолтится из-за отсутствия в латинском словаре, уникодных символов, которые тут на каждом шагу, как я понял. Возможно, криво понял.

MariaRTI ()
Ответ на: комментарий от MariaRTI

вот, ещё раз только с латинским

tesseract -l lat ./pg0001.png pg0001_lat txt Tesseract Open Source OCR Engine v4.00.00alpha with Leptonica contains_unichar_id(unichar_id):Error:Assert failed:in file ../ccutil/unicharset.h, line 513 Segmentation fault

В уникоде он правильно полез, хотя я ему заказал латиницу, ибо символы хоть и латинские, но уникодные.

MariaRTI ()
Ответ на: комментарий от MariaRTI

т.е. язык латинский, а символы уникодные. Так правильнее.

MariaRTI ()
Ответ на: комментарий от anonymous

сегфолтится вот на этом месте

bool get_isdigit(UNICHAR_ID unichar_id) const { if (INVALID_UNICHAR_ID == unichar_id) return false; line 513: ASSERT_HOST(contains_unichar_id(unichar_id)); return unichars[unichar_id].properties.isdigit;

Пытается распознать цифру «isdigit» и не находит в уникоде... как это понимать?

MariaRTI ()

1. ЕМНИП, На качество распознавания влияет порядок языков, в котором в их указываете. Поэтому к началу списка подвигайте более вероятные языки.

2. У тессеракта плохая предобработка изображений, так что препроцессинг лучше использовать свой. Бинаризация там к примеру обычный Оцу из leptonlib. Так что тут простор для фантазии велИк.

3. На диковинных шрифтах придётся Тессеракт самому учить. И помните - чем больше словарей, тем медленнее распознаёт.

4. Качество постобработки у Тессеракта тоже не очень, поэтому рекомендую вручную прогонять по словарям, N-граммам и так далее.

5. Тессеракт имеет свойство крашится, если отойти шаг вправо-шаг влево. Это нормально для него. Попробуйте самый новый ещё не релизнутый тессеракт.

zamazan4ik ★★ ()
Ответ на: комментарий от zamazan4ik

Я почитал по обучению вообще и понял, что там всё как-то сложновато.

Может быть как-то можно его попроще, на реальных примерах обучать. Например, я могу распознать FineReader-ром несколько страниц, сохранить их в Unicode текст, немного текст подправить, где ошибки. Затем использовать эти текстовые страницы для обучения tesseract. Как это сделать?

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

MariaRTI ()
Ответ на: комментарий от MariaRTI

Я лично пока что не занимался обучением тессаракта - этим на работе другой человек раньше занимался.

Так просто, как ты хочешь, обучение не происходит. Но ЕМНИП, там не всё так страшно как ты думаешь.

zamazan4ik ★★ ()
Ответ на: комментарий от MariaRTI

хм. собрал, у меня не крашится ни на lat ни на Latin. traineddata брал отсюда: https://github.com/tesseract-ocr/tessdata_best

скриншот терминала распознаёт хуже, чем третья версия, кстати. если охота, то можешь скинуть файл, на котором крашится. http://www.tinyupload.com/ — до 50 мегабайт.

anonymous ()
Ответ на: комментарий от MariaRTI

я бы сказал, что при таком разрешении исходника, распознавание просто шикарное.

вот результат с дефолтным eng, без опций, а это diff от только eng и lat+eng+fra+deu+por.

перед распознаванием я увеличил картинку в три раза: convert pg0001.png -resize 300% pg0001-x3.png.

собрал версию из ветки master:

$ tesseract4/bin/tesseract -v                                       
tesseract 4.00.00alpha
 leptonica-1.74.4
  libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.1) : libpng 1.6.32 : libtiff 4.0.8 : zlib 1.2.11 : libwebp 0.6.0

 Found AVX
 Found SSE

anonymous ()
Ответ на: комментарий от anonymous

--- lat+eng+fra+deu+por

должно быть +++ lat+eng+fra+deu+por, сорян.

anonymous ()
Ответ на: комментарий от anonymous

Заменил tessdata

tesseract -l lat ./pg0001.png pg0001_lat_best txt Tesseract Open Source OCR Engine v4.00.00alpha with Leptonica Крашиться перестал. Распознавание намного лучше! Спасибо!

Но Латынь, он как простую латиницу понимает, а надо, как в книге со значками. Вот, например, Münich он правильно по немецки распознал, хотя я только латиницу заказывал, а латинкую «ĭ» «Barovskiĭ» он распознаёт как «Barovskii», хотя этот символ имеется в стандартной Unicode (U+012D) Т.е. его он должен знать.

MariaRTI ()
Ответ на: комментарий от anonymous

У меня ещё лучше получилось (только -l lat). Но мне всё равно не нравится. Много ручной работы сулит.

MariaRTI ()
Ответ на: комментарий от MariaRTI

Хотя, действительно, очень хорошо. Никаких языков кроме lat не нужно, остальные национальные символы входят в стандартную кодировку и он их распознаёт. А проблему с «ii» можно решить автозаменой, тем более там ещё мелкий мусор есть который также автозаменой sed-ом убирается.

MariaRTI ()
Ответ на: комментарий от MariaRTI

Спасибо!

не за что :)

там ещё есть Latin.traineddata, может с ним лучше будет? а ещё, возможно, дело в разрешении.

anonymous ()
Ответ на: комментарий от anonymous

При увеличение на 200% пропал мусор и ошибки в распознавании. Почти идеально! Однако «ĭ» - так и не распознаётся. Надо дальше пилить.

И ещё, в самых неожиданных местах, в основном в белом пространстве перед или после строки появляются символы, которых вообще нет в оригинале '.|

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

Между lat и Latin разницы не увидел, сделаю обе эти версии и затем перекрестную проверку на всем массиве.

MariaRTI ()
Ответ на: комментарий от anonymous

При более внимательном рассмотрении нашел различия в lat и Latin. Процент ошибок примерно равный, но ошибки в разных местах.

MariaRTI ()
Ответ на: комментарий от anonymous

В среднем, Latin точнее распознает спецсимволы и пунктуацию, но чаще чем lat допускает «невозможные» ошибки - пропуски целых больших слов, дублирование заглавных букв («—€Col.» вместо «—Col.», «Abaçcoproeces» вместо «Abacoproeces» или хотя бы «Abaçoproeces» (там реально помарка под буквой «c»)). Заменить регуляркой одиночные ошибки можно, т.к. эти символы там неуместны, но двойные нельзя, т.к. не известно сколько символов в оригинале. Изменение масштаба влияет на распознавание, но не линейно. Нужно подбирать оптимальное разрешение. Видимо, это связано с окном распознавания.

MariaRTI ()
Ответ на: комментарий от MariaRTI

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

в вики есть статья про то, как улучшить качество распознавания. в разделе «Dictionaries, word lists, and patterns» рассказано про возможность ограничения набора символов для распознавания переменными конфига. там же есть ссылка на faq с примером. grep по исходникам выдаёт вот такой список переменных. там есть и tessedit_char_blacklist. попробуй, например, запретить символ евро, навряд ли он встречается в твоих файлах.

ещё я узнал, что в lat нет символов с бреве, но есть некоторые с умляутом. а вот список символов Latin, целых 3503 символа, включая символы с бреве. поэтому так долго и распознаёт, если сравнивать с lat или eng.

ещё одно из возможных решений проблемы — поискать traineddata с нужными тебе символами, среди официальных данных или просто в сети.

anonymous ()
Ответ на: комментарий от MariaRTI

если соберёшься тренировать, то шрифт в твоём документе — times. не times new roman, а вот этот: https://www.myfonts.com/fonts/linotype/times/ с old style figures for numerals (там в менюшке ff выбери, если по дефолту не покажет).

anonymous ()
Ответ на: комментарий от anonymous

К сожалению, других сканов нет. Спасибо за советы, буду пробовать.

Вчера я сравнил дифом три результата - lat, Latin, Latin+lat с проверенным вручную образцом. Latin+lat - наилучший. Latin - примерно, в два раза хуже. lat - примерно, в три раза хуже.

MariaRTI ()
Ответ на: комментарий от anonymous

1) Список переменных я получил, но не нашел в конфигах tessedit_char_blacklist.

Я нашел только /usr/local/share/tessdata/configs /usr/local/share/tessdata/tessconfigs

добавил в .../configs свой файл blacklist: tessedit_char_blacklist A€$^@&?!«%*~`+=_|\;

Буква A добавлена, чтобы совсем очевидно было, что параметр работает.

Не работает этот параметр у меня. Что-то не так делаю.

Тестирую так: convert inpit.png -resize 200% png:- | tesseract -l Latin+lat - - txt blacklist > output.txt

diff output.txt etalon.txt > output.diff

на выходе получаю тоже самое с запрещенными символами

MariaRTI ()

Про Tesseract тут уже говорят, так что я только добавлю, что если не получится с тессерактом, и ты готов тренировать модели, можно попробовать Ocropus. Его несколько труднее применять из коробки, но зато он лучше поддаётся обучению.

proud_anon ★★★★★ ()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от anonymous

Что-то велосипед не едет. Игнорируются черный и белый списки. Погуглил, проблема очень частая, не понятно, решена или нет.

Добавил списки прямо в .../configs/txt

# This config file should be used with other cofig files which creates renderers. # usage example: tesseract eurotext.tif eurotext txt hocr pdf tessedit_create_txt 1 tessedit_char_whitelist 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzĭüéäç.,()[]—- tessedit_char_blacklist €

Вызываю как и раньше

MariaRTI ()
Ответ на: комментарий от proud_anon

а есть инфа, насколько хуже он работает из коробки? Мне бы такая информация очень сильно пригодилась

Мб у вас есть какой-то опыт в данной сфере?

zamazan4ik ★★ ()
Ответ на: комментарий от zamazan4ik

а есть инфа, насколько хуже он работает из коробки? Мне бы такая информация очень сильно пригодилась

Зависит от языка и шрифта.

Вообще говоря, у Окропуса из коробки всего несколько моделей. Я его использовал в академической среде, где мы тренировали модели сами.

proud_anon ★★★★★ ()
Ответ на: комментарий от proud_anon

Результаты вами тренированной модели были лучше, чем у аналогичной модели на Тессаракт? Или не тестили?

zamazan4ik ★★ ()
Ответ на: комментарий от zamazan4ik

Результаты вами тренированной модели были лучше, чем у аналогичной модели на Тессаракт? Или не тестили?

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

proud_anon ★★★★★ ()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от MariaRTI

я четвёртую версию удалил уже, заново устанавливать неохота. в третьей у меня вот так сработало:

$ tesseract pg0001-x3.png rec 
$ head -3 rec.txt
A

Aaages BarovskiI 1926, Rev. russe Ent.. 20, 69.—Col.

$ tesseract pg0001-x3.png rec -c tessedit_char_blacklist=A      # <---
$ head -3 rec.txt
P1

fiaages BarovskiI 1926, Rev. russe Ent.. 20, 69.—Col.

$ echo "tessedit_char_blacklist Aas" > config.txt               # <---
$ tesseract pg0001-x3.png rec config.txt
$ head -3 rec.txt
P1

finger: B3.rov5kiI 1926, Rev. ruSSe Ent.. 20, 69.—Col.
anonymous ()
Ответ на: комментарий от anonymous

Возвращаясь к старому вопросу...

Почему tesseract, замечено только в режиме Latin, 1) пропускает некоторые целые слова и словосочетания целиком, даже мусора не выводит. Хотя эти слова ничем принципиально не отличаются от других.

2) частенько вставляет подряд два близких варианта одного и того же символа.

Например 8S çc €C

слева и справа от таких символов, как правило, сильно отличающийся контент. Трудно спутать или распознать так что-то, находящееся рядом.

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

MariaRTI ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.