VisionIdentIA / app.py
Balde-maria2005's picture
Update app.py
f42ecfa verified
# app.py
import gradio as gr
from PIL import Image
import torch
from transformers import TrOCRProcessor, VisionEncoderDecoderModel
import re
import json
# Charger le modèle TrOCR
processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-stage1")
model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-stage1")
model.eval()
def ocr_trocr(pil_image):
image = pil_image.convert("RGB")
pixel_values = processor(images=image, return_tensors="pt").pixel_values
with torch.no_grad():
generated_ids = model.generate(pixel_values)
text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
return text
def est_carte_identite_guineenne(texte):
texte = texte.upper().replace("’", "'")
mots_cles = [
"CARTE", "IDENTITE", "GUINEE", "GUINEENNE", "REPUBLIQUE",
"CEDEAO", "GIN", "DATE DE NAISSANCE", "NUMERO", "MSPC",
"NOM", "PRENOM"
]
return sum(1 for mot in mots_cles if mot in texte) >= 3
def extraire_donnees(texte):
texte = texte.upper()
patterns = {
"nom": r"NOM\s*[:\-]?\s*([A-Z\-]+)",
"prenom": r"PRENOM\s*[:\-]?\s*([A-Z\-]+)",
"sexe": r"SEXE\s*[:\-]?\s*([MF])",
"taille": r"TAILLE\s*[:\-]?\s*([0-9,.]+\s?M)",
"nationalite": r"NATIONALITE\s*[:\-]?\s*([A-Z]+)",
"date_naissance": r"(\d{2}\s(?:JAN|FEB|MAR|APR|MAI|JUN|JUL|AOU|SEP|OCT|NOV|DEC)\s\d{4})",
"numero_id": r"(\d{16})",
"nin": r"(\d{15})",
"date_emission": r"DATE D['’]?EMISSION\s*[:\-]?\s*(\d{2}\s\w+\s\d{4})",
"date_expiration": r"DATE D['’]?EXPIRATION\s*[:\-]?\s*(\d{2}\s\w+\s\d{4})",
"lieu": r"CONAKRY|KANKAN|NZEREKORE|LABE|KINDIA|BOKE|FARANAH"
}
data = {}
for key, pattern in patterns.items():
match = re.search(pattern, texte)
if match:
data[key] = match.group(1)
return data
def analyse_carte(recto_img, verso_img):
try:
texte_recto = ocr_trocr(recto_img)
texte_verso = ocr_trocr(verso_img)
texte_total = texte_recto + "\n" + texte_verso
if not est_carte_identite_guineenne(texte_total):
return " Ce document ne semble pas être une carte d'identité guinéenne.", {}
champs = extraire_donnees(texte_total)
return texte_total, champs
except Exception as e:
return f"Erreur de traitement : {str(e)}", {}
interface = gr.Interface(
fn=analyse_carte,
inputs=[
gr.Image(type="pil", label="Image Recto"),
gr.Image(type="pil", label="Image Verso")
],
outputs=[
gr.Textbox(label="Texte OCR extrait"),
gr.JSON(label="Champs structurés extraits")
],
title="OCRIA - Lecture intelligente de carte d'identité guinéenne",
description="Scannez les deux faces d'une carte d'identité guinéenne. Le système vérifie et extrait automatiquement les informations clés."
)
if __name__ == "__main__":
interface.launch()