Ich werde die Schritte zusammenfassen, die ich unternommen habe, um japanische OCR mit Python unter Verwendung der kostenlosen OCR namens Tesseract durchzuführen.
Installieren Sie tesseract.
Wie installiert man
Es gibt zwei. Die Version, die mit apt-get von 1 installiert werden kann, ist 3.0.3. Um mit Japanisch mit Tesseract umgehen zu können, sind auf Japanisch geschulte Daten (jpn.traindata) erforderlich. Ich muss das selbst herunterladen, aber nur das im Internet gefundene ist ver3.0.4. Wenn ich versuche, diese Daten in 3.03 zu verwenden, funktioniert dies nicht und es wird folgende Fehlermeldung angezeigt:
read_params_file: parameter not found: allow_blob_division
Sie können Traindaten auch bearbeiten und in 3.0.3 verwenden, wie in Diese Person gezeigt, aber dies ist erforderlich. Der Befehl `` `combin_tessdata``` kann nicht mit apt-get-Installationen verwendet werden. Wenn Sie dies derzeit auf Japanisch tun möchten, müssen Sie es möglicherweise von der Quelle installieren.
Grundsätzlich installieren Sie tesseract 3.0.4 auf der offiziellen Seite zur Kompilierungsinstallation.
https://github.com/tesseract-ocr/tesseract/wiki/Compiling
$ sudo apt-get install autoconf automake libtool
$ sudo apt-get install libpng12-dev
$ sudo apt-get install libjpeg62-dev
$ sudo apt-get install libtiff4-dev
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libicu-dev # (if you plan to make the training tools)
$ sudo apt-get install libpango1.0-dev # (if you plan to make the training tools)
$ sudo apt-get install libcairo2-dev # (if you plan to make the training tools)
Es scheint, dass Sie eine Bildbibliothek namens Laptonica benötigen. Laden Sie die Quelle von der Download-Seite (http://www.leptonica.org/download.html) herunter und entpacken Sie sie. Um tesseract3.0.4 zu installieren, benötigen Sie mindestens Laptonica 1.71. Installieren Sie also die neueste Version 1.7.3.
#Auftauen
gzip -dc leptonica-1.73.tar.gz |tar xvf -
cd leptonica-1.73
#wie machen
$ ./configure
$ make
$ sudo make install
Gehen Sie grundsätzlich wie folgt vor (https://github.com/tesseract-ocr/tesseract/wiki/Compiling).
Die Quelle für 3.0.4 finden Sie unter hier.
#Entpacken, bewegen
$ unzip 3.04.zip
$ cd tesseract-3.04
#Legen Sie es durch den Bibliothekspfad
$ export -p LD_LIBRARY=$LD_LIBRARY:/usr/local/lib
#Installation
$ ./autogen.sh
$ ./configure
$ sudo make #Ich habe nur hier Sudo gemacht. Ich konnte Laptonica nicht finden.
$ sudo make install
$ sudo ldconfig
Laden Sie die japanische Version von jpn.traindata aus dem Sprachdatensatz unter hier herunter und platzieren Sie sie hier.
/usr/local/share/tessdata/
Und legen Sie den Pfad dieses Ordners fest.
export TESSDATA_PREFIX="/usr/local/share/tessdata/tessdata/
Wenn die Installation erfolgreich ist, sollten Sie OCR in der Befehlszeile ausführen können. Ich werde dieses Bild auf japanischer OCR versuchen.
tesseract ocr_test.png out -l jpn
Schreibt die Ergebnisse in eine Datei namens out.txt.
out.txt
Lächeln ist das Beste!Hallo
Das kleine "ya" wird zum großen "ya", ist aber allgemein erkennbar. Ist es schwierig, weil es in anderem Englisch kein Konzept für Kleinbuchstaben gibt?
Wir verwenden eine Wrapper-Bibliothek namens pyocr zur Verwendung mit Python.
Installation ist
$ pip install pyocr
Das ist es.
Es unterstützt jedoch nicht Tesseract, das von der Quelle installiert wurde, und wenn ich die folgende error.py zum Testen ausführe, funktioniert es nicht.
error.py
import pyocr
tools = pyocr.get_available_tools()
Traceback (most recent call last):
File "error.py", line 12, in <module>
tools = pyocr.get_available_tools()
File "/usr/local/lib/python2.7/site-packages/pyocr/pyocr.py", line 74, in get_available_tools
if tool.is_available():
File "/usr/local/lib/python2.7/site-packages/pyocr/libtesseract/__init__.py", line 152, in is_available
version = get_version()
File "/usr/local/lib/python2.7/site-packages/pyocr/libtesseract/__init__.py", line 179, in get_version
upd = int(version[2])
ValueError: invalid literal for int() with base 10: '02dev'
Wenn ich den Fehler lese, bin ich wütend, wenn ich versuche, die Zeichenfolge "02dev" in int zu konvertieren. Die von der Quelle installierte Version ist tesseract 3.04.02dev und scheint das Entwicklungspaket nicht anzunehmen. Also werde ich diese Quelle ändern.
Wenn Sie virtualenv verwenden, ersetzen Sie die zu ändernde Quelle entsprechend.
py:/usr/local/lib/python2.7/site-packages/pyocr/libtesseract/__init__.py
if len(version) >= 3:
upd = int(version[2].replace('dev', ''))
# upd = int(version[2])
Das sollte funktionieren.
Es gibt verschiedene OCR-Mechanismen, also werde ich es versuchen. Ich werde es mit diesem Bild versuchen.
Text Die einfachste OCR. Liest Zeichen aus dem Bild und gibt sie als Zeichenfolge zurück.
import pyocr
import pyocr.builders
import argparse
from PIL import Image
parser = argparse.ArgumentParser(description='tesseract ocr test')
parser.add_argument('image', help='image path')
args = parser.parse_args()
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
# The tools are returned in the recommended order of usage
tool = tools[0]
res = tool.image_to_string(Image.open(args.image),
lang="jpn",
builder=pyocr.builders.TextBuilder(tesseract_layout=6))
print res
Ergebnis
Sir of Machinery Training
Tess Wota
Neben der Tür schreien
Seil
Schiffstag^~璽 蒽~Übliche Wettgeschichte ba "Mae
Das Ergebnis ist schrecklich, wahrscheinlich wegen schwieriger Worte.
WordBox
Es wird ein Feld zurückgegeben, in dem sich das Wort befindet. Lassen Sie uns das Ergebnis mit openCV visualisieren. (Installieren Sie openCV unter hier)
import pyocr
import pyocr.builders
import argparse
import cv2
from PIL import Image
parser = argparse.ArgumentParser(description='tesseract ocr test')
parser.add_argument('image', help='image path')
args = parser.parse_args()
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
# The tools are returned in the recommended order of usage
tool = tools[0]
res = tool.image_to_string(Image.open(args.image),
lang="jpn",
builder=pyocr.builders.WordBoxBuilder(tesseract_layout=6))
# draw result
out = cv2.imread(args.image)
for d in res:
print d.content
print d.position
cv2.rectangle(out, d.position[0], d.position[1], (0, 0, 255), 2)
cv2.imshow('image',out)
cv2.waitKey(0)
cv2.destroyAllWindows()
Sir of Machinery Training
((226, 12), (412, 37))
Tess
((255, 138), (278, 148))
Wota
((283, 137), (326, 148))
Tür
((397, 149), (406, 159))
Nebenan schreien
((411, 149), (430, 159))
Historisches Training
((477, 148), (523, 159))
Seil
((165, 170), (199, 181))
Schiffstag
((115, 202), (156, 212))
^~璽 蒽~
((210, 196), (247, 220))
Übliche Wetthistorie
((297, 202), (343, 213))
Ba "Mae
((390, 203), (438, 212))
Die Gegend ist anständig, aber die erkannten Wörter sind immer noch schrecklich.
LineBox WordBox war Wort für Wort, aber LineBox scheint Wörter in derselben Zeile zu gruppieren.
Ich werde nur einen Teil der WordBox-Quelle ändern Wechseln Sie einfach von WordBoxBuilder zu LineBoxBuilder.
res = tool.image_to_string(Image.open(args.image),
lang="jpn",
builder=pyocr.builders.LineBoxBuilder(tesseract_layout=6))
Ergebnis
Sir of Machinery Training
((226, 12), (412, 37))
Tess Wota
((255, 137), (326, 148))
Neben der Tür schreien
((397, 148), (523, 159))
Seil
((165, 170), (199, 181))
Schiffstag^~璽 蒽~Übliche Wettgeschichte ba "Mae
((115, 196), (438, 220))
Dieses Bild muss nicht in derselben Zeile stehen, scheint jedoch für mehrzeilige Sätze nützlich zu sein.
Für jeden Builder ist `` `tesseract_layout = 6``` War eingestellt. Diese Nummer scheint die Richtlinie für die Durchführung von OCR für das Image festzulegen.
Diese Person hat zusammengestellt. http://tanaken-log.blogspot.jp/2012/08/imagemagick-tesseract.html
pagesegmode values are:
0 = Orientation and script detection (OSD) only.
1 = Automatic page segmentation with OSD.
2 = Automatic page segmentation, but no OSD, or OCR
3 = Fully automatic page segmentation, but no OSD. (Default)
4 = Assume a single column of text of variable sizes.
5 = Assume a single uniform block of vertically aligned text.
6 = Assume a single uniform block of text.
7 = Treat the image as a single text line.
8 = Treat the image as a single word.
9 = Treat the image as a single word in a circle.
10 = Treat the image as a single character.
Wie Sie sehen können, ist die Genauigkeit bei Verwendung der vorhandenen japanischen Daten nicht gut. Wenn Sie die Trainingsdaten selbst erstellen, sind sie anständiger.
http://hadashi-gensan.hatenablog.com/entry/2014/01/15/135316
Wenn Sie TEXT_DETECT der Google Cloud Vision-API verwenden, sieht dies folgendermaßen aus.
Maschine
Lernen
von
fließen
Prüfung
Daten
Vorläufig
Messung
Schiff
Lernen
Ergebnis
Bisherige
wird bearbeitet
Lehrer
Daten
Roh
Daten
Maschine
Lernen
Parameter
L
Grund
A
Immerhin ist die Genauigkeit gut. Wenn Sie es einfach verarbeiten möchten, ohne so viele Anforderungen zu stellen, sollten Sie die Vision-API verwenden.
Recommended Posts