[PYTHON] Continuer à relever les défis de Cyma en utilisant le service OCR de Google Cloud Platform

Calendrier de l'Avent Ateam Cyma 2019, 21e jour! Ateam Co., Ltd. Siège social d'EC L'ingénieur Saima @shimura_atsushi est ici pour la deuxième fois.

Dans la première tentative, Challenge the challenges of Sima using the OCR service of Google Could Platform, j'ai relevé le premier défi pour relever les défis de Sima. .. Cette fois, c'est la deuxième fois, nous redoublerons d'efforts pour vérifier le bon de livraison.

Revoir la dernière fois

J'ai essayé un OCR simple en utilisant le service GCP dans Last Post. Cependant, de nombreux documents de livraison actuellement utilisés par Cyma contiennent des textes compliqués et la précision de la transcription est faible simplement en appliquant l'OCR. Même si la transcription réussit, les données ne sont pas étiquetées et les données de texte Il était dans un état de mauvaise réutilisabilité.

Cette fois···

Sur la base de la réflexion précédente, nous nous concentrerons cette fois sur «la préparation d'une image facile à OCR» et créerons un prétraitement de l'image à appliquer à l'OCR. Puisque le contenu est une continuation de la fois précédente, le titre reste le même, mais cette fois, il est principalement implémenté en Python et il est mince pour Google Could Platform Veuillez me pardonner.

Cette fois, nous utiliserons Python, qui possède une riche bibliothèque de traitement d'images, avec la recommandation de @NamedPython, un ingénieur Cyma.

Préparez l'environnement

Terminal de développement utilisé cette fois

Tout installer

Je vais y aller rapidement.

Installation

--Installez Python - pyenv

brew install pyenv 
pyenv install --list #Vérifiez la version installable
pyenv install 3.8.0
pip3 install pdf2image
brew install poppler 
pip install pillow
pip install opencv

Écoulement brutal

  1. Numérisez des documents avec une machine composée
  2. Convertissez les données de numérisation (PDF) en données d'image
  3. Recadrez les données d'image converties
  4. Binarisez les données recadrées
  5. Appliquer à l'OCR

Numériser avec une machine multifonction (PDF)

J'utiliserai la machine multifonction au siège social, et lorsque je la numériserai, un PDF sera joint à l'adresse e-mail enregistrée.

Conversion de PDF en données d'image

Étant donné que les données numérisées sont au format PDF, elles seront converties en données d'image. Si vous spécifiez un répertoire, le fichier PDF stocké sera converti en données d'image. Si vous importez pdf2image et transmettez le chemin du fichier que vous souhaitez convertir à la méthode convert_from_path Il le convertira, n'est-ce pas?

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')

Recadrer les données converties

Le cœur de cet OCR est ce processus. Sur la base de la réflexion précédente, nous mettrons en œuvre le processus de découpe et d'étiquetage des pièces nécessaires à partir des données compliquées du bon de livraison dans ce processus.

Préparez le fichier de configuration en JSON

Étant donné que le format du bon de livraison est fondamentalement le même pour chaque fournisseur (il existe différents modèles pour les vélos et les pièces), préparez un fichier de réglage du format JSON pour chaque format de bon de livraison avec les coordonnées requises pour le recadrage.

Les informations nécessaires sur le bon de livraison sont

--Nom du fournisseur

Par conséquent, conservez les coordonnées des endroits où ils sont décrits dans le fichier de paramètres.

Fichier de paramètres JSON pour chaque fournisseur

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
  }
}

Processus de recadrage d'image à l'aide d'un oreiller

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))

Classe pour lire le fichier de paramètres par 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']
    }    

Lorsque vous exécutez ce script, à partir d'une image comme celle-ci スクリーンショット 2019-12-19 22.11.02.png

J'ai pu recadrer aux coordonnées spécifiées de cette manière. buyoption_1013.png

Binar les données recadrées

Ensuite, afin d'améliorer la précision OCR de l'image recadrée, les caractères sont binarisés pour améliorer la précision de lecture.

Créé en utilisant ʻopencv` Le programme de binarisation est simplement comme ça

deeply_character.py


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

L'image découpée comme celle-ci buyoption_1013.png

C'était binarisé comme ça buyoption_1013.png

Je ne ressens pas beaucoup d'avantages car l'échantillon n'est pas bon.

Je vais l'essayer avec cette image qui semble coriace. sample.png

Si vous ajustez le seuil et le binarisez ... buyoption_1013.png

Quoi! L'image est plus claire.

Appliquons cette image à l'OCR de GCP créée la dernière fois. Par conséquent··· スクリーンショット 2019-12-19 20.24.52.png

Il a été transcrit de cette manière, et si vous y réfléchissez bien, la partie appelée "date de livraison" devient également du bruit, donc il était normal de l'omettre. Cependant, avec cette précision, il semble que la réutilisabilité du chèque puisse être maintenue.

Résumé

Cette fois, comme prétraitement pour l'OCR

J'ai essayé de trouver comment créer une situation favorable pour l'OCR en faisant.

En ce qui concerne cet effort pour améliorer l'efficacité de la paperasse, c'était bien de dire «Je vais essayer!» Au sein de la division commerciale, mais quand j'ai vu le bon de livraison, je me suis demandé s'il pouvait vraiment être automatisé. En conséquence, en appliquant l'OCR après avoir supprimé le bruit en recadrant l'image et en accentuant la netteté par binarisation, je pense que la précision peut être améliorée et que l'automatisation est devenue réaliste.

Calendrier de l'Avent Nous avons commencé à relever le défi d'automatiser la question de la vérification des bons de livraison chez Cyma à deux reprises avec la technologie centrée sur l'OCR. A l'avenir, j'aimerais travailler sur la réalisation d'opérations impliquant l'usine tout en procédant à la mise en place du système.

finalement

Comment s'est déroulé le 21e jour du calendrier de l'avent Ateam Cyma 2019? Le 22ème jour, le designer de Saima @ryo_cy parlera de la conception CSS utilisant BEM, alors restez à l'écoute!

A Team Co., Ltd. est à la recherche de collègues avec un fort esprit de défi avec qui travailler.

Si vous êtes ingénieur et que vous êtes intéressé, veuillez consulter cyma's Qiita Jobs.

Pour les autres professions, veuillez consulter Un site de recrutement de groupe d'équipe.

Recommended Posts

Continuer à relever les défis de Cyma en utilisant le service OCR de Google Cloud Platform
Publions l'API de super résolution à l'aide de Google Cloud Platform
Une histoire qui contribue à une nouvelle analyse corona à l'aide d'un essai gratuit de Google Cloud Platform
Je voulais contester la classification du CIFAR-10 en utilisant l'entraîneur de Chainer
Exportation régulière des données brutes Google Analytics vers BigQuery à l'aide des fonctions cloud
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
Comment utiliser l'API Google Cloud Translation
[GoogleCloudPlatform] Utiliser l'API Google Cloud avec la bibliothèque cliente d'API
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
Comment connaître le numéro de port du service xinetd
L'histoire de l'utilisation de Circleci pour construire des roues Manylinux
Consultez les prévisions météo sur M5Stack + Google Cloud Platform
Envoyer un message du serveur à l'extension Chrome à l'aide de Google Cloud Messaging pour Chrome
Comment dessiner facilement la structure d'un réseau de neurones sur Google Colaboratory à l'aide de "convnet-tiroir"
[Python] Modifier le contrôle du cache des objets téléchargés sur Cloud Storage
Afficher à l'aide du module python du backend mobile Nifty Cloud
Essayez de juger des photos de plats à l'aide de l'API Google Cloud Vision
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
Une histoire sur le passage d'un service Web développé personnellement d'un serveur de location à GCP (Google Cloud Platform)