File size: 4,013 Bytes
693596e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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()