import urllib.request import fitz import re import numpy as np import openai import gradio as gr import os from sklearn.neighbors import NearestNeighbors title = 'MediDiagnostix AI' description = """MediDiagnostix AI allows you to upload medical reports for analysis. Just click a picture of your medical report or upload a pdf report, it will extract, analyze and provide you the medical interpretations of the report, potential diagnoses, and recommended follow-up actions. Furthermore, you can save diagnosis for future reference""" import pytesseract # Assuming Tesseract OCR is used for image processing def analyze_reports(files, num_reports): """ Process and analyze the uploaded reports. Args: files (list): List of uploaded files (PDFs and images). num_reports (int): Number of reports to analyze. Returns: str: Analysis results in a formatted text. """ # Check if the number of files matches num_reports if len(files) != num_reports: return "Number of uploaded files does not match the specified number of reports." # Initialize a list to hold text from each report report_texts = [] for file in files: # Check file type and process accordingly if file.name.endswith('.pdf'): # Process PDF file pdf_text = pdf_to_text(file.name) report_texts.extend(pdf_text) else: # Process Image file image_text = image_to_text(file) report_texts.append(image_text) # Combine texts from all reports combined_text = ' '.join(report_texts) # Analyze the combined text (Placeholder for actual analysis logic) analysis_results = analyze_text(combined_text) # This function needs to be implemented return analysis_results def image_to_text(image_file): """ Extract text from an image file using OCR. Args: image_file (file): An image file. Returns: str: Extracted text from the image. """ try: # Read the image file image = Image.open(image_file) # Extract text using OCR extracted_text = pytesseract.image_to_string(image) return extracted_text except Exception as e: return f"Error in text extraction from image: {e}" def analyze_text(text): """ Analyze the extracted text and generate insights. Args: text (str): Combined text from all reports. Returns: str: Analysis results based on the text. """ # Placeholder for text analysis logic # This could involve calling an AI model, processing the text, etc. # Returning a dummy response for demonstration purposes return "Analysis results based on the processed text." with gr.Blocks(css="""#chatbot { font-size: 14px; min-height: 1200; }""") as demo: gr.Markdown(f'

{title}

') gr.Markdown(description) with gr.Row(): with gr.Group(): gr.Markdown(f'

Enter the number of reports to analyze

') num_reports = gr.Number(label='Number of Reports', value=1) with gr.Accordion("Upload Reports"): file_upload = gr.File(label='Upload Reports (PDF/Image)', file_types=['.pdf', '.jpg', '.png'], interactive=True, type="file", allow_multiple=True) analyze_button = gr.Button(value='Analyze Reports') with gr.Group(): analysis_results = gr.Textbox(label='Analysis Results', placeholder="Results will appear here after analysis", lines=20) analyze_button.click( func=analyze_reports, # This function needs to be defined to handle the report analysis. inputs=[file_upload, num_reports], outputs=[analysis_results], ) demo.launch()