Spaces:
Sleeping
Sleeping
import gradio as gr | |
from transformers import pipeline | |
from PIL import Image | |
import json | |
from reportlab.lib.pagesizes import letter | |
from reportlab.pdfgen import canvas | |
import easyocr | |
import re | |
# Initialize EasyOCR reader | |
reader = easyocr.Reader(["en"], gpu=False) | |
# Load BioGPT model for recommendations | |
bio_gpt = pipeline("text-generation", model="microsoft/BioGPT") | |
# Load reference ranges from dataset.json | |
def load_reference_ranges(file_path="dataset.json"): | |
with open(file_path, "r") as file: | |
reference_ranges = json.load(file) | |
return reference_ranges | |
reference_ranges = load_reference_ranges() | |
# Parameter name mapping | |
parameter_mapping = { | |
"hgb": "hemoglobin", | |
"hemoglobin": "hemoglobin", | |
"rbc": "rbc", | |
"wbc": "wbc", | |
"plt": "platelet", | |
"platelets": "platelet", | |
"hematocrit": "hematocrit", | |
"mcv": "mcv", | |
"mch": "mch", | |
"mchc": "mchc", | |
# Add more mappings as needed | |
} | |
# Extract text from uploaded image using EasyOCR | |
def extract_text_from_image(image_path): | |
try: | |
# Read text from image | |
result = reader.readtext(image_path, detail=0) # Extract only the text | |
extracted_text = " ".join(result) | |
print("Extracted Text:", extracted_text) # Debugging | |
return extracted_text | |
except Exception as e: | |
return f"Error extracting text: {e}" | |
# Extract value using regex | |
def extract_value(text, param): | |
match = re.search(rf"{param}[:\s]*([\d.]+)", text, re.IGNORECASE) | |
if match: | |
return float(match.group(1)) | |
return None | |
# Analyze extracted text and compare against reference ranges | |
def analyze_blood_report(text): | |
abnormalities = [] | |
analysis = "Blood Test Analysis Results:\n\n" | |
for key, standard_param in parameter_mapping.items(): | |
if key in text.lower(): | |
ranges = reference_ranges[standard_param] | |
value = extract_value(text, key) | |
if value is not None: | |
if value < ranges["low"]: | |
abnormalities.append(f"{standard_param.capitalize()} is LOW ({value} {ranges['unit']}).") | |
elif value > ranges["high"]: | |
abnormalities.append(f"{standard_param.capitalize()} is HIGH ({value} {ranges['unit']}).") | |
else: | |
analysis += f"{standard_param.capitalize()} is NORMAL ({value} {ranges['unit']}).\n" | |
else: | |
analysis += f"{standard_param.capitalize()} could not be analyzed.\n" | |
if abnormalities: | |
analysis += "\nAbnormalities Detected:\n" + "\n".join(abnormalities) + "\n" | |
else: | |
analysis += "\nNo abnormalities detected.\n" | |
return analysis, abnormalities | |
# Generate recommendations using BioGPT | |
def get_recommendations(abnormalities): | |
if not abnormalities: | |
return "No recommendations needed." | |
query = " ".join(abnormalities) + " Provide medical recommendations." | |
recommendations = bio_gpt(query, max_length=100, num_return_sequences=1)[0]["generated_text"] | |
return recommendations | |
# Create a PDF report | |
def create_pdf_report(content, output_path="blood_test_report.pdf"): | |
c = canvas.Canvas(output_path, pagesize=letter) | |
c.drawString(100, 750, "Blood Test Report") | |
c.drawString(100, 730, "-----------------") | |
y_position = 700 | |
for line in content.split("\n"): | |
c.drawString(100, y_position, line) | |
y_position -= 20 | |
c.save() | |
return output_path | |
# Main function to process blood test image | |
def process_blood_test(image_path): | |
# Step 1: Extract text | |
extracted_text = extract_text_from_image(image_path) | |
if "Error" in extracted_text: | |
return extracted_text, None | |
# Step 2: Analyze extracted text | |
analysis, abnormalities = analyze_blood_report(extracted_text) | |
# Step 3: Generate recommendations | |
recommendations = get_recommendations(abnormalities) | |
# Step 4: Combine results and create PDF | |
full_report = analysis + "\nRecommendations:\n" + recommendations | |
pdf_path = create_pdf_report(full_report) | |
return full_report, pdf_path | |
# Gradio Interface | |
interface = gr.Interface( | |
fn=process_blood_test, | |
inputs=gr.Image(type="filepath", label="Upload Blood Test Report Image (PNG, JPG, JPEG)"), | |
outputs=[ | |
gr.Textbox(label="Analysis and Recommendations"), | |
gr.File(label="Download PDF Report"), | |
], | |
title="AI Blood Test Analyzer", | |
description=( | |
"Upload a blood test report image (PNG, JPG, JPEG), and the app will analyze the values, flag abnormalities, " | |
"and provide recommendations using BioGPT. You can also download a PDF report." | |
), | |
theme="compact", | |
css=""" | |
body { | |
font-family: 'Arial', sans-serif; | |
background-color: #f9f9f9; | |
} | |
.gradio-container { | |
color: #333; | |
max-width: 800px; | |
margin: 0 auto; | |
} | |
.gradio-container .label { | |
font-weight: bold; | |
font-size: 18px; | |
} | |
.gradio-container .output { | |
background-color: #eef; | |
padding: 10px; | |
border-radius: 10px; | |
} | |
""", | |
allow_flagging="never" | |
) | |
if __name__ == "__main__": | |
interface.launch() | |