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() | |