Ich verwende derzeit Tesseract, um einige JPEG-Dateien in TXT-Dateien (Ubuntu 16.04) zu OCR. Typischerweise sind dies ~500 Dateien in einem Verzeichnis.
Ich weiß, dass ich dies tun kann, indem ich eine Textdatei mit allen Dateinamen (savedlist.txt) erstelle und dann Folgendes mache:
tesseract savedlist.txt output.txt
output.txt ist jedoch eine einzelne Datei mit allen OCR-Ergebnissen.
Was ich brauche, ist die Möglichkeit, die OCR-Ergebnisse in einzelnen TXT-Dateien mit demselben Dateinamen wie die ursprüngliche Bilddatei zu speichern. Zum Beispiel:
Eingabedatei: image456.jpeg
Ausgabedatei: image456.txt
Mir ist klar, dass neuere Versionen von ABBYY FineReader dies können, aber dies ist für ein kostenloses Projekt, also suche ich nach einer kostenlosen oder kostengünstigen (weniger als 20 $) Lösung.
Was ich suche, ist ein Software-Front-End oder eine GUI mit Tesseract, die ocr wie folgt stapelweise verarbeiten kann, alles in einem Stapelvorgang.
Eine Kommandozeilenlösung dafür wäre auch in Ordnung. Wenn es hier nicht zum Thema gehört, kann ich dies auf einer anderen Website fragen, aber ich wollte nicht gleichzeitig auf zwei Websites posten.
In Bash:
for file in FILES ; do tesseract "$file" "${file%%.*}" ; done
wo FILES
Sie anstelle von eine Reihe von Dateinamen schreiben sollten, wie image456.jpeg image457.jpeg image458.jpeg
, oder ein Glob-Muster wie *.jpeg
, oder irgendeine solche Kombination.
tesseract img.jpg foo.txt
, dann bekommen Sie tatsächlich foo.txt.txt
. Normalerweise ist es nervig, aber hier ist es praktisch.FILES
sollten nicht in Ihrem Befehl erscheinen. Welchen Befehl hast du genau verwendet?FILES
etwas wie image456.jpeg image457.jpeg image458.jpeg
oder *.jpeg
, sodass der endgültige Befehl wie folgt aussehen würde for file in *.jpeg ; do tesseract "$file" "$file" ; done
.-j
Option zu verwenden und die Anzahl der CPU-Threads durch drei zu teilen, die Anzahl der Threads, die von Tesseract selbst verwendet werden. Nehmen wir zum Beispiel an, die Maschine hat 40 CPU-Kerne, dann könnten Sie den obigen Befehl damit ausführentesseract -j 13 ...
"${file%%.*}"
? Bei mir hat es nicht funktioniert (es hat immer wieder eine einzelne Datei überschrieben). Das Entfernen eines der %
Schilder hat geholfen.x=foo.jpg; echo "${x%%.*}"
Gibt in Bash foo
wie beabsichtigt aus.for %%d in (*.jpg) do "C:\...\tesseract.exe" %%d %%d
Es gibt eine andere Lösung, die etwas mehr Analyse erfordert.
Ich musste eine ganze Menge Dateien handhaben und für jede das Konfidenzniveau jedes gefundenen Wortes erfassen; Die Bearbeitung einer Datei nach der anderen war sehr langsam.
Ihr Beitrag hat mir den richtigen Weg gegeben: Verwenden Sie eine Datei, die Ihre Liste enthält, und geben Sie das Ergebnis in eine andere Datei aus, verwenden Sie jedoch keine TSV- oder TXt-Datei. Sie sind weder aufgeteilt noch nach Dateien sortiert.
Verwenden Sie stattdessen HOCR; Es ist einfaches HTML, in dem Sie programmatisch navigieren können:
list.txt :
SAMPLE-000.png
SAMPLE-001.png
SAMPLE-002.png
Befehlszeile :
tesseract list.txt list hocr
Beispielausgabe ( Teil von, zur besseren Lesbarkeit ); list.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>
Sie können einige interessante Attribute im Markup feststellen:
usw. Sie müssen es "nur" mit Ihrem bevorzugten Tool parsen.
Es ist ein bisschen spät für Sie, aber ich habe das gleiche Problem und habe festgestellt, dass Tesseract zwar nur eine Textdatei ausgibt, aber jede Ausgabe durch ein Form-Feed-Zeichen (0x0C) getrennt ist.
-c page_separator=''
, das sich darum kümmern sollte.Es ist einfacher als hier beschrieben. Stellen Sie sich eine schwierigere Situation vor, in der Sie nur die Dateien in einem Ordner haben und die Texte extrahieren und in einer CSV-Dateiausgabe speichern möchten.
Besuchen Sie einfach mein Github-Repo unter https://github.com/aneendo/Image_to_Text und führen Sie die Datei main.py aus
Benutzer3169
Izzy