Spaces:
Sleeping
Sleeping
import gradio as gr | |
from PIL import Image | |
import os | |
import sqlite3 | |
from groq import Groq | |
import io | |
import base64 | |
def initialize_database(): | |
db_connection = sqlite3.connect("voter_cards.db") | |
cursor = db_connection.cursor() | |
cursor.execute( | |
""" | |
CREATE TABLE IF NOT EXISTS voter_cards ( | |
id INTEGER PRIMARY KEY AUTOINCREMENT, | |
card_number TEXT UNIQUE | |
) | |
""" | |
) | |
db_connection.commit() | |
return db_connection, cursor | |
# Configuration GroqCloud | |
def initialize_groq(): | |
return Groq( | |
api_key=os.getenv("GROQ_API_KEY"), | |
) | |
def encode_image_to_base64(image: Image.Image): | |
"""Convert a PIL image to a base64-encoded string.""" | |
buffer = io.BytesIO() | |
image.save(buffer, format="PNG") | |
buffer.seek(0) | |
return base64.b64encode(buffer.getvalue()).decode("utf-8") | |
class VoterCardVerifier: | |
def __init__(self): | |
self.connection, self.cursor = initialize_database() | |
self.groq = initialize_groq() | |
def verify_card(self, image, card_number): | |
# Convertir l'image pour Groq | |
if isinstance(image, str): | |
image = Image.open(image) | |
image = encode_image_to_base64(image) | |
# Préparer la requête pour le modèle | |
messages = [ | |
{ | |
"role": "user", | |
"content": [ | |
{ | |
"type": "text", | |
"text": f"Vérifie si le numéro {card_number} est clairement visible et lisible sur l'image de cette carte d'électeur." | |
" Confirme également que cette carte est bien d'origine camerounaise en vérifiant la présence explicite de la mention 'Cameroun' sur la carte." | |
" Réponds uniquement par 'true' ou 'false' : 'true' si le numéro est présent, lisible, et que la carte est d'origine camerounaise ; 'false' dans tous les autres cas.", | |
}, | |
{ | |
"type": "image_url", | |
"image_url": {"url": f"data:image/PNG;base64,{image}"}, | |
}, | |
], | |
}, | |
] | |
# Appeler le modèle | |
response = self.groq.chat.completions.create( | |
model=os.getenv("GROQ_MODEL_ID"), | |
messages=messages, | |
temperature=0.1, | |
max_tokens=25, | |
) | |
result = response.choices[0].message.content.strip().lower() | |
print(result) | |
is_valid = "true" in result | |
if is_valid: | |
# Sauvegarder dans Firebase | |
return self.save_card_number(card_number) | |
else: | |
return "Numéro de carte non trouvé sur l'image" | |
def save_card_number(self, card_number): | |
# Ajouter le numéro à Firestore | |
# Sauvegarder dans la base de données | |
try: | |
self.cursor.execute( | |
"INSERT INTO voter_cards (card_number) VALUES (?)", (card_number,) | |
) | |
self.connection.commit() | |
return f"Numéro vérifié et sauvegardé : {card_number}" | |
except sqlite3.IntegrityError: | |
return f"Le numéro {card_number} existe déjà dans la base." | |
# Interface Gradio | |
def create_interface(): | |
verifier = VoterCardVerifier() | |
def process(image, card_number): | |
if not card_number.strip(): | |
return "Veuillez entrer un numéro de carte" | |
return verifier.verify_card(image, card_number) | |
interface = gr.Interface( | |
fn=process, | |
inputs=[ | |
gr.Image(type="pil", label="Image de la carte d'électeur"), | |
gr.Textbox(label="Numéro de carte"), | |
], | |
outputs=gr.Textbox(label="Résultat"), | |
title="Vérification de Carte d'Électeur", | |
description="Uploadez une image de votre carte d'électeur et entrez son numéro pour vérification", | |
) | |
return interface | |
if __name__ == "__main__": | |
# Créer et lancer l'interface | |
demo = create_interface() | |
demo.launch() | |