Spaces:
Sleeping
Sleeping
File size: 2,966 Bytes
f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa f25476a f42ecfa f25476a f42ecfa f25476a f42ecfa f25476a f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa c993583 f25476a f42ecfa f25476a f42ecfa 1819aaf f25476a 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa 1819aaf f42ecfa c993583 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# 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()
|