[PYTHON] Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen

■ Hintergrund

Ich habe mich gefragt, ob ich einfach eine OCR-App erstellen kann, die auf dem Desktop startet, also habe ich sie erstellt.

■ Umgebung

・ MacOS Catalina 10.15.4 ・ Visual Studio-Code ・ Python3.8.1

■ Installieren der Bibliothek

    1. PysimpleGUI (GUI erstellen)
pip install pysimplegui

2. Tesseract OCR(OCR)

brew install tesseract
  1. pyocr (OCR-Tool-Wrapper für Python)
sudo pip3 install pyocr
  1. Kissen (Ladebild)
sudo pip3 install pillow

● Was sind diese Bibliotheken? Einschließlich dessen habe ich auf die folgenden Websites für OCR stark verwiesen (danke). Probieren Sie eine einfache OCR mit Tesseract + PyOCR aus

● Dies ist für Windows-Benutzer möglicherweise leichter zu verstehen. [Python] So transkribieren Sie ein Bild und konvertieren es in Text (tesseract-OCR, pyocr)

Nun wollen wir sehen, wie man den Code schreibt, um die Zeichen aus dem Bild zu lesen (der Import der Bibliothek ist im endgültigen gesamten Quellcode enthalten, daher werde ich ihn hier weglassen).

def scan_file_to_str(file_path, langage):
   """read_file_to_str

Generieren Sie eine Zeichenfolge aus einer Bilddatei

        Args:
            file_path(str):Pfad der zu lesenden Datei
            langage(str): 'jpn'Oder'eng'

        Returns:
Zeichenkette lesen
   """
   tools = pyocr.get_available_tools()
   if len(tools) == 0:
      print("No OCR tool found")
      sys.exit(1)

   tool = tools[0]

   text = tool.image_to_string(
      #Öffnen Sie die als Argument gesendete Datei
      Image.open(file_path),
      #Geben Sie die als Argument gesendete Sprache an('jpn'Oder'eng')
      lang=langage,
      builder=pyocr.builders.TextBuilder(tesseract_layout=6)
   )
   #Gibt schließlich die aus dem Bild gelesene Zeichenfolge zurück
   return text

Es ist wirklich überraschend, dass Sie eine Zeichenfolge aus einem Bild in nur 15 Zeilen lesen können. Ich war beeindruckt.

Als nächstes werde ich dies auf die GUI setzen. Ich denke, tkinter ist berühmt, wenn es um Python-GUI geht. Früher habe ich Code mit tkinter geschrieben, aber als ich die Recherche durchführte, stieß ich auf den folgenden Artikel.

[Wenn Sie Tkinter verwenden, versuchen Sie es mit PySimpleGUI](https://qiita.com/dario_okazaki/items/656de21cab5c81cabe59#exe%E5%8C%96%E3%81%AB%E3%81%A4 % E3% 81% 84% E3% 81% A6)

Ich war auch beeindruckt von der Tatsache, dass die GUI mit einfachem Code implementiert werden konnte, und entschied mich, sie zu verwenden.

Hier ist der Code für den GUI-Teil.

#Thema festlegen(Es gibt viele Themen)
sg.theme('Light Grey1')

#Wo und was zu platzieren(Ich denke, es wird einfacher zu montieren sein, wenn Sie wissen, dass es in Linieneinheiten angeordnet ist.)
layout = [
    #Die erste Zeile(Text:Setzen Sie den Text)
    [sg.Text('Datei zum Lesen(Mehrfachauswahl möglich)', font=('IPA Gothic', 16))],

    #2. Zeile(InputText:Textfeld, FilesBrowse:Dateidialog)
    [sg.InputText(font=('IPA Gothic', 14), size=(70, 10),), sg.FilesBrowse('Dateien auswählen', key='-FILES-'),],

    #3. Zeile(Text:Text, Radio:Optionsfeld x 2)
    [sg.Text('Sprache zum Lesen', font=('IPA Gothic', 16)), 
    sg.Radio('japanisch', 1, key='-jpn-', font=('IPA Gothic', 10)),
    sg.Radio('Englisch', 1, key='-eng-', font=('IPA Gothic', 10))],

    #4. Zeile(Button:Taste)
    [sg.Button('Ausführung lesen'),],

    #5. Zeile(MLine:100 Spalten x 30 Zeilen Textbereich)
    [sg.MLine(font=('IPA Gothic', 14), size=(100,30), key='-OUTPUT-'),]
]

#Fenster bekommen(Das Argument von Window ist "Titel, Layout")
window = sg.Window('Einfache OCR', layout)

#Liste zum Ablegen der gelesenen Datei
files = []

#Drehen Sie nun die Endlosschleife und warten Sie auf Ereignisse wie Tastenklicks.
while True:
    event, values = window.read()
    #Keine ist die Schaltfläche "✕" im Fenster. Wenn dies gedrückt wird, bricht es aus der Schleife aus und schließt das Fenster.
    if event == None:
        break
    
    # 'Ausführung lesen'Wenn die Taste gedrückt wird
    if event == 'Ausführung lesen':
        # key='-FILES-'Der in eingegebene Wert von InputText';'Holen Sie sich eine Liste der Dateinamen getrennt durch
        files.extend(values['-FILES-'].split(';'))
        #Optionsfeldwerte['-jpn-']Dann ist Sprache'jpn',Andernfalls'eng'
        language = 'jpn' if values['-jpn-'] else 'eng'
        text = ''
        #Schleife nach Anzahl der Dateien
        for i in range(len(files)):
            if not i == 0:
                #Für jede Datei gibt es ein Trennzeichen
                text += '================================================================================================\n'
                #Der zuvor hier definierte Scan_file_to_Empfangen Sie die gelesene Zeichenfolge mit der str-Methode
                text += scan_file_to_str(files[i], language)
         
                if language == 'jpn':
                #Bei japanischen Zeichenketten gab es viel zusätzlichen Platz, deshalb habe ich ihn gelöscht.
                text = text.replace(' ', '')
                #Lassen Sie in der nächsten Datei zwei Zeilen von der Zeichenfolge entfernt
                text += '\n\n'
        #Daten lesen(=text)Schlüssel='-OUTPUT-'Anzeige auf der in angegebenen MLine
        window.FindElement('-OUTPUT-').Update(text)
        #Ein Popup-Fenster benachrichtigt Sie über das Ende
        sg.Popup('Hat vervollständigt')

window.close()

In Bezug auf die GUI gibt es einige andere Dinge, auf die ich viel hingewiesen habe, deshalb werde ich sie veröffentlichen.

Lernnotizen für das K-TechLabo-Seminar → Der PDF-Text ist sehr leicht zu verstehen.

■ Quellcode (abgeschlossen)

import os
import sys
from PIL import Image

import PySimpleGUI as sg
import pyocr
import pyocr.builders


def scan_file_to_str(file_path, langage):
   """read_file_to_str

Generieren Sie eine Zeichenfolge aus einer Bilddatei

        Args:
            file_path(str):Pfad der zu lesenden Datei
            langage(str): 'jpn'Oder'eng'

        Returns:
Zeichenkette lesen
   """
   tools = pyocr.get_available_tools()
   if len(tools) == 0:
      print("No OCR tool found")
      sys.exit(1)

   tool = tools[0]

   text = tool.image_to_string(
      Image.open(file_path),
      lang=langage,
      builder=pyocr.builders.TextBuilder(tesseract_layout=6)
   )
   return text


#Thema festlegen
sg.theme('Light Grey1')

layout = [
   #Die erste Zeile
   [sg.Text('Datei zum Lesen(Mehrfachauswahl möglich)', font=('IPA Gothic', 16))],
   #2. Zeile
   [sg.InputText(font=('IPA Gothic', 14), size=(70, 10),), sg.FilesBrowse('Dateien auswählen', key='-FILES-'),],
   #3. Zeile
   [sg.Text('Sprache zum Lesen', font=('IPA Gothic', 16)), 
   sg.Radio('japanisch', 1, key='-jpn-', font=('IPA Gothic', 10)),
   sg.Radio('Englisch', 1, key='-eng-', font=('IPA Gothic', 10))],
   #4. Zeile
   [sg.Button('Ausführung lesen'),],
   #5. Zeile
   [sg.MLine(font=('IPA Gothic', 14), size=(100,30), key='-OUTPUT-'),]
]

#Fenster bekommen
window = sg.Window('Einfache OCR', layout)

files = []

a = 0

while True:
   event, values = window.read()
   if event == None:
      break

   if event == 'Ausführung lesen':
      files.extend(values['-FILES-'].split(';'))
      language = 'jpn' if values['-jpn-'] else 'eng'
      text = ''
      for i in range(len(files)):
         if not i == 0:
            text += '================================================================================================\n'
         text += scan_file_to_str(files[i], language)
         if language == 'jpn':
            text = text.replace(' ', '')
         text += '\n\n'
      window.FindElement('-OUTPUT-').Update(text)
      sg.Popup('Hat vervollständigt')

window.close()
スクリーンショット 2020-05-06 22.45.44.png

Lassen Sie mich zwei Bilder lesen

[Englisch 1. (aus The White House Building)] スクリーンショット 2020-05-06 22.47.50.png

[2. Englisch] スクリーンショット 2020-05-06 22.48.00.png

【Ergebnis】 スクリーンショット 2020-05-06 22.59.50.png

Ich denke, Englisch ist schnell zu lesen und ziemlich genau.

[Japanisch (von Aozora Bunko)]

スクリーンショット 2020-05-06 22.56.34.png

【Ergebnis】 スクリーンショット 2020-05-06 22.58.45.png

Japanisch braucht Zeit. Trotzdem liegt die Genauigkeit auf einem Niveau, das brauchbar zu sein scheint.

■ Endlich

Eigentlich wollte ich diese App zu einer ausführbaren Datei machen, die auf dem Desktop von Mac oder Windows funktioniert, aber weder pyinstaller noch py2app haben gut funktioniert, deshalb habe ich beschlossen, einen Artikel in diesem Zustand zu schreiben. Wenn ich das in Zukunft tun kann, werde ich es aktualisieren.

Wenn Sie Vorschläge, Meinungen oder Vorschläge wie "Ist das hier nicht anders?" Oder "Hier gibt es so etwas" haben, können Sie dies gerne im Kommentarbereich schreiben.

Recommended Posts

Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe mit TWE-Lite-2525A einen Öffnungs- / Schließsensor (Twitter-Link) erstellt
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, eine Aktivität zu erstellen, die gemeinsam die Positionsinformationen festlegt
Ich habe versucht, eine SMS mit Twilio zu senden
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Ich habe versucht, mit Hy anzufangen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, in 3 Jahren 5 Muster der Analysebasis zu erstellen
Ich möchte ein Automatisierungsprogramm erstellen!
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Jojo mit LSTM ein seltsames Zitat zu machen
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Ich habe versucht, eine Originalsprache "PPAP Script" zu erstellen, die PPAP (Pen Pineapple Appo Pen) mit Python abbildet
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
[AWS] [GCP] Ich habe versucht, die Verwendung von Cloud-Diensten mit Python zu vereinfachen
[Zaif] Ich habe versucht, den Handel mit virtuellen Währungen mit Python zu vereinfachen
Ich habe versucht, einen URL-Verkürzungsdienst mit AWS CDK serverlos zu machen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe "License OCR" mit der Google Vision API ausprobiert
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich möchte ein Spiel mit Python machen
Ich möchte OREMO mit setParam sein!
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, KI für Smash Bra zu machen
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe "Receipt OCR" mit der Google Vision API ausprobiert
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
Ich habe versucht, DP mit Fibonacci-Sequenz zu studieren
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe versucht, Tundele mit Naive Bays zu beurteilen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht zu debuggen.