alexneakameni commited on
Commit
baba668
·
verified ·
1 Parent(s): 7aaf282

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -39
app.py CHANGED
@@ -1,67 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
 
 
2
  from PIL import Image
3
- import sqlite3
4
- from ocr_engine import ocr_model
5
-
6
-
7
- def initialize_database():
8
- db_connection = sqlite3.connect("voter_cards.db")
9
- cursor = db_connection.cursor()
10
- cursor.execute(
11
- """
12
- CREATE TABLE IF NOT EXISTS voter_cards (
13
- id INTEGER PRIMARY KEY AUTOINCREMENT,
14
- card_number TEXT UNIQUE
15
- )
16
- """
17
- )
18
- db_connection.commit()
19
- db_connection.close()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
 
22
  class VoterCardVerifier:
23
  def __init__(self):
24
- initialize_database()
25
-
26
- def verify_card(self, image, card_number):
 
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
- message = ocr_model.chat(image).strip().lower()
 
 
 
 
 
 
33
 
34
  # valider les entrées
35
- is_valid = ("camer" in message) and (card_number in message)
36
 
37
  if is_valid:
38
  # Sauvegarder dans Firebase
39
- return self.save_card_number(card_number)
 
40
  else:
41
  return "Numéro de carte non trouvé sur l'image"
42
 
43
- def save_card_number(self, card_number):
44
- db_connection = sqlite3.connect("voter_cards.db")
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)