Software zum Batch-OCR mehrerer Bilddateien in mehrere Textdateien mit Tesseract?

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.

@Izzy Falls es eher eine Programmierlösung als eine Softwarelösung gibt, gäbe es ein Problem, diese Frage auch auf einer anderen Website zu posten? Irgendeine Empfehlung (SuperUser oder ein anderer)?
Wenn Sie mit Programmieren Skripting meinen, könnte SU passen. Die Programmierung befindet sich normalerweise auf SO. Wenn Sie sicherstellen, dass die Frage einen anderen Schwerpunkt hat (es handelt sich also tatsächlich um eine andere Frage – z. B. hier nach vorhandener Software, dort nach Skriptlösungen), sollte es kein Problem geben.

Antworten (4)

In Bash:

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

wo FILESSie 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.

Ich verstehe, aber wie geht man mit der Erweiterungsänderung um? Ausgabedateien müssen die Erweiterung .txt haben. FILES ist eine Liste von Dateinamen.
@ user3169 Tesseract fügt die Erweiterung ".txt" automatisch hinzu, als ich das letzte Mal nachgesehen habe. Wenn Sie sagen tesseract img.jpg foo.txt, dann bekommen Sie tatsächlich foo.txt.txt. Normalerweise ist es nervig, aber hier ist es praktisch.
Ich habe das versucht und es hat die Tesseract-Verarbeitung in Ordnung gemacht, aber die Ergebnisse waren immer noch alle in einer Textdatei (FILES.txt). Ihr Beispiel scheint nichts an der Tatsache zu ändern, dass Tesseract nur eine einzelne Dateiausgabe unterstützt, es sei denn, mir fehlt etwas.
@ user3169 Ich glaube, Sie haben mein Beispiel möglicherweise missverstanden. Die wörtlichen Zeichen FILESsollten nicht in Ihrem Befehl erscheinen. Welchen Befehl hast du genau verwendet?
Nein, ich habe meine Liste nur "FILES" genannt, um Ihrem Beispiel zu folgen. Mein Befehl: for file in FILES ; Tesseract "$file" "$file" ; Erledigt. Ich nehme an, "$file" ist der Name der Bilddatei, der aus FILE gezogen wurde, da die OCR-Funktion ausgeführt wurde. Aber wo ist dann die einzelne Ausgabetextdatei? Alles, was ich bekam, war eine FILE.txt mit allen Ergebnissen.
@user3169 Verwenden Sie keine Textdatei mit Dateinamen. Geben Sie stattdessen die Dateinamen in der Befehlszeile an. Schreiben Sie also anstelle der wörtlichen Zeichen FILESetwas wie image456.jpeg image457.jpeg image458.jpegoder *.jpeg, sodass der endgültige Befehl wie folgt aussehen würde for file in *.jpeg ; do tesseract "$file" "$file" ; done.
Ich verstehe. Ich habe versucht, der ursprünglichen Methode mit der Dateiliste zu folgen. Ich habe Ihr letztes Beispiel am Verzeichnis selbst ausprobiert und erhalte jetzt eine Ausgabedatei für jede Eingabedatei. Danke. Das einzige Problem ist jetzt, dass die Ausgabedateien .jpeg.txt sind, während ich sie nur als .txt benötige. Da ein solches Verzeichnis über 500 Ausgabedateien haben kann, gibt es eine Möglichkeit (entweder in Windows oder Ubuntu), wo ich alle filename.jpeg.txt in filename.txt ändern kann?
Vergiss meine letzte Frage. Der DOS-Umbenennungsbefehl sollte funktionieren. Ich werde die ganze Prozedur morgen ausprobieren.
Danke, dass du dabei bleibst. Schließlich war ich erfolgreich, obwohl ich pyrename verwenden musste, um die Erweiterungen zu ändern. Ich denke, Ihre Antwort ist in Ordnung, wenn Sie ein wenig erläutern, dass sich die Dateien in einem Verzeichnis und nicht in Dateinamen in einer Liste befinden. Ich habe diese Frage auch zu stackoverflow- How to batch OCR multiple image files to multiple text files using Tesseract gestellt . Da dies eine Skriptlösung war, wäre es angemessener, dort zu antworten. Wählen Sie eine von beiden aus, dann akzeptiere ich Ihre Antwort.
@ user3169 Hier ist wahrscheinlich alles in Ordnung. Ich habe auch ein bisschen Parametererweiterungs-Voodoo hinzugefügt, um die Dateierweiterung der Eingabedatei automatisch abzuschneiden.
Es scheint besser zu sein, die -jOption 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 ...
Warum benutzt du "${file%%.*}"? Bei mir hat es nicht funktioniert (es hat immer wieder eine einzelne Datei überschrieben). Das Entfernen eines der %Schilder hat geholfen.
@sup Ich vermute, dass Sie eine andere Shell verwenden. x=foo.jpg; echo "${x%%.*}"Gibt in Bash foowie beabsichtigt aus.
Windows (in einer Batchdatei):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:

  • title='Bild "PROBE-000.png"; bbox 0 0 3508 2592; ppageno 0'
  • x_wconf, was für Vertrauen zu stehen scheint

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.

Sie können das Argument hinzufügen -c page_separator='', das sich darum kümmern sollte.
danke, aber das war kein Problem, ich habe auf Ihre Frage geantwortet. Sie können die Datei in mehrere Teile aufteilen, indem Sie nach dem Seitenvorschub-Trennzeichen suchen.

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