Как сегментировать документ с помощью Tesseract, а затем вывести получившиеся ограничивающие рамки и метки

Я пытаюсь заставить Tesseract вывести файл с помеченными ограничивающими рамками, которые являются результатом сегментации страницы (до распознавания текста). Я знаю, что он должен быть в состоянии сделать это "из коробки" из-за результатов, показанных на соревнованиях ICDAR, где участники должны были сегментировать и различные документы ( академическая статья здесь). Вот пример из этой статьи, иллюстрирующий то, что я хочу создать: Изображение сегментированного и маркированного вывода

Я собрал последнюю версию тессеракта с использованием brew, brew install tesseract --HEAD и пытался редактировать конфигурационные файлы, расположенные в /usr/local/Cellar/tesseract/HEAD/share/tessdata/configs/ выводить помеченные коробки. Выход получен с использованием hocr как конфиг, т.е.

tesseract infile.tiff outfile_stem -l eng -psm 1 hocr

дает ограничительную рамку для всего и имеет некоторую маркировку в class теги, например

<p class='ocr_par' dir='ltr' id='par_5_82' title="bbox 2194 4490 3842 4589">
    <span class='ocr_line' id='line_5_142' ...

но я не могу это визуализировать. Существует ли стандартный инструмент для визуализации файлов hOCR или есть средство для создания выходного файла с ограничивающими рамками, встроенными в Tesseract?

Детали текущей версии головы:

tesseract 3.04.00
 leptonica-1.71
  libjpeg 8d : libpng 1.6.16 : libtiff 4.0.3 : zlib 1.2.5

редактировать

Я действительно хочу добиться этого с помощью инструмента командной строки (как в примерах выше). @nguyenq указал мне на ссылку на API, к сожалению, у меня нет опыта работы с C++. Если единственным решением является использование API, не могли бы вы привести пример с Python?

5 ответов

Решение

Успех. Большое спасибо сотрудникам Лаборатории по распознаванию образов и анализу изображений (PRImA) за создание инструментов для этого. Вы можете получить их бесплатно на их сайте или GitHub.

Ниже я приведу полное решение для Mac, работающего на 10.10 и использующего менеджер пакетов homebrew. Я использую вино для запуска исполняемых файлов Windows.

обзор

  1. Инструменты загрузки: Tesseract OCR to Page (TPT) и Page Viewer (PVT)
  2. Используйте TPT, чтобы запустить tesseract для вашего документа и преобразовать HOCR xml в PAGE xml
  3. Используйте PVT для просмотра исходного изображения с наложенной информацией PAGE xml

Код

brew install wine  # takes a little while >10m
brew install gs    # only for generating a tif example. Not required, you can use Preview
brew install wget  # only for downloading example paper. Not required, you can do so manually!
cd ~/Downloads
wget -O paper.pdf "http://www.prima.cse.salford.ac.uk/www/assets/papers/ICDAR2013_Antonacopoulos_HNLA2013.pdf"
# This command can be ommitted and you can do the conversion to tiff with Preview
gs                          \
  -o paper-%d.tif           \
  -sDEVICE=tiff24nc         \
  -r300x300                 \
   paper.pdf 

cd ~/Downloads
# ttptool is the location you downloaded the Tesseract to PAGE tool to
ttptool="/Users/Me/Project/tools/TesseractToPAGE 1.3"
# sudo chmod 777 "$ttptool/bin/PRImA_Tesseract-1-3-78.exe"
touch "$ttptool/log.txt"
wine "$ttptool/bin/PRImA_Tesseract-1-3-78.exe"   \
  -inp-img "$dl/Downloads/paper-3.tif"           \
  -out-xml "$dl/Downloads/paper-3-tool.xml"      \
  -rec-mode layout>>log.txt

# pvtool is the location you downloaded the PAGE Viewer tool to
pvtool="/Users/Me/Project/tools/PAGEViewerMacOS_1.1/JPageViewer 1.1 (Mac OS, 64 bit)"
cd "$pvtool"
dl=~
java -XstartOnFirstThread -jar JPageViewer.jar "$dl/Downloads/paper-3-tool.xml" "$dl/Downloads/paper-3.tif"

Результаты

Документ с оверлеями (ролловер для просмотра текста и текста) Док с накладками Только оверлеи (используйте кнопки GUI для переключения) Только оверлеи

аппендикс

Вы можете запустить tesseract самостоятельно и использовать другой инструмент для преобразования его вывода в формат PAGE. Я не смог заставить это работать, но я уверен, что у тебя все будет хорошо!

# Note that the pvtool does take as input HOCR xml but it ignores the region type
brew install tesseract --devel  # installs v 3.03 at time of writing
tesseract ~/Downloads/paper-3.tif ~/Downloads/paper-3 hocr
mv paper-3.hocr paper-3.xml  # The page viewer will only open XML files
java -XstartOnFirstThread -jar JPageViewer.jar "$dl/Downloads/paper-3.xml"

На этом этапе вам нужно использовать Java-инструмент PAGE Converter для преобразования XML-кода HOCR в XML-файл PAGE. Это должно пойти немного примерно так:

pctool="/Users/Me/Project/tools/JPageConverter 1.0"
java -jar "$pctool/PageConverter.jar" -source-xml paper-3.xml -target-xml paper-3-hocrconvert.xml -convert-to LATEST

К сожалению, я продолжал получать нулевые указатели.

Could not convert to target XML schema format.
java.lang.NullPointerException
    at org.primaresearch.dla.page.converter.PageConverter.run(PageConverter.java:126)
    at org.primaresearch.dla.page.converter.PageConverter.main(PageConverter.java:65)
Could not save target PAGE XML file: paper-3-hocrconvert.xml
java.lang.NullPointerException
    at org.primaresearch.dla.page.io.xml.XmlInputOutput.writePage(XmlInputOutput.java:144)
    at org.primaresearch.dla.page.converter.PageConverter.run(PageConverter.java:135)
    at org.primaresearch.dla.page.converter.PageConverter.main(PageConverter.java:65)

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

Если вы знакомы с Python, вы можете напрямую использовать tesserocrбиблиотека, которая представляет собой хорошую оболочку Python для C++ API. Вот фрагмент кода для рисования многоугольников на уровне блока с использованием PIL:

from PIL import Image, ImageDraw
from tesserocr import PyTessBaseAPI, RIL, iterate_level, PSM

img = Image.open(filename)

results = []
with PyTessBaseAPI() as api:
    api.SetImage(img)
    api.SetPageSegMode(PSM.AUTO_ONLY)
    iterator = api.AnalyseLayout()
    for w in iterate_level(iterator, RIL.BLOCK):
        if w is not None:
            results.append((w.BlockType(), w.BlockPolygon()))
print('Found {} block elements.'.format(len(results)))

draw = ImageDraw.Draw(img)
for block_type, poly in results:
    # you can define a color per block type (see tesserocr.PT for block types list)
    draw.line(poly + [poly[0]], fill=(0, 255, 0), width=2)

С Tesseract 4.0.0 такая команда tesseract source/dir/myimage.tiff target/directory/basefilename hocr создаст basefilename.hocr файл с ограничивающими прямоугольниками на уровне блоков, абзацев, строк и слов для текста OCR. Даже команда без hocr config создает текстовый файл с символами новой строки между текстом уровня блока, но формат hocr является более явным.

Дополнительные параметры конфигурации здесь: https://github.com/tesseract-ocr/tesseract/tree/master/tessdata/configs

кратчайший путь

Также можно открыть файлы HOCR напрямую с помощью инструмента PageViewer. Однако расширение файла должно быть.xml.

Самый простой способ получить HOCR-файл с индивидуальным уровнем персонажа - использовать вилку Tesseract 3.05 для nickjwhite: https://github.com/nickjwhite/tesseract/tree/hocrcharboxes

Скомпилируйте и загрузите файлы tessdata, следуя вики из Tesseract. После проверки установки используйте:

tesseract {image file} -c tessedit_create_hocr=1 -c hocr_char_boxes=1 {output name}

и тадам!

Другие вопросы по тегам