[PYTHON] C'était une vie que je voulais faire de l'OCR sur AWS Lambda pour localiser les personnages.

Chose que tu veux faire

--Je veux détecter la position des caractères à l'aide de l'OCR ――Je ne l'utilise pas si souvent, donc je veux l'exécuter sur Lambda --Je veux l'utiliser depuis le Web

C'est pourquoi j'ai pu le faire

Identification de la position des caractères avec OCR sur AWS Lambda

Le référentiel est ici

Qu'est-ce que tesseract?

--Logiciel qui effectue l'OCR --Entrez avec Brew sur Mac (v3.04)

Comment le faire fonctionner avec Lambda?

-Reportez-vous à StackOverflow ...

En d'autres termes ... !!

À propos, si vous ne le construisez pas sur Amazon Linux, Pillow (PIL) sera témoin du phénomène selon lequel le cou de la fée est cassé et meurt sans en-tête ELF.

Comment détecter la position de la chaîne de caractères?

C'était douloureux.

C'est pourquoi je vais écrire sur la façon de le présenter.

Installation

Tout utilisateur ec2 va bien.

Installation des packages requis

sudo yum install -y gcc gcc-c++ make
sudo yum install -y autoconf aclocal automake
sudo yum install -y libtool
sudo yum install -y libjpeg-devel libpng-devel libtiff-devel zlib-devel
sudo yum install -y git

installation nvm

Dans Amazon Linux, la version du nœud qui a été placée dans yum est trop ancienne et il est difficile de faire diverses choses (décrites plus loin), alors mettez nvm dedans. Cependant, s'il ne s'agit pas d'Amazon Linux, vous obtiendrez une erreur dans Lambda lorsque vous le construirez, alors faisons de notre mieux.

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
$ source ~/.bashrc 

$ nvm install v6.9.4  
$ nvm alias default v6.9.4  

#Vérifier la version
$ npm -v
$ node -v

Installez Leptonica

Leptonica est nécessaire pour exécuter tesseract avec OSS qui effectue une analyse d'image Vous ne pouvez pas utiliser tesseract v3.05 sans augmenter la version ici

$ cd ~
$ mkdir leptonica
$ cd leptonica

$ wget http://www.leptonica.com/source/leptonica-1.74.tar.gz

# unzip
$ tar -zxvf leptonica-1.73.tar.gz
$ cd leptonica-1.73

# build
$ ./configure
$ make
$ sudo make install

Installez Tesseract

Puisque la v3.05 est encore dev, elle n'est pas sur la version == zip n'est pas abandonné, donc je vais le cloner et faire de mon mieux.

$ cd ~
$ git clone https://github.com/tesseract-ocr/tesseract.git
$ cd tesseract/
$ git checkout -b 3.05 origin/3.05

# initialize
$ ./autogen.sh

# build
$ ./configure
$ make
$ sudo make install

Emballage pour Lambda

$ cd ~
$ mkdir package
$ cd package

# Copy libraries
$ cp /usr/local/bin/tesseract .
$ mkdir lib
$ cd lib
$ cp /usr/local/lib/libtesseract.so.3 .
$ cp /usr/local/lib/liblept.so.5 .
$ cp /lib64/librt.so.1 .
$ cp /lib64/libz.so.1 .
$ cp /usr/lib64/libpng12.so.0 .
$ cp /usr/lib64/libjpeg.so.62 .
$ cp /usr/lib64/libtiff.so.5 .
$ cp /lib64/libpthread.so.0 .
$ cp /usr/lib64/libstdc++.so.6 .
$ cp /lib64/libm.so.6 .
$ cp /lib64/libgcc_s.so.1 .
$ cp /lib64/libc.so.6 .
$ cp /lib64/ld-linux-x86-64.so.2 .
$ cp /usr/lib64/libjbig.so.2.0 .

# Get trained data
$ cd ..
$ mkdir tessdata
$ cd tessdata
$ wget https://github.com/tesseract-ocr/tessdata/raw/master/eng.traineddata
$ wget https://github.com/tesseract-ocr/tessdata/raw/master/osd.traineddata

# Make config file
$ mkdir configs
$ echo 'tessedit_create_tsv 1' > tsv

$ cd ../..
$ zip -r package.zip package

Vous pouvez maintenant l'utiliser en insérant package dans le package Lambda!

Après avoir essayé, wwwwww

Je suis désolé pour l'herbe.

image.png

C'est le résultat de donner une telle image

level	page_num	block_num	par_num	line_num	word_num	left	top	width	height	conf	text
1	1	0	0	0	0	0	0	1080	1920	-1	
2	1	1	0	0	0	29	11	1025	50	-1	
3	1	1	1	0	0	29	11	1025	50	-1	
4	1	1	1	1	0	29	11	1025	50	-1	
5	1	1	1	1	1	29	11	548	50	60	GnAflQflAA
5	1	1	1	1	2	640	15	167	43	58	X-IIZII"
5	1	1	1	1	3	899	14	155	44	89	l11:57
2	1	2	0	0	0	0	0	1080	76	-1	
3	1	2	1	0	0	0	0	1080	76	-1	
4	1	2	1	1	0	0	0	1080	76	-1	
5	1	2	1	1	1	0	0	1080	76	95	 
2	1	3	0	0	0	192	829	197	66	-1	
3	1	3	1	0	0	192	829	197	66	-1	
4	1	3	1	1	0	192	829	197	66	-1	
5	1	3	1	1	1	192	851	93	44	87	00
5	1	3	1	1	2	336	829	53	66	71	la
2	1	4	0	0	0	122	992	718	109	-1	
3	1	4	1	0	0	122	992	718	109	-1	
4	1	4	1	1	0	122	992	718	47	-1	
5	1	4	1	1	1	122	995	88	44	89	Sign
5	1	4	1	1	2	229	995	31	34	94	in
5	1	4	1	1	3	276	997	40	32	86	to
5	1	4	1	1	4	332	997	64	42	89	get
5	1	4	1	1	5	410	993	66	36	86	the
5	1	4	1	1	6	493	997	104	32	84	most
5	1	4	1	1	7	613	997	66	32	86	out
5	1	4	1	1	8	695	992	41	37	91	of
5	1	4	1	1	9	749	1003	91	36	93	your
4	1	4	1	2	0	122	1065	144	36	-1	
5	1	4	1	2	1	122	1065	144	36	87	device.
2	1	5	0	0	0	124	1269	312	46	-1	
3	1	5	1	0	0	124	1269	312	46	-1	
4	1	5	1	1	0	124	1269	312	46	-1	
5	1	5	1	1	1	124	1269	111	36	87	Email
5	1	5	1	1	2	253	1279	40	26	92	or
5	1	5	1	1	3	310	1269	126	46	89	phone

La source est comme ça

import requirements

from PIL import Image
import sys
import pyocr
import pyocr.builders

import urllib
import os
import subprocess
import base64
import json
import boto3

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
LIB_DIR = os.path.join(SCRIPT_DIR, 'lib')
LANG_DIR = os.path.join(SCRIPT_DIR, 'tessdata')

def response(code, body):
    return {
        'statusCode': code,
        'headers': {
            'Access-Control-Allow-Origin': '*',
        },
        'body': json.dumps(body),
    }

def handler(event, context):
    # Get the bucket and object from the event
    try:
        tools = pyocr.get_available_tools()
        if len(tools) == 0:
            print("No OCR tool found")
            sys.exit(1)
        tool = tools[0]
        print("Will use tool '%s'" % (tool.get_name()))

        request = event['body']

        result_filepath = '/tmp/result'
        img_filepath = '/tmp/image.png'
        with open(img_filepath, 'wb') as fh:
            fh.write(base64.decodestring(request['template']))

        command = 'LD_LIBRARY={} TESSDATA_PREFIX={} {}/tesseract {} {} -l eng --oem 0  tsv'.format(
            LIB_DIR,
            SCRIPT_DIR,
            SCRIPT_DIR,
            img_filepath,
            result_filepath
        )
        print command

        try:
            output = subprocess.check_output(
                command,
                shell=True,
                stderr=subprocess.STDOUT
            )
            print(output)

            with open(result_filepath + '.tsv', 'rb') as fh:
                print(fh.read())
        except subprocess.CalledProcessError as e:
            return "except:: " + e.output

    except Exception as e:
        print(e)
        raise e

Après cela, n'hésitez pas à réécrire serverless.yml sur GitHub ou autre.

Recommended Posts

C'était une vie que je voulais faire de l'OCR sur AWS Lambda pour localiser les personnages.
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
J'ai essayé d'utiliser Twitter Scraper avec AWS Lambda et cela n'a pas fonctionné.
Je veux AWS Lambda avec Python sur Mac!
Python: peut être répété en lambda
Je voulais utiliser la feuille de calcul Google avec AWS lambda, alors je l'ai essayé [Partie 2]
J'ai essayé de lancer le cluster ipython au minimum sur AWS
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
Le record auquel j'étais accro en mettant MeCab dans Heroku
Est-il facile de synthétiser un médicament sur le marché?
Comme la date Excel lue par pandas.read_excel était une valeur de série, elle a été convertie en datetime.datetime.
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
Une note à laquelle j'étais accro lors de l'émission d'un bip sous Linux
J'ai essayé d'enregistrer une station sur la plateforme IoT "Rimotte"
Je veux créer un histogramme et superposer la courbe de distribution normale dessus. édition matplotlib
Je voulais résoudre le problème ABC164 A ~ D avec Python
[AWS / Tello] Construction d'un système d'exploitation de drones sur le cloud
J'ai créé un script POST pour créer un problème sur Github et l'enregistrer dans le projet
J'ai créé un robot pour publier sur Twitter en grattant sur le Web un site dynamique avec AWS Lambda (suite)
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
Une histoire à laquelle j'étais accro à essayer d'installer LightFM sur Amazon Linux
Touches de karaoké assorties ~ J'ai essayé de le mettre sur Laravel ~ <en route>
Utilisation pratique des couches lors du chargement de bibliothèques sur Lambda
J'étais accro à Flask sur dotCloud
Je voulais utiliser le module de recherche d'Ansible2, mais cela a pris du temps, alors prenez note
Dans IPython, quand j'ai essayé de voir la valeur, c'était un générateur, donc je l'ai inventé quand j'étais frustré.
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
P100-PCIE-16GB a été ajouté au GPU de Google Colab avant que je le sache
J'ai essayé d'utiliser Resultoon sur Mac + AVT-C875, mais j'étais frustré en chemin.
Utilisez dHash pour localiser sur le parcours à partir d'une scène dans un jeu de course
Je souhaite définir un cycle de vie dans la définition de tâche d'ECS
J'ai essayé de réduire les coûts en démarrant / arrêtant EC2 dans un lot avec AWS Lambda
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
J'ai créé un programme pour rechercher des mots sur la fenêtre (développement précédent)
Notez que j'étais accro à la configuration de TensowFlow
Exécutez régulièrement des programmes Python sur AWS Lambda
[Introduction à json] Non, j'en étais accro. .. .. ♬
Python: j'ai pu récurer en lambda
[Introduction à AWS] Le premier Lambda est Transcribe ♪
Je voulais jouer avec la courbe de Bézier
Comment vivre une vie décente avec Windows 2017
J'ai fait un peu de recherche sur la classe
Le nom de fichier enregistré par pysheng était un nombre hexadécimal, donc je l'ai corrigé.
Je souhaite prendre une capture d'écran du site sur Docker en utilisant n'importe quelle police
Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
Ce que j'ai fait quand j'étais en colère de le mettre avec l'option enable-shared
C'était un peu difficile de faire flacon avec la version docker de nginx-unit
Un débutant a essayé de colorier un dessin au trait avec un chainer. J'ai pu le faire.
Une petite histoire à savoir comme un point addictif lors de l'écriture d'applications Twilio à l'aide de Python sur AWS Lambda
J'ai essayé de faciliter la modification du paramètre du proxy authentifié sur Jupyter
Il est difficile d'installer un écran vert, je n'ai donc découpé que le visage et l'ai superposé sur l'image de fond
Utilisons AWS Lambda pour créer un mécanisme pour notifier Slack lorsque la valeur surveillée par CloudWatch est dépassée sur Python
Je veux trouver un package populaire sur PyPi
Comment configurer Layer sur Lambda à l'aide d'AWS SAM
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
Une histoire à laquelle j'étais accro chez np.where
Procédure de création d'un Line Bot sur AWS Lambda