card_id_counter / app.py
alexneakameni's picture
Upload 2 files
693596e verified
raw
history blame
4.01 kB
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()