File size: 6,034 Bytes
efa8cc0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c8bfc54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efa8cc0
 
 
 
d153893
efa8cc0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4f2afc2
efa8cc0
 
 
 
 
 
 
 
 
4f2afc2
efa8cc0
 
4f2afc2
 
 
 
 
 
 
 
efa8cc0
4f2afc2
efa8cc0
 
 
4f2afc2
efa8cc0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import os
import subprocess
from fastapi import FastAPI
from sentence_transformers import SentenceTransformer
from fastapi.middleware.cors import CORSMiddleware
import fitz  # PyMuPDF pour extraction du texte PDF
import faiss
import numpy as np
import requests
import pytesseract
from PIL import Image
import gradio as gr

# Installation automatique de Tesseract pour Windows
def install_tesseract_windows():
    tesseract_installer_url = "https://github.com/tesseract-ocr/tesseract/releases/download/5.3.0/tesseract-5.3.0.20221214.exe"
    installer_path = "tesseract_installer.exe"

    try:
        if not os.path.exists("C:\\Program Files\\Tesseract-OCR"):
            print("Téléchargement de Tesseract OCR en cours...")
            # Télécharger l'installateur via requests
            response = requests.get(tesseract_installer_url, stream=True)
            with open(installer_path, "wb") as f:
                for chunk in response.iter_content(chunk_size=8192):
                    f.write(chunk)
            print("Tesseract OCR téléchargé. Installation en cours...")

            # Exécuter l'installateur silencieusement
            subprocess.run([installer_path, "/S"], shell=True, check=True)

            # Configurer le chemin vers Tesseract
            os.environ["TESSDATA_PREFIX"] = "C:\\Program Files\\Tesseract-OCR\\"
            pytesseract.pytesseract.tesseract_cmd = "C:\\Program Files\\Tesseract-OCR\\tesseract.exe"

            print("Tesseract OCR installé avec succès.")
        else:
            pytesseract.pytesseract.tesseract_cmd = "C:\\Program Files\\Tesseract-OCR\\tesseract.exe"
            print("Tesseract OCR déjà installé.")
    except Exception as e:
        print(f"Erreur lors de l'installation de Tesseract OCR : {e}")

install_tesseract_windows()

# Configuration de l'API Gemini
GEMINI_API_KEY = "AIzaSyALDnGnCP4AuC3uX5dXcYugrfO89clRG9o"
GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent"

# Configuration FAISS et embeddings
EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
model = SentenceTransformer(EMBEDDING_MODEL)
INDEX_PATH = "medical_faiss_index"
documents = []

if os.path.exists(INDEX_PATH):
    index = faiss.read_index(INDEX_PATH)
    print("Index FAISS chargé avec succès.")
else:
    index = faiss.IndexFlatL2(model.get_sentence_embedding_dimension())
    print("Nouvel index FAISS créé.")

# Fonction d'extraction de texte
def extract_text_from_pdf(file_content: bytes):
    pdf = fitz.open(stream=file_content, filetype="pdf")
    paragraphs = []
    for page in pdf:
        text = page.get_text()
        if text.strip():
            paragraphs.extend([p.strip() for p in text.split("\n\n") if p.strip()])
    return paragraphs

def extract_text_from_image(file_path):
    return pytesseract.image_to_string(Image.open(file_path))

# Fonction pour ajouter les documents de référence
def add_medical_reference(file):
    with open(file.name, "rb") as f:
        file_content = f.read()
    paragraphs = extract_text_from_pdf(file_content)
    embeddings = model.encode(paragraphs)
    index.add(np.array(embeddings, dtype="float32"))
    documents.extend(paragraphs)
    faiss.write_index(index, INDEX_PATH)
    return "Référence médicale ajoutée avec succès."

# Fonction pour analyser un fichier (PDF ou Image)
def analyze_blood_test(file):
    try:
        # Extraire le texte
        if file.name.endswith((".png", ".jpg", ".jpeg")):
            extracted_text = extract_text_from_image(file.name)
        elif file.name.endswith(".pdf"):
            with open(file.name, "rb") as f:
                file_content = f.read()
            paragraphs = extract_text_from_pdf(file_content)
        else:
            return "Format non supporté. Utilisez un PDF ou une image."

        if not paragraphs:
            return "Aucun texte valide extrait."

        # Recherche segmentée dans FAISS
        responses = []
        for paragraph in paragraphs:
            relevant_docs = search_faiss(paragraph, k=3)  # Recherche ciblée pour chaque segment
            context = "\n".join(relevant_docs)
            enriched_prompt = f"Voici un segment d'analyse :\n{paragraph}\n\nContexte pertinent :\n{context}"
            gemini_response = call_gemini_api(enriched_prompt)
            responses.append(f"Segment :\n{paragraph}\nRéponse générée :\n{gemini_response}\n")

        return "\n\n".join(responses)
    except Exception as e:
        return f"Erreur : {str(e)}"


# Recherche FAISS
def search_faiss(query, k=5):
    query_embedding = model.encode([query])
    distances, indices = index.search(np.array(query_embedding, dtype="float32"), k)
    return [documents[i] for i in indices[0] if i < len(documents)]

# Appel API Gemini
def call_gemini_api(prompt):
    headers = {"Content-Type": "application/json"}
    payload = {"contents": [{"parts": [{"text": prompt}]}]}
    try:
        response = requests.post(f"{GEMINI_API_URL}?key={GEMINI_API_KEY}", json=payload, headers=headers)
        return response.json().get("candidates", [{}])[0].get("content", {}).get("parts", [{}])[0].get("text", "Pas de réponse.")
    except Exception as e:
        return f"Erreur API : {str(e)}"

# Interface Gradio
with gr.Blocks() as demo:
    gr.Markdown("## Analyse Médicale avec RAG et Gemini")

    with gr.Tab("Ajouter Références Médicales"):
        ref_file = gr.File(label="Téléchargez un fichier PDF de référence médicale")
        ref_output = gr.Textbox(label="Résultat")
        ref_button = gr.Button("Ajouter")
        ref_button.click(add_medical_reference, inputs=ref_file, outputs=ref_output)

    with gr.Tab("Analyser un Résultat d'Analyse"):
        test_file = gr.File(label="Téléchargez un fichier PDF ou image (JPG/PNG)")
        analysis_output = gr.Textbox(label="Résultat")
        analyze_button = gr.Button("Analyser")
        analyze_button.click(analyze_blood_test, inputs=test_file, outputs=analysis_output)

demo.launch()