Je vais résumer les étapes que j'ai suivies pour faire de l'OCR japonais avec python en utilisant l'OCR gratuit appelé tesseract.
Installez tesseract.
Comment installer
Il y en a deux. La version qui peut être installée avec apt-get de 1 est la 3.0.3. Pour gérer le japonais avec tesseract, des données entraînées en japonais (jpn.traindata) sont nécessaires. Je dois le télécharger moi-même, mais seul celui trouvé sur le net est ver3.0.4. Lorsque j'essaie d'utiliser ces données dans la version 3.03, cela ne fonctionne pas et j'obtiens cette erreur:
read_params_file: parameter not found: allow_blob_division
Vous pouvez éditer traindata et l'utiliser dans la version 3.0.3 comme indiqué dans Cette personne, mais c'est nécessaire pour cela. La commande `` combine_tessdata '' ne peut pas être utilisée avec les installations apt-get. Par conséquent, si vous souhaitez le faire en japonais pour le moment, vous devrez peut-être l'installer à partir de la source.
Fondamentalement, installez tesseract 3.0.4 en vous référant à la page d'installation officielle de la compilation.
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)
Il semble que vous ayez besoin d'une bibliothèque d'images appelée Laptonica. Téléchargez et décompressez la source depuis la page de téléchargement (http://www.leptonica.org/download.html). Laptonica 1.71 est requis pour installer tesseract 3.0.4, donc installez la dernière 1.7.3.
#Dégivrer
gzip -dc leptonica-1.73.tar.gz |tar xvf -
cd leptonica-1.73
#comme faire
$ ./configure
$ make
$ sudo make install
En gros, faites comme ceci.
Obtenez la source de la version 3.0.4 depuis ici
#Décompressez, déplacez
$ unzip 3.04.zip
$ cd tesseract-3.04
#Mettez-le dans le chemin de la bibliothèque
$ export -p LD_LIBRARY=$LD_LIBRARY:/usr/local/lib
#Installation
$ ./autogen.sh
$ ./configure
$ sudo make #J'ai fait sudo uniquement ici. Je n'ai pas trouvé de laptonica.
$ sudo make install
$ sudo ldconfig
Téléchargez la version japonaise de jpn.traindata à partir de l'ensemble de données de langue à ici et placez-la ici.
/usr/local/share/tessdata/
Et définissez le chemin de ce dossier.
export TESSDATA_PREFIX="/usr/local/share/tessdata/tessdata/
Si l'installation réussit, vous devriez être en mesure d'exécuter l'OCR sur la ligne de commande. Je vais essayer cette image sur l'OCR japonais.
tesseract ocr_test.png out -l jpn
Écrit les résultats dans un fichier appelé out.txt.
out.txt
Le sourire est le meilleur!Bonjour
Le petit "ya" devient le grand "ya", mais il est généralement reconnaissable. Est-ce difficile parce qu'il n'y a pas de concept de lettres minuscules dans un autre anglais?
Nous utilisons une bibliothèque wrapper appelée pyocr pour une utilisation avec python.
L'installation est
$ pip install pyocr
C'est tout.
Cependant, il ne prend pas en charge tesseract installé à partir de la source, et lorsque j'exécute le error.py suivant pour le test, cela ne fonctionne pas.
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'
Quand j'ai lu l'erreur, je suis en colère en essayant de convertir la chaîne "02dev" en int. La version installée à partir des sources est tesseract 3.04.02dev et ne semble pas assumer le paquet dev. Je vais donc changer cette source.
Si vous utilisez virtualenv, remplacez la source à modifier de manière appropriée.
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])
Cela devrait fonctionner.
Il existe différents mécanismes OCR, je vais donc l'essayer. Je vais l'essayer avec cette image.
Text L'OCR le plus simple. Lit les caractères de l'image et les renvoie sous forme de chaîne.
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
résultat
Formation Sir of Machinery
Tess Wota
À côté de la porte hurlant
corde
Jour du navire^~璽 蒽~Historique des paris habituels ba "Mae
Le résultat est terrible, probablement à cause de mots difficiles.
WordBox
Il renverra une boîte où se trouve le mot. Visualisons le résultat avec openCV. (Installez openCV sur ici)
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()
Formation Sir of Machinery
((226, 12), (412, 37))
Tess
((255, 138), (278, 148))
Wota
((283, 137), (326, 148))
porte
((397, 149), (406, 159))
Crier à côté
((411, 149), (430, 159))
Formation historique
((477, 148), (523, 159))
corde
((165, 170), (199, 181))
Jour du navire
((115, 202), (156, 212))
^~璽 蒽~
((210, 196), (247, 220))
Historique des paris habituels
((297, 202), (343, 213))
Ba "Mae
((390, 203), (438, 212))
Le territoire est décent, mais les mots reconnus sont toujours terribles.
LineBox WordBox était mot par mot, mais LineBox semble regrouper les mots sur la même ligne.
Je ne changerai qu'une partie de la source WordBox Changez simplement de WordBoxBuilder à LineBoxBuilder.
res = tool.image_to_string(Image.open(args.image),
lang="jpn",
builder=pyocr.builders.LineBoxBuilder(tesseract_layout=6))
résultat
Formation Sir of Machinery
((226, 12), (412, 37))
Tess Wota
((255, 137), (326, 148))
À côté de la porte hurlant
((397, 148), (523, 159))
corde
((165, 170), (199, 181))
Jour du navire^~璽 蒽~Historique des paris habituels ba "Mae
((115, 196), (438, 220))
Vous n'êtes pas obligé de mettre cette image sur la même ligne, mais cela semble utile pour les phrases à plusieurs lignes.
Pour chaque constructeur,
tesseract_layout = 6```
A été mis en. Ce nombre semble définir la politique pour effectuer l'OCR sur l'image,
Cette personne a mis ensemble. 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.
Comme vous pouvez le voir, la précision n'est pas bonne lors de l'utilisation des données japonaises existantes. Si vous créez vous-même les données d'entraînement, ce sera plus décent.
http://hadashi-gensan.hatenablog.com/entry/2014/01/15/135316
Si vous utilisez TEXT_DETECT de l'API Google Cloud Vision, cela ressemblera à ceci.
machine
Apprentissage
de
couler
tester
Les données
Préliminaire
La mesure
navire
Apprentissage
résultat
Avant
En traitement
prof
Les données
Brut
Les données
machine
Apprentissage
Paramètres
L
Raison
A
Après tout, la précision est bonne. Si vous ne souhaitez pas faire autant de demandes et que vous souhaitez les traiter facilement, vous devez utiliser l'API Vision.