alexneakameni commited on
Commit
693596e
·
verified ·
1 Parent(s): 9a1739e

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +127 -0
  2. requirements.txt +2 -0
app.py ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from PIL import Image
3
+ import os
4
+ import sqlite3
5
+ from groq import Groq
6
+ import io
7
+ import base64
8
+
9
+
10
+ def initialize_database():
11
+ db_connection = sqlite3.connect("voter_cards.db")
12
+ cursor = db_connection.cursor()
13
+ cursor.execute(
14
+ """
15
+ CREATE TABLE IF NOT EXISTS voter_cards (
16
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17
+ card_number TEXT UNIQUE
18
+ )
19
+ """
20
+ )
21
+ db_connection.commit()
22
+ return db_connection, cursor
23
+
24
+
25
+ # Configuration GroqCloud
26
+ def initialize_groq():
27
+ return Groq(
28
+ api_key=os.getenv("GROQ_API_KEY"),
29
+ )
30
+
31
+
32
+ def encode_image_to_base64(image: Image.Image):
33
+ """Convert a PIL image to a base64-encoded string."""
34
+ buffer = io.BytesIO()
35
+ image.save(buffer, format="PNG")
36
+ buffer.seek(0)
37
+ return base64.b64encode(buffer.getvalue()).decode("utf-8")
38
+
39
+
40
+ class VoterCardVerifier:
41
+ def __init__(self):
42
+ self.connection, self.cursor = initialize_database()
43
+ self.groq = initialize_groq()
44
+
45
+ def verify_card(self, image, card_number):
46
+ # Convertir l'image pour Groq
47
+ if isinstance(image, str):
48
+ image = Image.open(image)
49
+ image = encode_image_to_base64(image)
50
+
51
+ # Préparer la requête pour le modèle
52
+ messages = [
53
+ {
54
+ "role": "user",
55
+ "content": [
56
+ {
57
+ "type": "text",
58
+ "text": f"Vérifie si le numéro {card_number} est clairement visible et lisible sur l'image de cette carte d'électeur."
59
+ " Confirme également que cette carte est bien d'origine camerounaise en vérifiant la présence explicite de la mention 'Cameroun' sur la carte."
60
+ " 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.",
61
+ },
62
+ {
63
+ "type": "image_url",
64
+ "image_url": {"url": f"data:image/PNG;base64,{image}"},
65
+ },
66
+ ],
67
+ },
68
+ ]
69
+
70
+ # Appeler le modèle
71
+ response = self.groq.chat.completions.create(
72
+ model=os.getenv("GROQ_MODEL_ID"),
73
+ messages=messages,
74
+ temperature=0.1,
75
+ max_tokens=25,
76
+ )
77
+ result = response.choices[0].message.content.strip().lower()
78
+ print(result)
79
+ is_valid = "true" in result
80
+
81
+ if is_valid:
82
+ # Sauvegarder dans Firebase
83
+ return self.save_card_number(card_number)
84
+ else:
85
+ return "Numéro de carte non trouvé sur l'image"
86
+
87
+ def save_card_number(self, card_number):
88
+ # Ajouter le numéro à Firestore
89
+ # Sauvegarder dans la base de données
90
+ try:
91
+ self.cursor.execute(
92
+ "INSERT INTO voter_cards (card_number) VALUES (?)", (card_number,)
93
+ )
94
+ self.connection.commit()
95
+ return f"Numéro vérifié et sauvegardé : {card_number}"
96
+ except sqlite3.IntegrityError:
97
+ return f"Le numéro {card_number} existe déjà dans la base."
98
+
99
+
100
+ # Interface Gradio
101
+ def create_interface():
102
+ verifier = VoterCardVerifier()
103
+
104
+ def process(image, card_number):
105
+ if not card_number.strip():
106
+ return "Veuillez entrer un numéro de carte"
107
+ return verifier.verify_card(image, card_number)
108
+
109
+ interface = gr.Interface(
110
+ fn=process,
111
+ inputs=[
112
+ gr.Image(type="pil", label="Image de la carte d'électeur"),
113
+ gr.Textbox(label="Numéro de carte"),
114
+ ],
115
+ outputs=gr.Textbox(label="Résultat"),
116
+ title="Vérification de Carte d'Électeur",
117
+ description="Uploadez une image de votre carte d'électeur et entrez son numéro pour vérification",
118
+ )
119
+
120
+ return interface
121
+
122
+
123
+ if __name__ == "__main__":
124
+
125
+ # Créer et lancer l'interface
126
+ demo = create_interface()
127
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ gradio==5.11.0
2
+ groq==0.13.1