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.
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.
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.
Ich werde schnell hierher gehen.
Python
pyenv
python 3.8.0
--Verwenden Sie spätestens zum Zeitpunkt des Schreibenspip
--Package Management Tool in Pythonpdf2image
Installation--poppler
Installation
Kissen
Installationopencv
Installationbrew 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
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.
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')
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.
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.
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
}
}
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))
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
Ich konnte an den auf diese Weise angegebenen Koordinaten zuschneiden.
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
Es wurde so binärisiert
Ich fühle nicht viel Nutzen, weil die Probe nicht gut ist.
Ich werde es mit diesem Bild versuchen, das hart zu sein scheint.
Wenn Sie den Schwellenwert anpassen und ihn binärisieren ...
Was! Das Bild ist klarer.
Wenden wir dieses Bild auf die OCR von GCP an zuletzt erstellt. als Ergebnis···
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.
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.
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