[PYTHON] Fordern Sie die Herausforderungen von Cyma weiterhin mit dem OCR-Dienst der Google Cloud Platform heraus

Ateam Cyma Adventskalender 2019, 21. Tag! Ateam Co., Ltd. EC-Hauptsitz Saima-Ingenieur @shimura_atsushi ist zum zweiten Mal hier.

Im ersten Versuch Die Herausforderungen von Sima mithilfe des OCR-Dienstes von Google Could Platform herausfordern nahm ich die erste Herausforderung an, um die Herausforderungen von Sima anzugehen. .. Dieses Mal, das zweite Mal, werden wir weitere Anstrengungen unternehmen, um den Lieferschein zu überprüfen.

Überprüfen Sie das letzte Mal

Ich habe eine einfache OCR mit dem GCP-Dienst in Last Post versucht. Viele der derzeit von Cyma verwendeten Lieferdokumente enthalten jedoch komplizierte Texte, und die Genauigkeit der Transkription ist nur durch Anwendung von OCR gering. Selbst wenn die Transkription erfolgreich ist, werden die Daten nicht beschriftet und die Textdaten Es befand sich in einem Zustand schlechter Wiederverwendbarkeit.

Diesmal···

Basierend auf der vorherigen Überlegung konzentrieren wir uns dieses Mal auf "Vorbereiten eines Bildes, das für OCR einfach ist" und erstellen eine Vorverarbeitung des Bildes, das auf OCR angewendet werden soll. Da der Inhalt eine Fortsetzung der vorherigen Zeit ist, bleibt der Titel derselbe, aber diesmal ist er hauptsächlich in "Python" implementiert und für "Google Could Platform" dünn. Bitte verzeihen Sie mir.

Dieses Mal werden wir "Python" verwenden, das über eine umfangreiche Bildverarbeitungsbibliothek verfügt, auf Empfehlung von @NamedPython, einem Cyma-Ingenieur.

Bereiten Sie die Umgebung vor

Entwicklungs-Terminal verwendet dieses Mal

Installieren Sie alles

Ich werde schnell hierher gehen.

Installation

--poppler Installation

brew install pyenv 
pyenv install --list #Überprüfen Sie die installierbare Version
pyenv install 3.8.0
pip3 install pdf2image
brew install poppler 
pip install pillow
pip install opencv

Rauer Fluss

  1. Scannen Sie Dokumente mit einem zusammengesetzten Computer
  2. Konvertieren Sie Scandaten (PDF) in Bilddaten
  3. Beschneiden Sie die konvertierten Bilddaten
  4. Binarisieren Sie die zugeschnittenen Daten
  5. Auf OCR anwenden

Scannen mit einem Mehrzweckgerät (PDF)

Ich werde das Multifunktionsgerät in der Zentrale verwenden, und wenn ich es scanne, wird ein PDF an die registrierte E-Mail-Adresse angehängt.

Konvertieren Sie von PDF in Bilddaten

Da die gescannten Daten im PDF-Format vorliegen, werden sie in Bilddaten konvertiert. Wenn Sie ein Verzeichnis angeben, wird die gespeicherte PDF-Datei in Bilddaten konvertiert. Wenn Sie pdf2image importieren und den zu konvertierenden Dateipfad an die Methode convert_from_path übergeben Es wird es konvertieren, nicht wahr?

pdf2png.py


from pdf2image import convert_from_path
from pathlib import Path
import os

p = Path('./img/pdf')
pdf_list = os.listdir(p)
print(pdf_list)

for i, pdf_file_path in enumerate(pdf_list):
  images = convert_from_path('./img/pdf/{}'.format(pdf_file_path))
  for image in images:
    image.save('./img/png/{}.png'.format(i), 'png')

Beschneiden Sie die konvertierten Daten

Das Herzstück dieser OCR ist dieser Prozess. Basierend auf den vorherigen Überlegungen werden wir den Prozess des Ausschneidens und Etikettierens der erforderlichen Teile aus den komplizierten Lieferscheindaten in diesem Prozess implementieren.

Bereiten Sie die Einstellungsdatei in JSON vor

Da das Format des Lieferscheins für jeden Lieferanten grundsätzlich gleich ist (es gibt unterschiedliche Muster für Fahrräder und Teile), erstellen Sie für jedes Lieferscheinformat eine Einstellungsdatei für das JSON-Format mit den zum Zuschneiden erforderlichen Koordinaten.

Die notwendigen Informationen auf dem Lieferschein sind

--Name des Anbieters

Behalten Sie daher die Koordinaten der Stellen bei, an denen diese in der Einstellungsdatei beschrieben sind.

JSON-Einstellungsdatei für jeden Lieferanten

shiiresaki_setting.json


{
  "wholesaler_id": 2,
  "warehouse": {
    "x":10,
    "y":10,
    "height":50,
    "width":100
  },
  "date": {
    "x":20,
    "y":20,
    "height":50,
    "width":100
  },
  "product": {
    "x":30,
    "y":30,
    "height":150,
    "width":200
  },
  "figure": {
    "x":40,
    "y":40,
    "height":200,
    "width":250
  },
  "price": {
    "x":50,
    "y":50,
    "height":200,
    "width":250
  }
}

Bildbeschneidungsprozess unter Verwendung des Kissens

crop4image.py


from PIL import Image
import sys
import json
import productsetting

args = sys.argv
p = productsetting.product.ProductSetting(args[1])
image = Image.open('img/png/{wholesaler_id}.png'.format(wholesaler_id=p.wholesaler_id))

rect = (
  p.warehouse['x'],
  p.warehouse['y'],
  p.warehouse['x'] + p.warehouse['width'], 
  p.warehouse['y'] + p.warehouse['height']
)
print(rect)
cropped_image = image.crop(rect)
cropped_image.save('{wholesaler_id}.png'.format(wholesaler_id=p.wholesaler_id))

Klasse zum Lesen der Einstellungsdatei von JSON

productsetting.py


import sys
import json

class ProductSetting:
  CONFIG_SETTING_FILE_BASE_FORMAT = './settings/product/{wholesaler_id}.json'
  
  def __init__(self, wholesaler):
    config_file_path = open(self.CONFIG_SETTING_FILE_BASE_FORMAT.format(wholesaler_id=wholesaler), 'r')
    config = json.load(config_file_path)
    self.wholesaler_id = config['wholesaler_id']
    self.warehouse = {
      'x': config['warehouse']['x'],
      'y': config['warehouse']['y'],
      'height': config['warehouse']['height'],
      'width': config['warehouse']['width']
    }    
    self.product = {
      'x': config['product']['x'],
      'y': config['product']['y'],
      'height': config['product']['height'],
      'width': config['product']['width']
    }    
    self.date = {
      'x': config['date']['x'],
      'y': config['date']['y'],
      'height': config['date']['height'],
      'width': config['date']['width']
    }    
    self.figure = {
      'x': config['figure']['x'],
      'y': config['figure']['y'],
      'height': config['figure']['height'],
      'width': config['figure']['width']
    }    

Wenn Sie dieses Skript ausführen, verwenden Sie ein solches Bild スクリーンショット 2019-12-19 22.11.02.png

Ich konnte an den auf diese Weise angegebenen Koordinaten zuschneiden. buyoption_1013.png

Binar die zugeschnittenen Daten

Um die OCR-Genauigkeit des zugeschnittenen Bildes zu verbessern, werden die Zeichen als nächstes binärisiert, um die Lesegenauigkeit zu verbessern.

Erstellt mit opencv Das Binärisierungsprogramm ist einfach so

deeply_character.py


import cv2
img = cv2.imread('./result/png/1013/buyoption_1013.png', 0)
threshold = 100 #Schwelle
ret, img_thresh = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)
cv2.imwrite('./result/deeply/test/buyoption_1013.png', img_thresh)

Das ausgeschnittene Bild so buyoption_1013.png

Es wurde so binärisiert buyoption_1013.png

Ich fühle nicht viel Nutzen, weil die Probe nicht gut ist.

Ich werde es mit diesem Bild versuchen, das hart zu sein scheint. sample.png

Wenn Sie den Schwellenwert anpassen und ihn binärisieren ... buyoption_1013.png

Was! Das Bild ist klarer.

Wenden wir dieses Bild auf die OCR von GCP an zuletzt erstellt. als Ergebnis··· スクリーンショット 2019-12-19 20.24.52.png

Es wurde auf diese Weise transkribiert, und wenn Sie sorgfältig darüber nachdenken, wird der Teil mit dem Namen "Liefertermin" ebenfalls zu Rauschen, sodass es in Ordnung war, ihn wegzulassen. Mit dieser Genauigkeit scheint es jedoch möglich zu sein, die Wiederverwendbarkeit der Prüfung aufrechtzuerhalten.

Zusammenfassung

Diesmal als Vorbehandlung für OCR

--Schneiden Sie nur die notwendigen Teile aus

Ich habe versucht herauszufinden, wie ich damit eine günstige Situation für OCR schaffen kann.

In Bezug auf diese Bemühungen zur Verbesserung der Effizienz von Papierkram war es gut zu sagen: "Ich werde es versuchen!" Innerhalb des Geschäftsbereichs, aber als ich den tatsächlichen Lieferschein sah, war ich besorgt, ob er wirklich automatisiert werden könnte. Infolgedessen bin ich der Meinung, dass die Genauigkeit verbessert werden kann und die Automatisierung durch Anwendung von OCR realistisch geworden ist, nachdem Rauschen durch Zuschneiden des Bildes und Schärfen durch Binarisierung entfernt wurde.

Adventskalender Wir haben begonnen, uns der Herausforderung zu stellen, das Problem der zweimaligen Überprüfung von Lieferscheinen bei Cyma mit OCR-zentrierter Technologie zu automatisieren. In Zukunft möchte ich an der Realisierung von Vorgängen arbeiten, an denen die Fabrik beteiligt ist, während ich mit der Implementierung des Systems fortfahre.

Schließlich

Wie war der 21. Tag des Ateam Cyma Adventskalenders 2019? Am 22. Tag wird Saima-Designer @ryo_cy über CSS-Design mit BEM sprechen. Bleiben Sie also auf dem Laufenden!

A Team Co., Ltd. sucht Kollegen mit einem starken Geist der Herausforderung, mit denen sie zusammenarbeiten können.

Wenn Sie Ingenieur sind und interessiert sind, lesen Sie bitte cymas Qiita Jobs.

Weitere Berufe finden Sie unter A Team Group Recruitment Site.

Recommended Posts

Fordern Sie die Herausforderungen von Cyma weiterhin mit dem OCR-Dienst der Google Cloud Platform heraus
Lassen Sie uns die Super Resolution API mithilfe der Google Cloud Platform veröffentlichen
Eine Geschichte, die mithilfe einer kostenlosen Testversion der Google Cloud Platform zu einer neuen Koronaanalyse beiträgt
Ich wollte die Klassifizierung von CIFAR-10 mit dem Chainer-Trainer in Frage stellen
Regelmäßiger Export von Google Analytics-Rohdaten nach BigQuery mithilfe von Cloud-Funktionen
Ich habe versucht, E-Mails von Node.js und Python mithilfe des E-Mail-Zustelldienstes (SendGrid) von IBM Cloud zuzustellen!
Verwendung der Google Cloud Translation API
[GoogleCloudPlatform] Verwenden Sie die Google Cloud-API mit der API-Clientbibliothek
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Wie man die Portnummer des xinetd-Dienstes kennt
Die Geschichte der Verwendung von Circleci zum Bau vieler Linux-Räder
Anzeigen von Wettervorhersagen auf M5Stack + Google Cloud Platform
Senden Sie mithilfe von Google Cloud Messaging für Chrome eine Nachricht vom Server an die Chrome-Erweiterung
So zeichnen Sie einfach die Struktur eines neuronalen Netzwerks in Google Colaboratory mit "convnet-drawer"
[Python] Ändern Sie die Cache-Steuerung von Objekten, die in den Cloud-Speicher hochgeladen wurden
Anzeigen mit dem Python-Modul des mobilen Nifty Cloud-Backends
Versuchen Sie, Lebensmittelfotos mithilfe der Google Cloud Vision-API zu beurteilen
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Eine Geschichte über die Umstellung eines persönlich entwickelten Webdienstes von einem Mietserver auf GCP (Google Cloud Platform)