File size: 3,330 Bytes
d8e0712 6763be4 d8e0712 5c7cdbe 996bb04 5c7cdbe 6763be4 5c7cdbe 6eb737d 5c7cdbe 6763be4 6eb737d 6763be4 5c7cdbe 996bb04 6763be4 5c7cdbe 6763be4 6eb737d 996bb04 6eb737d 6763be4 6eb737d 6763be4 6eb737d d8e0712 6eb737d 5c7cdbe 6eb737d 996bb04 6763be4 6eb737d 996bb04 6eb737d 996bb04 6eb737d 996bb04 6eb737d 996bb04 6eb737d 996bb04 6763be4 6eb737d 5c7cdbe 6eb737d 996bb04 6eb737d 996bb04 d8e0712 |
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 |
import gradio as gr
import time
from src.pipeline import generate_report
# ------------------------------------------------------------------
# 1. Pre-load models
# ------------------------------------------------------------------
from src.tools_loader import get_tools
_ = get_tools()
# ------------------------------------------------------------------
# 2. Helper: streaming generator with progress
# ------------------------------------------------------------------
def process_upload(image_path: str):
"""
Streamed generator: yields loading states then final report.
Gradio shows spinner automatically during execution.
"""
if image_path is None:
yield "**Please upload a chest X-ray image to begin analysis.**"
return
start = time.time()
# Show loading state immediately
yield "**Analyzing X-ray image...**\n\nThis will take a few seconds..."
# Generate the actual report
report = generate_report(image_path)
elapsed = time.time() - start
# Return final formatted report
yield f"""### Radiology Report
{report}
---
*Report generated in {elapsed:.1f} seconds*"""
# ------------------------------------------------------------------
# 3. Gradio UI - Vertical Layout
# ------------------------------------------------------------------
with gr.Blocks(
theme=gr.themes.Soft(),
title="Multi-Agent Radiology Assistant",
css="""
.image-container { max-width: 600px; margin: 0 auto; }
.report-container { margin-top: 40px; padding-top: 20px; }
.generate-btn { margin: 30px auto; display: block; }
.progress-bar { z-index: 1000 !important; position: relative; }
.gradio-container .wrap { z-index: auto; }
"""
) as demo:
# Header
gr.Markdown(
"# Multi-Agent Radiology Assistant\n"
"Upload a chest X-ray image to receive an AI-powered radiology report"
)
# Image upload section (centered, top)
with gr.Column():
input_image = gr.Image(
type="filepath",
label="Upload Chest X-ray Image",
height=400,
elem_classes=["image-container"]
)
# Generate button (centered with more spacing)
generate_btn = gr.Button(
"Generate Report",
variant="primary",
size="lg",
elem_classes=["generate-btn"]
)
# Add some spacing to prevent overlap
gr.HTML("<div style='height: 20px;'></div>")
# Report output section (bottom)
with gr.Column(elem_classes=["report-container"]):
output_report = gr.Markdown(
value="**Ready to analyze**\n\nUpload an X-ray image above and click 'Generate Report' to begin.",
label="Analysis Results"
)
# Event handler with progress settings
generate_btn.click(
fn=process_upload,
inputs=input_image,
outputs=output_report,
show_progress="full", # Shows Gradio's built-in progress bar
concurrency_limit=1 # Prevent multiple simultaneous requests
)
# Footer with example hint
gr.Markdown(
"### Need an example?\n"
"Use any frontal chest X-ray PNG/JPG file and click **Generate Report**."
)
if __name__ == "__main__":
demo.launch() |