Программное обеспечение для пакетного распознавания нескольких файлов изображений в несколько текстовых файлов с использованием Tesseract?

В настоящее время я использую tesseract для распознавания некоторых файлов jpeg в файлы txt (Ubuntu 16.04). Обычно это ~500 файлов в одном каталоге.

Я знаю, что могу сделать это, создав текстовый файл со всеми именами файлов (сохраненный список.txt), а затем выполните:

tesseract savedlist.txt output.txt

однако output.txt — это один файл со всеми результатами распознавания.

Мне нужно иметь возможность сохранять результаты распознавания в отдельные файлы txt с тем же именем, что и у исходного файла изображения. Например:

входной файл: image456.jpeg
выходной файл: image456.txt

Я понимаю, что более поздние версии ABBYY FineReader могут это сделать, но это для бесплатного проекта, поэтому я ищу бесплатное или недорогое (менее 20 долларов) решение.

Что я ищу для программного интерфейса или графического интерфейса пользователя с использованием tesseract, который может выполнять пакетную обработку ocr, как это, все в одной пакетной операции.

Решение командной строки для этого также будет в порядке. Если здесь не по теме, я могу спросить об этом на другом сайте, но я не хотел размещать сообщения на двух сайтах одновременно.

@Izzy Если есть решение для программирования, а не программное, не будет ли проблем с размещением этого вопроса на другом сайте? Любая рекомендация (SuperUser или другой)?
Если под программированием вы имеете в виду сценарии, то SU может подойти. Программирование обычно находится на SO. Если вы убедитесь, что вопрос сфокусирован по-другому (так что это действительно другой вопрос — например, здесь запрашивается существующее программное обеспечение, здесь запрашиваются решения для сценариев), проблем не должно быть.

Ответы (4)

В Баше:

for file in FILES ; do tesseract "$file" "${file%%.*}" ; done

где вместо FILES, вы должны написать серию имен файлов, например image456.jpeg image457.jpeg image458.jpeg, или шаблон глобуса, например *.jpeg, или любую подобную комбинацию.

Понятно, а как обработать изменение расширения? Выходные файлы должны иметь расширение .txt. FILES будет списком имен файлов.
@ user3169 Tesseract автоматически добавляет расширение «.txt», когда я последний раз проверял. Если вы говорите tesseract img.jpg foo.txt, то вы на самом деле получаете foo.txt.txt. Обычно это раздражает, а тут удобно.
Я попробовал это, и обработка тессеракта прошла нормально, но результаты все равно были в одном текстовом файле (FILES.txt). Ваш пример, похоже, не меняет того факта, что Tesseract поддерживает вывод только одного файла, если только я что-то не упустил.
@user3169 user3169 Я думаю, вы могли неправильно понять мой пример. Буквенные символы FILESне должны появляться в вашей команде. Какую именно команду вы использовали?
Нет, я просто назвал свой список «ФАЙЛЫ», чтобы последовать вашему примеру. Моя команда: для файла в ФАЙЛАХ; сделать тессеракт "$file" "$file" ; сделанный. Я предполагаю, что «$file» — это имя файла изображения, извлеченное из FILE, поскольку была выполнена функция распознавания. Но тогда где отдельный выходной текстовый файл? Все, что я получил, это один ФАЙЛ.txt со всеми результатами.
@ user3169 Не используйте текстовый файл, содержащий имена файлов. Вместо этого укажите имена файлов в командной строке. Итак, вместо буквальных символов FILESнапишите что-то вроде image456.jpeg image457.jpeg image458.jpegили *.jpeg, чтобы окончательная команда выглядела как for file in *.jpeg ; do tesseract "$file" "$file" ; done.
Я понимаю. Я пытался следовать оригинальному методу, используя список файлов. Я попробовал ваш последний пример в самом каталоге, и теперь я получаю выходной файл для каждого входного файла. Спасибо. Единственная проблема сейчас в том, что выходные файлы имеют формат .jpeg.txt, а мне нужно, чтобы они были только .txt. Поскольку в таком каталоге может быть более 500 выходных файлов, есть ли способ (либо в Windows, либо в Ubuntu), где я могу изменить все имя файла.jpeg.txt на имя файла.txt?
Не обращайте внимания на мой последний вопрос. Команда переименования DOS должна работать нормально. Завтра попробую весь процесс.
Спасибо, что остаетесь со мной в этом. В конце концов мне это удалось, хотя мне пришлось использовать пиренейм для изменения расширений. Я думаю, что ваш ответ в порядке, если вы немного уточните, что файлы находятся в каталоге, а не имена файлов в списке. Я также задал этот вопрос в stackoverflow — Как объединить несколько файлов изображений OCR в несколько текстовых файлов с помощью Tesseract . Поскольку это было скриптовое решение, было бы уместнее ответить там. Выберите любой из них, тогда я приму ваш ответ.
@user3169 user3169 Здесь, наверное, все в порядке. Я также добавил немного вуду расширения параметров, чтобы автоматически обрезать расширение файла входного файла.
Кажется, лучше использовать -jопцию и разделить количество потоков процессора на три, количество потоков, используемых самим тессерактом. Например, предположим, что у машины 40 ядер процессора, тогда вы можете запустить указанную выше команду с помощьюtesseract -j 13 ...
Почему вы используете "${file%%.*}"? У меня это не сработало (все время перезаписывал в один файл). Помогло удаление одного из %знаков.
@sup Я предполагаю, что вы используете другую оболочку. В Bash x=foo.jpg; echo "${x%%.*}"печатает foo, как задумано.
Windows (внутри пакетного файла):for %%d in (*.jpg) do "C:\...\tesseract.exe" %%d %%d

Есть еще одно решение, которое требует немного больше разбора.

Мне нужно было обработать достаточное количество файлов и получить для каждого из них уровень достоверности каждого найденного слова; обработка файлов по одному была очень медленной.

Ваш пост дал мне правильный путь: используйте файл, содержащий ваш список, и выведите результат в другой файл, но не используйте файл TSV или TXt; они не разделены и не отсортированы по файлам.

Вместо этого используйте HOCR; это обычный HTML, в котором вы можете перемещаться программно:

список.txt:

SAMPLE-000.png
SAMPLE-001.png
SAMPLE-002.png

Командная строка :

tesseract list.txt list hocr

Пример вывода (часть, для удобочитаемости); список.hocr :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title></title>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
  <meta name='ocr-system' content='tesseract 4.1.0' />
  <meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word ocrp_wconf'/>
 </head>
 <body>
  <div class='ocr_page' id='page_1' title='image "SAMPLE-000.png"; bbox 0 0 3508 2592; ppageno 0'>
   <div class='ocr_carea' id='block_1_1' title="bbox 3283 1170 3313 1477">
    <p class='ocr_par' id='par_1_1' lang='eng' title="bbox 3283 1170 3313 1477">
     <span class='ocr_caption' id='line_1_1' title="bbox 3283 1170 3313 1477; baseline -307 0; x_size 39.714287; x_descenders 9.9285717; x_ascenders 9.9285717">
      <span class='ocrx_word' id='word_1_1' title='bbox 3284 1170 3313 1220; x_wconf 94'>EP</span>
      ( ... )
     </span>
    </p>
    ( ... ) 
   </div>
  </div>
  <div class='ocr_page' id='page_2' title='image "SAMPLE-001.png"; bbox 0 0 2592 3508; ppageno 1'>
   <div class='ocr_carea' id='block_2_1' title="bbox 792 194 1861 225">
    <p class='ocr_par' id='par_2_1' lang='eng' title="bbox 792 194 1861 225">
     <span class='ocr_header' id='line_2_1' title="bbox 792 194 1861 225; baseline 0.006 -4; x_size 39.866665; x_descenders 9.9666662; x_ascenders 9.9666662">
      <span class='ocrx_word' id='word_2_1' title='bbox 792 194 828 221; x_wconf 96'>17</span>
      ( ... ) 
     </span>
    </p>
   </div>
   ( ... )    
  </div>
 </body>
</html>

Вы можете заметить некоторые интересные атрибуты в разметке:

  • title='изображение "ОБРАЗЕЦ-000.png"; бокс 0 0 3508 2592; ппагено 0'
  • x_wconf, который, кажется, означает уверенность

и т. д. Вам «просто» нужно разобрать его с помощью вашего любимого инструмента.

Это немного поздно для вас, но у меня та же проблема, и я заметил, что, хотя tesseract выводит только один текстовый файл, каждый вывод отделяется символом подачи формы (0x0C).

Вы можете добавить аргумент -c page_separator='', который должен позаботиться об этом.
спасибо, но это не проблема, я отвечал на ваш вопрос. Вы можете разделить файл на несколько частей, найдя разделитель подачи формы.

Это проще, чем описано здесь. Подумайте о более сложной ситуации, когда у вас есть только файлы в папке, и вы хотите извлечь тексты и сохранить их в выходном файле csv.

Просто посетите мой репозиторий github по адресу https://github.com/aneendo/Image_to_Text и запустите файл main.py.