Inference

C’est le temps maintenant de tester notre modèle en utilisant les images que nous avons prises pour le test à partir de HuggingFace ou d’autres images.

Attention

  • Pour l’inference, on travaille avec Python 3.10.12.

!pip install -q transformers==4.39.2
# CUDA 11.8
!pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu118
# CPU only
#pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cpu

Attention au-dessus pour la deuxième installation, il y a deux cas selon la machine utilisée (GPU, CPU).

## CPU :
#!pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
## GPU :
!pip install paddlepaddle-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple

La même remarque ici.

!pip install "paddleocr>=2.0.1" # Recommend to use version 2.0.1+
from paddleocr import PaddleOCR
from PIL import Image, ImageDraw, ImageFont

ocr = PaddleOCR(use_angle_cls=False,
            lang='fr',
              rec=False,
            ) # need to run only once to download and load model into memory

ici on Initialise notre OCR, on choisisins la langue francaise avec le parametre lang,on vous recommende de découvrir d’autres parametres dans la documentation.

PaddleOCR
labels = ['labl1', 'labe2','...']
id2label = {v: k for v, k in enumerate(labels)}
label2id = {k: v for v, k in enumerate(labels)}

Ici on définit la liste label contenant nos labels par exemple [“InvNum”, “InvDate”, “Fourni”, “TTC”, “TVA”, “TT”, “autres”], ainsi les deux dictionnaires id2label et label2id qu’on aura besoin ultérieurement.

def processbbox(BBOX, width, height):
    bbox = []
    bbox.append(BBOX[0][0])
    bbox.append(BBOX[0][1])
    bbox.append(BBOX[2][0])
    bbox.append(BBOX[2][1])
    #Scaling
    bbox[0]= 1000*bbox[0]/width # X1
    bbox[1]= 1000*bbox[1]/height # Y1
    bbox[2]= 1000*bbox[2]/width # X2
    bbox[3]= 1000*bbox[3]/height # Y2
    for i in range(4):
        bbox[i] = int(bbox[i])
    return bbox

La fonction processbbox fait un traitement sur les BBOX qui va retourner l’OCR, par normalisation et transformation en des entières.

def Preprocess(Image_path):
    image = Image.open(Image_path)
    image = image.convert("RGB")
    width, height = image.size
    results = ocr.ocr(Image_path, cls=True)
    results = results[0]
    test_dict = {'image': image ,'tokens':[], "bboxes":[]}
    for item in results :
    bbox = processbbox(item[0], width, height)
    test_dict['tokens'].append(item[1][0])
    test_dict['bboxes'].append(bbox)

    print(test_dict['bboxes'])
    print(test_dict['tokens'])
    return test_dict

Preprocess Prends en paramètre le chemin de l’image, elle commence par lire cette image avec Image de la bibliothèque PIL, l’a transformé en RGB car paddle exige des images RGB, puis exécuté l’OCR sur cette image, extrait les mots détectés avec leurs BBOX ajustées à la taille réelle de l’image, puis renvoie un dictionnaire avec les informations suivantes : image, boxes, tokens.

from transformers import AutoModelForTokenClassification
from transformers import AutoProcessor
model_Hugging_path = "MODEL_REPO_ID"
model = AutoModelForTokenClassification.from_pretrained(model_Hugging_path)

Vous chargez votre modèle identifié par MODEL_REPO_ID par exemple Textra/LayoutLM. après en exécuter le modèle tout simplement, plus de détails et dans le notebook en bas.

def unnormalize_box(bbox, width, height):
 return [
     width * (bbox[0] / 1000),
     height * (bbox[1] / 1000),
     width * (bbox[2] / 1000),
     height * (bbox[3] / 1000),
 ]

pour labeliser l’image avec les resultats obtenus , en doit dénormaliser les BBOX

  • predictions = outputs.logits.argmax(-1).squeeze().tolist(): Cette ligne extrait les prédictions du modèle. Elle applique la fonction argmax() pour obtenir l’indice de la classe prédite avec la probabilité la plus élevée, puis utilise squeeze() pour éliminer les dimensions inutiles, et enfin, tolist() pour convertir les résultats en une liste Python.

Open In Colab