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.
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é.
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.
Je vais y aller rapidement.
--Installez Python
- pyenv
Vous pouvez gérer la version installée de python
python 3.8.0
Utilisez le dernier au moment de la rédaction
pip
Outil de gestion de paquet en python
Je pense que cela vous accompagnera lorsque vous installerez python
Installation depdf2image
Utilisé pour convertir un PDF en PNG ou JPEG
installation de poppler
Utilisé pour la conversion PDF avec pdf2image
installation de l'oreiller
Utilisé pour le traitement d'image, principalement utilisé pour le recadrage
Installation d'Opencv --Utilisé pour le traitement d'image, principalement utilisé pour la binarisation
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
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.
É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')
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.
É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.
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']
}
Lorsque vous exécutez ce script, à partir d'une image comme celle-ci
J'ai pu recadrer aux coordonnées spécifiées de cette manière.
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
C'était binarisé comme ça
Je ne ressens pas beaucoup d'avantages car l'échantillon n'est pas bon.
Je vais l'essayer avec cette image qui semble coriace.
Si vous ajustez le seuil et le binarisez ...
Quoi! L'image est plus claire.
Appliquons cette image à l'OCR de GCP créée la dernière fois. Par conséquent···
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.
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.
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.