Spaces:
Running
Running
alexneakameni
commited on
Update app.py
Browse files
app.py
CHANGED
@@ -1,67 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import gradio as gr
|
|
|
|
|
2 |
from PIL import Image
|
3 |
-
import
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
|
21 |
|
22 |
class VoterCardVerifier:
|
23 |
def __init__(self):
|
24 |
-
|
25 |
-
|
26 |
-
|
|
|
27 |
# Convertir l'image pour Groq
|
28 |
if isinstance(image, str):
|
29 |
image = Image.open(image)
|
30 |
|
31 |
# Préparer la requête pour le modèle et l'appeler
|
32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
# valider les entrées
|
35 |
-
is_valid = (
|
36 |
|
37 |
if is_valid:
|
38 |
# Sauvegarder dans Firebase
|
39 |
-
|
|
|
40 |
else:
|
41 |
return "Numéro de carte non trouvé sur l'image"
|
42 |
|
43 |
-
def save_card_number(self, card_number):
|
44 |
-
|
45 |
-
cursor = db_connection.cursor()
|
46 |
-
# Ajouter le numéro à Firestore
|
47 |
-
# Sauvegarder dans la base de données
|
48 |
-
try:
|
49 |
-
cursor.execute(
|
50 |
-
"INSERT INTO voter_cards (card_number) VALUES (?)", (card_number,)
|
51 |
-
)
|
52 |
-
db_connection.commit()
|
53 |
-
return f"Numéro vérifié et sauvegardé : {card_number}"
|
54 |
-
except sqlite3.IntegrityError:
|
55 |
-
return f"Le numéro {card_number} existe déjà dans la base."
|
56 |
-
finally:
|
57 |
-
db_connection.close()
|
58 |
|
59 |
|
60 |
# Interface Gradio
|
61 |
def create_interface():
|
62 |
verifier = VoterCardVerifier()
|
63 |
|
64 |
-
def process(image, card_number):
|
65 |
if not card_number.strip():
|
66 |
return "Veuillez entrer un numéro de carte"
|
67 |
return verifier.verify_card(image, card_number)
|
|
|
1 |
+
import os
|
2 |
+
|
3 |
+
from dotenv import load_dotenv
|
4 |
+
|
5 |
+
load_dotenv(override=True)
|
6 |
+
|
7 |
+
import io
|
8 |
+
import os
|
9 |
+
from typing import Union
|
10 |
+
|
11 |
+
import easyocr
|
12 |
+
import firebase_admin
|
13 |
import gradio as gr
|
14 |
+
from firebase_admin import credentials, firestore
|
15 |
+
from loguru import logger
|
16 |
from PIL import Image
|
17 |
+
from thefuzz import fuzz
|
18 |
+
|
19 |
+
from processor import ImageHandler, PreprocessingConfig, ProcessedImage
|
20 |
+
|
21 |
+
|
22 |
+
class EasyOCRReader:
|
23 |
+
def __init__(self):
|
24 |
+
self.reader = easyocr.Reader(["fr", "en"], gpu=False)
|
25 |
+
self.process = ImageHandler()
|
26 |
+
self.config = PreprocessingConfig()
|
27 |
+
|
28 |
+
def chat(self, image):
|
29 |
+
processed: ProcessedImage = self.process.preprocess_image(image, self.config)
|
30 |
+
image = Image.fromarray(processed.image)
|
31 |
+
# Convert image to bytes
|
32 |
+
img_byte_arr = io.BytesIO()
|
33 |
+
image.save(img_byte_arr, format="PNG")
|
34 |
+
img_byte_arr = img_byte_arr.getvalue()
|
35 |
+
|
36 |
+
# Call readtext with image bytes
|
37 |
+
texts = self.reader.readtext(img_byte_arr, detail=0)
|
38 |
+
logger.info(" ".join(texts))
|
39 |
+
return texts
|
40 |
+
|
41 |
+
|
42 |
+
class FirebaseConnector:
|
43 |
+
def get_config(self):
|
44 |
+
return {
|
45 |
+
"type": os.getenv("type"),
|
46 |
+
"project_id": os.getenv("project_id"),
|
47 |
+
"private_key_id": os.getenv("private_key_id"),
|
48 |
+
"private_key": os.getenv("private_key").replace("\\n", "\n"),
|
49 |
+
"client_email": os.getenv("client_email"),
|
50 |
+
"client_id": os.getenv("client_id"),
|
51 |
+
"auth_uri": os.getenv("auth_uri"),
|
52 |
+
"token_uri": os.getenv("token_uri"),
|
53 |
+
"auth_provider_x509_cert_url": os.getenv("auth_provider_x509_cert_url"),
|
54 |
+
"client_x509_cert_url": os.getenv("client_x509_cert_url"),
|
55 |
+
"universe_domain": os.getenv("universe_domain"),
|
56 |
+
}
|
57 |
+
|
58 |
+
def __init__(self):
|
59 |
+
# print(os.environ)
|
60 |
+
firebase_config = self.get_config()
|
61 |
+
cred = credentials.Certificate(firebase_config)
|
62 |
+
firebase_admin.initialize_app(cred)
|
63 |
+
self.db = firestore.client()
|
64 |
+
|
65 |
+
def add(self, ocr: str, key: str):
|
66 |
+
doc_ref = self.db.collection("id-card").document(key)
|
67 |
+
if doc_ref.get().exists:
|
68 |
+
raise ValueError(f"Document with key {key} already exists.")
|
69 |
+
return self.db.collection("id-card").add({"ocr": ocr}, document_id=key)
|
70 |
+
|
71 |
+
|
72 |
+
def search_element(words: list[str], target: str, thr: float = 60):
|
73 |
+
scores = list(map(lambda x: fuzz.partial_ratio(x, target), words))
|
74 |
+
word_scores = [(w, s) for w, s in zip(words, scores) if s >= thr]
|
75 |
+
return word_scores
|
76 |
|
77 |
|
78 |
class VoterCardVerifier:
|
79 |
def __init__(self):
|
80 |
+
self.db = FirebaseConnector()
|
81 |
+
self.ocr_engine = EasyOCRReader()
|
82 |
+
|
83 |
+
def verify_card(self, image: Union[str, Image.Image], card_number, thr: float = 60):
|
84 |
# Convertir l'image pour Groq
|
85 |
if isinstance(image, str):
|
86 |
image = Image.open(image)
|
87 |
|
88 |
# Préparer la requête pour le modèle et l'appeler
|
89 |
+
ocr_data = self.ocr_engine.chat(image)
|
90 |
+
|
91 |
+
score1 = search_element(ocr_data, "camer", thr)
|
92 |
+
score2 = search_element(ocr_data, card_number, thr)
|
93 |
+
|
94 |
+
ocr_data = score1 + score2
|
95 |
+
logger.info(str(ocr_data))
|
96 |
|
97 |
# valider les entrées
|
98 |
+
is_valid = len(score1) and len(score2)
|
99 |
|
100 |
if is_valid:
|
101 |
# Sauvegarder dans Firebase
|
102 |
+
self.save_card_number(ocr_data, card_number)
|
103 |
+
return "Your ID Card have been recorded, thank you !!!"
|
104 |
else:
|
105 |
return "Numéro de carte non trouvé sur l'image"
|
106 |
|
107 |
+
def save_card_number(self, ocr_data, card_number):
|
108 |
+
return self.db.add(str(ocr_data), str(card_number))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
|
110 |
|
111 |
# Interface Gradio
|
112 |
def create_interface():
|
113 |
verifier = VoterCardVerifier()
|
114 |
|
115 |
+
def process(image, card_number: str):
|
116 |
if not card_number.strip():
|
117 |
return "Veuillez entrer un numéro de carte"
|
118 |
return verifier.verify_card(image, card_number)
|