[PYTHON] Es war ein Leben, das ich auf AWS Lambda OCR wollte, um die Charaktere zu lokalisieren.

Was du machen willst

Deshalb konnte ich es schaffen

Identifikation der Zeichenposition mit OCR auf AWS Lambda

Das Repository ist hier

Was ist Tesseract?

Wie bringen Sie es dazu, mit Lambda zu arbeiten?

Mit anderen Worten ... !!

Übrigens, wenn Sie es nicht unter Amazon Linux erstellen, wird Pillow (PIL) das Phänomen beobachten, dass der Hals der Fee gebrochen ist und ohne ELF-Header stirbt.

Wie erkennt man die Position der Zeichenkette?

――In der allgemeinen OCR werden die meisten Zeichen als Text zurückgegeben. -Wenn Sie [Doc] lesen (https://github.com/tesseract-ocr/tesseract/wiki/Command-Line-Usage), unterstützt v3.05 das tsv-Format. --Tesseract (v3.04) wird eingeschlossen, wenn Sie normal insuko

Das war schmerzhaft.

Deshalb werde ich darüber schreiben, wie man es einführt.

Installation

Alle ec2-Benutzer sind in Ordnung.

Installation der erforderlichen Pakete

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

NVM-Installation

Unter Amazon Linux ist die Version von node, die in yum eingefügt wurde, zu alt und es ist schwierig, verschiedene Dinge zu tun (später beschrieben). Fügen Sie also nvm ein. Wenn es sich jedoch nicht um Amazon Linux handelt, wird beim Erstellen von Lambda eine Fehlermeldung angezeigt. Lassen Sie uns also unser Bestes geben.

$ 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  

#Version prüfen
$ npm -v
$ node -v

Installieren Sie Leptonica

Leptonica ist erforderlich, um Tesseract mit OSS auszuführen, das Bildanalysen durchführt Sie können tesseract v3.05 nicht verwenden, ohne die Version hier zu erhöhen

$ 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

Installieren Sie Tesseract

Da v3.05 noch dev ist, ist es nicht in der Version == zip wird nicht gelöscht, also werde ich es klonen und mein Bestes geben.

$ 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

Verpackung für 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

Jetzt können Sie es verwenden, indem Sie "Paket" in das Lambda-Paket einschließen!

Als Ergebnis des Versuchs, wwwwww

Das Gras tut mir leid.

image.png

Dies ist das Ergebnis eines solchen Bildes

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

Die Quelle ist so

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

Danach können Sie serverless.yml auf GitHub oder was auch immer neu schreiben.

Recommended Posts

Es war ein Leben, das ich auf AWS Lambda OCR wollte, um die Charaktere zu lokalisieren.
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
Ich möchte Lambda mit Python auf Mac AWS!
Python: Kann in Lambda wiederholt werden
Ich wollte die Google-Tabelle mit AWS Lambda betreiben, also habe ich es versucht [Teil 2]
Ich habe versucht, den Ipython-Cluster unter AWS auf das Minimum zu starten
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Die Platte, von der ich süchtig war, als ich MeCab in Heroku einsetzte
Wie einfach ist es, ein Medikament auf dem Markt zu synthetisieren?
Da das von pandas.read_excel gelesene Excel-Datum ein serieller Wert war, wurde es in datetime.datetime konvertiert.
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Ein Hinweis, von dem ich süchtig war, als ich unter Linux einen Piepton machte
Ich habe versucht, einen Sender auf der IoT-Plattform "Rimotte" zu registrieren.
Ich möchte ein Histogramm erstellen und die Normalverteilungskurve darauf überlagern. matplotlib edition
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
[AWS / Tello] Aufbau eines Systems zum Betrieb von Drohnen in der Cloud
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
Ich habe einen Bot erstellt, um ihn auf Twitter zu posten, indem ich mit AWS Lambda eine dynamische Site im Internet abgekratzt habe (Fortsetzung).
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
Eine Geschichte, die mich süchtig nach dem Versuch machte, LightFM unter Amazon Linux zu installieren
Passende Karaoke-Tasten ~ Ich habe versucht, es auf Laravel zu setzen ~ <auf dem Weg>
Bequem zum Verwenden von Ebenen beim Laden von Bibliotheken auf Lambda
Ich war auf dotCloud süchtig nach Flask
Ich wollte das Suchmodul von Ansible2 verwenden, aber es hat einige Zeit gedauert, machen Sie sich also eine Notiz
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
P100-PCIE-16GB wurde der GPU von Google Colab hinzugefügt, bevor ich es wusste
Ich habe versucht, Resultoon auf Mac + AVT-C875 zu verwenden, war aber unterwegs frustriert.
Verwenden Sie dHash, um eine Szene in einem Rennspiel auf der Strecke zu lokalisieren
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich habe versucht, die Kosten zu senken, indem ich EC2 in einer Charge mit AWS Lambda gestartet / gestoppt habe
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Ich habe ein Programm erstellt, um Wörter im Fenster nachzuschlagen (vorherige Entwicklung)
Beachten Sie, dass ich süchtig danach war, TensowFlow einzurichten
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
[Einführung in json] Nein, ich war süchtig danach. .. .. ♬
Python: Ich konnte in Lambda rekursieren
[Einführung in AWS] Das erste Lambda ist Transcribe ♪
Ich wollte mit der Bezier-Kurve spielen
Wie man mit 2017 Windows ein anständiges Leben führt
Ich habe ein wenig über die Klasse recherchiert
Der von pysheng gespeicherte Dateiname war eine Hexadezimalzahl, daher habe ich ihn behoben.
Ich möchte einen Screenshot der Site in Docker mit einer beliebigen Schriftart erstellen
Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
Mit der Docker-Version der Nginx-Einheit war es ein wenig schwierig, eine Flasche zu machen
Ein Anfänger versuchte, eine Strichzeichnung mit einem Kettenmesser zu färben. Ich konnte es schaffen.
Eine kleine Geschichte, die beim Schreiben von Twilio-Anwendungen mit Python auf AWS Lambda süchtig macht
Ich habe versucht, es einfach zu machen, die Einstellung des authentifizierten Proxys auf Jupyter zu ändern
Es ist schwierig, einen grünen Bildschirm zu installieren, daher habe ich nur das Gesicht ausgeschnitten und es dem Hintergrundbild überlagert
Verwenden Sie AWS Lambda, um einen Mechanismus zu erstellen, der Slack benachrichtigt, wenn der von CloudWatch überwachte Wert in Python überschritten wird
Ich möchte ein beliebtes Paket auf PyPi finden
So konfigurieren Sie Layer auf Lambda mit AWS SAM
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Eine Geschichte, von der ich bei np.where süchtig war
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda