Remarques sur la réalisation de l'OCR japonais avec Python

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.

environnement

Installation

Installez tesseract.

Politique d'installation

Comment installer

  1. Installez avec apt-get
  2. Construire et installer à partir de la source

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

Installation de dépendance

$ 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)

Installation de Laptonica

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

installation de tesseract

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

Acquisition et paramétrage de fichiers japonais

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/

Contrôle de fonctionnement

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. ocr_test.png

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?

Introduction de pyocr

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.

Essayez l'OCR

Il existe différents mécanismes OCR, je vais donc l'essayer. Je vais l'essayer avec cette image.

mlct-14-638.jpg

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()

Screenshot from 2016-07-20 15:12:12.png

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 Screenshot from 2016-07-20 15:34:57.png

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.

À propos de tesseract_layout

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.

À propos des données d'entraînement

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

Bonus Google Cloud Vision

Si vous utilisez TEXT_DETECT de l'API Google Cloud Vision, cela ressemblera à ceci.

Screenshot from 2016-07-21 11:28:43.png

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.

Recommended Posts

Remarques sur la réalisation de l'OCR japonais avec Python
Notes sur l'utilisation de rstrip avec python.
Envoyer du courrier japonais avec Python3
Remarques sur le traitement d'images HDR et RAW avec Python
[Python] Notes sur l'analyse des données
Remarques sur l'installation de Python sur votre Mac
Analyse morphologique japonaise avec Python
Remarques sur l'installation de Python sur CentOS
OpenJTalk sur Windows10 (parler japonais avec Python depuis la construction de l'environnement)
Remarques sur l'importation de données depuis MySQL ou CSV avec Python
Remarques sur la gestion de grandes quantités de données avec python + pandas
Remarques sur le déploiement de pyenv avec Homebrew et la gestion des versions de Python
Notes sur Python et les types de dictionnaire
Remarques sur la gestion des packages avec conda
Remarques sur l'utilisation de MeCab depuis Python
Dessinez le japonais avec matplotlib sur Ubuntu
Remarques sur l'installation de Python à l'aide de PyEnv
Remarques sur l'accès à dashDB à partir de python
Parlez du texte japonais avec OpenJTalk + python
Premiers pas avec Python 3.8 sous Windows
[Memo] Tweet sur Twitter avec Python
Énumération de fichiers japonais avec le système Python2 sous Windows (contre-mesure du problème 5C)
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
Exécutez le servo avec Python sur ESP32 (Windows)
Remarques sur la grammaire Python de l'apprentissage automatique PyQ
Remarques sur l'exécution de M5Stick V avec uPyLoader
Note de nfc.ContactlessFrontend () de nfcpy de python
Générer des données de test japonais avec Python Faker
Un mémo contenant Python2.7 et Python3 dans CentOS
Carte des informations de location sur une carte avec python
Téléchargez les données de cours des actions japonaises avec Python
Chase des applications actives sur Mac avec Python
[C] [python] Lire avec AquesTalk sous Linux
Si scipy est python 2.7.8, l'installation de pip trébuche
Remarques sur la construction de Python et pyenv sur Mac
Comment afficher le japonais python avec lolipop
Télécharger des fichiers sur le Web avec Python
Créer un environnement Python avec Anaconda sur Mac
[Python] Rendons matplotlib compatible avec le japonais
Comment entrer le japonais avec les malédictions Python
[Python] Localisation japonaise de matplotlib sur Ubuntu
Installation de PIL avec Python 3.x sur macOS
Lire des caractères dans des images avec Python OCR
Travailler avec le GPS en Python pour Raspberry Pi 3
Lisez le fichier avec python et supprimez les sauts de ligne [Notes sur la lecture du fichier]
Démarrer avec Python avec 100 coups sur le traitement du langage
Mémo de raclage Python
FizzBuzz en Python3
Discord bot raspberry pi zéro avec python [Note]
Grattage avec Python
Note d'apprentissage Python_000
Statistiques avec python
Stratégie sur la façon de monétiser avec Python Java
Créer un environnement python avec pyenv sur EC2 (ubuntu)
Python sur Windows
Essayez-le avec JupyterLab en Python japonais Word Cloud.
twitter avec python3
Grattage avec Python
Remarques sur avec
Python avec Go