Niveau
Moyen
Env.
Local (Windows), Local (Linux)
Code
Python, BluePrism
Libs
skimage, flask, cv2, jsonpickle, deskew
Sources

Automatiser le redressement d’image avec Blue Prism et Python

Cet article fait suite à l’article qui expliquant comment utiliser la librairie Python deskew pour redresser des images qui ne sont malheureusement pas droite. Je ne vais donc pas expliquer comment utiliser cette librarie mais plutôt vous montrer comment l’utiliser dans un automate Blue Prism afin d’automatiser ce type de tâche.

Pour ce faire nous allons :

  • Créer un Web service (REST) qui expose la fonction de redressement d’image.
  • Déclarer dans Blue Prism ce nouveau service
  • Créer un objet (VBO) Blue Prism qui encapsulera cette fonction

Ces étapes réalisées, il sera très simple de créer autant de Processus Blue Prism que vous le voulez afin de pouvoir redresser des images.

Création du Web Service

Avec Python et Flask nous allons créer en quelques lignes de code un web service REST qui expose une méthode deskew. Voici le code Python qui effectue le redressement:

import numpy as np
from skimage import io
from skimage.transform import rotate
from skimage.color import rgb2gray
from deskew import determine_skew
import jsonpickle
import cv2
from flask import Flask, request, Response
app = Flask(__name__)

# deskew image
def deskew_image(image):
    trace("Deskew Image")
    #image = io.imread(_img)
    grayscale = rgb2gray(image)
    angle = determine_skew(grayscale)
    rotated = rotate(image, angle, resize=True) * 255
    return rotated.astype(np.uint8)

# Check
@app.route('/check', methods=['GET'])
def check():
    output = {}
    output['status'] = "Service running"
    response_pickled = jsonpickle.encode(output)
    return Response(response=response_pickled, status=200, mimetype="application/json")

@app.route('/deskew', methods=['POST'])
def deskew():
    output = {}
    # Get destination filename
    targetfile = request.args.get("targetfile")
    # Get binary file, convert string of image data to uint8 and decode image
    data = request.data
    nparr = np.frombuffer(data, np.uint8)
    image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    image_out = deskew_image(image)
    cv2.imwrite(targetfile, image_out)
    output['status'] = "Saved"
    # Prepare response, encode JSON to return
    response_pickled = jsonpickle.encode(output)
    return Response(response=response_pickled, status=200, mimetype="application/json")

if __name__ == '__main__':
    app.run(debug=True, host='127.0.0.1', port=8090)

Sauvegardez ce code dans un fichier xxx.py et lancer le en ligne de commande via :

$ python xxx.py

Normalement vous devriez avoir un résultat de ce type:

Celà signifie que le Web service est à l’écoute. Si ce n’est pas le cas c’est qu’il vous manque certainement des librairies Python. Reparcourez les articles mentionnés plus haut afin de vérifier qu’ils ont tous été importés avec pip ou conda.

Vous remarquerez que ce web service possède deux méthodes :

  • /check qui permettra à l’Objet (VBO) Blue Prism de vérifier que le Web Service est bien à l’acoute et si ce n’est pas le cas de le lancer.
  • /deskew qui permet de faire le redressement de l’image. Le code de ce service est à peu près celui décrit dans l’article sur le redressement d’image.

Déclaration du service dans Blue Prism

La déclaration ou le référencement de web service dans Blue Prism est extrêmement simple et se fait de manière totalement graphique. Pour cela ouvrez le client Blue Prism et allez dans System, puis cliquez sur Web API Services :

Ajoutez un service en cliquant sur le lien à droite : « Add Service ». Maintenant vous devez configurer les informations et interfaces de votre service avec l’assistant. Précisez tout d’abord le nom et l’URL du service (Cf. Flask ci dessus) :

Référencement de l’action /check

Ensuite, sélectionnez les actions (ou méthodes) et ajoutez la première qui permet de vérifier que le service est lancé (check) :

Ajoutez le nom de l’action et activez là (enabled) :

Cette action n’a pas de parametre. Cliquez sur Request pour préciser comment appeler cette méthode et entrez /check dans le champ « URL Path ».

Cliquez ensuite sur la réponse (response) du service pour préciser les éléments renvoyés par cette action. Remplissez comme suit :

Référencement de l’action /deskew

Maintenant nous allons référencer de la même manière l’action de redressement. Le principe est le même à ceci pret que ce service demande en entrée un fichier (binaire) et un paramètre (le nom du fichier dans lequel sera placé l’image redressée).

Créons tout d’abor une nouvelle action : deskew.

Dans la section Parametre nous allons préciser un seul parametre « targetfile » (le fichier binaire n’est pas considéré comme un parametre car il est envoyé via la méthode HTTP POST).

Dans la partie Request nous devons préciser plusieurs choses :

  • La méthode HTTP : ici obligatoirement POST
  • Comment le parametre est utilisé dans la requete http (sa syntaxe) : /deskew?targetfile=[targetfile]
  • Préciser que le corps (body) du message contient un fichier unique (single file)

Il ne reste plus qu’à préciser les éléments renvoyés par le service :

Voilà c’est pas plus compliqué que ça, il reste maintenant à créer un objet qui utilisera ce service.

Création de l’Objet Blue Prism

Pour cela créez un Objet dans Blue Prism (ici je le nomme pyImageUtils :

Une fois créé, ajoutez simplement une action. Je l’appelerai ici deskew. Cette action Blue Prism a pour données en entrée :

  • Le fichier au format binaire à redresser (Variable Image)
  • Le nom du fichier qui contiendra l’image redressée.

Ce sont exactement les mêmes points d’entrées que le Web Service plus haut. En sortie nous renverrons un simple message précisant si tout s’est bien passé ou pas.

Voici à quoi ressemble l’action dans Blue Prism:

On retrouve dans la partie haute le début de l’action avec les deux paramètres (image et fichier de destination). Ensuite après avoir démarré le service (via la ligne de commande ci-dessus), on demande l’exécution de la méthode deskew du web service. Celà est fait via une simple configuration de l’action « deskew » ci-dessus :

Voilà le service est maintenant opérationnel et maintenu par un Objet réutilisable Blue Prism.

Essayons le !

En mode debug avec Blue Prism celà ne va prendre que quelques secondes. Pour faire l’essai tout d’abord on doit préciser les parametres d’entrée du service :

  • Double Cliquez sur le « Data Item » Image et sélectionnez une image. Je vais prendre celle ci-dessous:
  • Préciser ensuite un nom de fichier : par exemple C:\BP Assets\services\imageutils\test2.jpg

Lancez le processus.

Regardez le fichier de résultat …

Voilà vos Robots ou processus Blue Prism bénéficient maintenant d’une nouvelle compétence qui leur permet de redresser des images.

Vous pouvez télécharger tous les composants nécéssaires à cette compétence sur Github.

Partager cet article

3 Replies to “Automatiser le redressement d’image avec Blue Prism et Python”

  1. Bonjour, et merci pour cet article.
    Vers quelles librairies puis je me tourner si je veux ajouter des traitements supplémentaires à savoir :
    Détection d’une feuille blanche pour éviter de faire ce traitement.
    Détection d’une feuille à l’envers et rotation à 180 ° si nécessaire.
    Et enfin, je souihaiterais dans le cadre de scan de livre effectuer une translation sur mes pages afin que la position de ma marge soit la même d’une feuille à l’autre.

    Avec mes remerciements

    1. Bonjour,
      3 besoins interressants et justifiés (pour info BluePrism Decipher 1.1 couvre deja le 2eme). pour la feuille blanche, je pense qu’il faudrait entrainer un modele dédié a cela. Pour ton 3 eme besoin je pense qu’il faudrait réutiliser openCv pour la detection de bord (un peu comme cela est fait pour le deskewing). Il y a certainement pleins d’autres moyens de le faire …
      Benoît

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.