В настоящее время я использую 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, как это, все в одной пакетной операции.
Решение командной строки для этого также будет в порядке. Если здесь не по теме, я могу спросить об этом на другом сайте, но я не хотел размещать сообщения на двух сайтах одновременно.
В Баше:
for file in FILES ; do tesseract "$file" "${file%%.*}" ; done
где вместо FILES
, вы должны написать серию имен файлов, например image456.jpeg image457.jpeg image458.jpeg
, или шаблон глобуса, например *.jpeg
, или любую подобную комбинацию.
tesseract img.jpg foo.txt
, то вы на самом деле получаете foo.txt.txt
. Обычно это раздражает, а тут удобно.FILES
не должны появляться в вашей команде. Какую именно команду вы использовали?FILES
напишите что-то вроде image456.jpeg image457.jpeg image458.jpeg
или *.jpeg
, чтобы окончательная команда выглядела как for file in *.jpeg ; do tesseract "$file" "$file" ; done
.-j
опцию и разделить количество потоков процессора на три, количество потоков, используемых самим тессерактом. Например, предположим, что у машины 40 ядер процессора, тогда вы можете запустить указанную выше команду с помощьюtesseract -j 13 ...
"${file%%.*}"
? У меня это не сработало (все время перезаписывал в один файл). Помогло удаление одного из %
знаков.x=foo.jpg; echo "${x%%.*}"
печатает foo
, как задумано.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>
Вы можете заметить некоторые интересные атрибуты в разметке:
и т. д. Вам «просто» нужно разобрать его с помощью вашего любимого инструмента.
Это немного поздно для вас, но у меня та же проблема, и я заметил, что, хотя tesseract выводит только один текстовый файл, каждый вывод отделяется символом подачи формы (0x0C).
-c page_separator=''
, который должен позаботиться об этом.Это проще, чем описано здесь. Подумайте о более сложной ситуации, когда у вас есть только файлы в папке, и вы хотите извлечь тексты и сохранить их в выходном файле csv.
Просто посетите мой репозиторий github по адресу https://github.com/aneendo/Image_to_Text и запустите файл main.py.
пользователь3169
Иззи