Spaces:
No application file
No application file
| import gradio as gr | |
| from transformers import pipeline | |
| import pandas as pd | |
| import PyPDF2 | |
| import pdfplumber | |
| import torch | |
| import timm | |
| from PIL import Image | |
| # Load pre-trained model for zero-shot classification | |
| classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli") | |
| # Pre-trained model for X-ray analysis (example with a model from timm library) | |
| image_model = timm.create_model('resnet50', pretrained=True) | |
| image_model.eval() | |
| # Initialize patient database | |
| patients_db = [] | |
| # Disease and medication mapping | |
| disease_details = { | |
| "anemia": { | |
| "medication": "Iron supplements (e.g., Ferrous sulfate)", | |
| "precaution": "Increase intake of iron-rich foods like spinach and red meat." | |
| }, | |
| "viral infection": { | |
| "medication": "Antiviral drugs (e.g., Oseltamivir for flu)", | |
| "precaution": "Rest, stay hydrated, and avoid close contact with others." | |
| }, | |
| "liver disease": { | |
| "medication": "Hepatoprotective drugs (e.g., Ursodeoxycholic acid)", | |
| "precaution": "Avoid alcohol and maintain a balanced diet." | |
| }, | |
| "kidney disease": { | |
| "medication": "Angiotensin-converting enzyme inhibitors (e.g., Lisinopril)", | |
| "precaution": "Monitor salt intake and stay hydrated." | |
| }, | |
| "diabetes": { | |
| "medication": "Metformin or insulin therapy", | |
| "precaution": "Follow a low-sugar diet and exercise regularly." | |
| }, | |
| "hypertension": { | |
| "medication": "Antihypertensive drugs (e.g., Amlodipine)", | |
| "precaution": "Reduce salt intake and manage stress." | |
| }, | |
| "COVID-19": { | |
| "medication": "Supportive care, antiviral drugs (e.g., Remdesivir in severe cases)", | |
| "precaution": "Follow isolation protocols, wear a mask, and stay hydrated." | |
| }, | |
| "pneumonia": { | |
| "medication": "Antibiotics (e.g., Amoxicillin) if bacterial", | |
| "precaution": "Rest, avoid smoking, and stay hydrated." | |
| } | |
| } | |
| # Function to register patients | |
| def register_patient(name, age, gender): | |
| patient_id = len(patients_db) + 1 | |
| patients_db.append({ | |
| "ID": patient_id, | |
| "Name": name, | |
| "Age": age, | |
| "Gender": gender, | |
| "Symptoms": "", | |
| "Diagnosis": "", | |
| "Action Plan": "", | |
| "Medications": "", | |
| "Precautions": "", | |
| "Tests": "" | |
| }) | |
| return f"✅ Patient {name} registered successfully. Patient ID: {patient_id}" | |
| # Function to analyze text reports | |
| def analyze_report(patient_id, report_text): | |
| candidate_labels = list(disease_details.keys()) | |
| result = classifier(report_text, candidate_labels) | |
| diagnosis = result['labels'][0] | |
| # Fetch medication and precaution | |
| medication = disease_details[diagnosis]["medication"] | |
| precaution = disease_details[diagnosis]["precaution"] | |
| action_plan = f"You might have {diagnosis}. Please consult a doctor for confirmation." | |
| # Store diagnosis in the database | |
| for patient in patients_db: | |
| if patient["ID"] == patient_id: | |
| patient["Diagnosis"] = diagnosis | |
| patient["Action Plan"] = action_plan | |
| patient["Medications"] = medication | |
| patient["Precautions"] = precaution | |
| break | |
| return (f"🔍 Diagnosis: {diagnosis}\n" | |
| f"🩺 Medications: {medication}\n" | |
| f"⚠️ Precautions: {precaution}\n" | |
| f"💡 {action_plan}") | |
| # Function to extract text from PDF reports | |
| def extract_pdf_report(pdf): | |
| text = "" | |
| with pdfplumber.open(pdf.name) as pdf_file: | |
| for page in pdf_file.pages: | |
| text += page.extract_text() | |
| return text | |
| # Function to analyze uploaded images (X-ray/CT-scan) | |
| def analyze_image(patient_id, img): | |
| image = Image.open(img).convert('RGB') | |
| transform = torch.nn.Sequential( | |
| torch.nn.Upsample(size=(224, 224)), | |
| torch.nn.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) | |
| ) | |
| image_tensor = transform(torch.unsqueeze(torch.tensor(image), 0)) | |
| # Run the image through the model (for simplicity, assuming ResNet50 output) | |
| output = image_model(image_tensor) | |
| _, predicted = torch.max(output, 1) | |
| # Map prediction to a label | |
| labels = {0: "Normal", 1: "Pneumonia", 2: "Liver Disorder", 3: "COVID-19"} | |
| diagnosis = labels.get(predicted.item(), "Unknown") | |
| # Store diagnosis in the database | |
| for patient in patients_db: | |
| if patient["ID"] == patient_id: | |
| patient["Diagnosis"] = diagnosis | |
| break | |
| return f"🔍 Diagnosis from image: {diagnosis}" | |
| # Function to display the dashboard | |
| def show_dashboard(): | |
| if not patients_db: | |
| return "No patient records available." | |
| return pd.DataFrame(patients_db) | |
| # Text-to-Image model interface | |
| def generate_image(prompt): | |
| # This assumes you're using a pre-trained model for text-to-image generation | |
| return gr.load("models/ZB-Tech/Text-to-Image").launch() | |
| # Gradio interface for patient registration | |
| patient_interface = gr.Interface( | |
| fn=register_patient, | |
| inputs=[ | |
| gr.Textbox(label="Patient Name", placeholder="Enter the patient's full name"), | |
| gr.Number(label="Age"), | |
| gr.Radio(label="Gender", choices=["Male", "Female", "Other"]) | |
| ], | |
| outputs="text", | |
| description="Register a new patient" | |
| ) | |
| # Gradio interface for report analysis (text input) | |
| report_interface = gr.Interface( | |
| fn=analyze_report, | |
| inputs=[ | |
| gr.Number(label="Patient ID"), | |
| gr.Textbox(label="Report Text", placeholder="Paste the text from your report here") | |
| ], | |
| outputs="text", | |
| description="Analyze blood, LFT, or other medical reports" | |
| ) | |
| # Gradio interface for PDF report analysis (PDF upload) | |
| pdf_report_interface = gr.Interface( | |
| fn=extract_pdf_report, | |
| inputs=gr.File(label="Upload PDF Report"), | |
| outputs="text", | |
| description="Extract and analyze text from PDF reports" | |
| ) | |
| # Gradio interface for X-ray/CT-scan image analysis | |
| image_interface = gr.Interface( | |
| fn=analyze_image, | |
| inputs=[ | |
| gr.Number(label="Patient ID"), | |
| gr.Image(type="filepath", label="Upload X-ray or CT-Scan Image") | |
| ], | |
| outputs="text", | |
| description="Analyze X-ray or CT-scan images for diagnosis" | |
| ) | |
| # Gradio interface for the dashboard | |
| dashboard_interface = gr.Interface( | |
| fn=show_dashboard, | |
| inputs=None, | |
| outputs="dataframe", | |
| description="View patient reports and history" | |
| ) | |
| # Gradio interface for text-to-image | |
| text_to_image_interface = gr.Interface( | |
| fn=generate_image, | |
| inputs=gr.Textbox(label="Enter a prompt to generate an image"), | |
| outputs="image", | |
| description="Generate images from text prompts" | |
| ) | |
| # Organize the layout using Blocks | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Medical Report and Image Analyzer + Text-to-Image Generator") | |
| choice = gr.Radio(label="Choose Functionality", choices=["Medical Reports", "Text-to-Image"], value="Medical Reports") | |
| with gr.Column(): | |
| with gr.TabItem("Patient Registration"): | |
| patient_interface.render() | |
| with gr.TabItem("Analyze Report (Text)"): | |
| report_interface.render() | |
| with gr.TabItem("Analyze Report (PDF)"): | |
| pdf_report_interface.render() | |
| with gr.TabItem("Analyze Image (X-ray/CT)"): | |
| image_interface.render() | |
| with gr.TabItem("Dashboard"): | |
| dashboard_interface.render() | |
| with gr.TabItem("Text-to-Image"): | |
| text_to_image_interface.render() | |
| demo.launch(share=True) | |