|
import gradio as gr |
|
import json |
|
from pathlib import Path |
|
|
|
def load_json(file_path): |
|
with open(file_path, 'r') as file: |
|
return json.load(file) |
|
|
|
def display_data(index, data): |
|
item = data[index] |
|
note = item.get('Note', 'No note available') |
|
summary = item.get('Summary', {}) |
|
mcqs = item.get('MCQS', {}) |
|
image_path = item.get('image', '') |
|
|
|
summary_html = "<h3>Summary</h3>" |
|
if 'chest_xray_summary' in summary: |
|
for topic in summary['chest_xray_summary']: |
|
summary_html += f"<p><strong>{topic['topic']}:</strong> {topic['description']}</p>" |
|
else: |
|
summary_html += "<p>No summary available</p>" |
|
|
|
mcqs_html = "<h3>MCQs</h3>" |
|
if isinstance(mcqs, dict) and 'questions' in mcqs: |
|
for i, q in enumerate(mcqs['questions'], 1): |
|
mcqs_html += f"<p><strong>Q{i}: {q['question']}</strong></p>" |
|
mcqs_html += "<ul>" |
|
for option in q['options']: |
|
mcqs_html += f"<li>{option}</li>" |
|
mcqs_html += "</ul>" |
|
mcqs_html += f"<p>Correct Answer: {q['correct_answer']}</p>" |
|
if 'location_in_text' in q: |
|
mcqs_html += f"<p><em>Location in text: {q['location_in_text']}</em></p>" |
|
mcqs_html += "<hr>" |
|
elif isinstance(mcqs, list): |
|
for i, q in enumerate(mcqs, 1): |
|
mcqs_html += f"<p><strong>Q{i}: {q['question']}</strong></p>" |
|
mcqs_html += "<ul>" |
|
for option in q['options']: |
|
mcqs_html += f"<li>{option}</li>" |
|
mcqs_html += "</ul>" |
|
mcqs_html += f"<p>Correct Answer: {q['correct_answer']}</p>" |
|
if 'location_in_text' in q: |
|
mcqs_html += f"<p><em>Location in text: {q['location_in_text']}</em></p>" |
|
mcqs_html += "<hr>" |
|
else: |
|
mcqs_html += "<p>No MCQs available for this item.</p>" |
|
|
|
return note, summary_html, mcqs_html, image_path, f"Item {index + 1} of {len(data)}" |
|
|
|
def next_item(index, data): |
|
return min(index + 1, len(data) - 1) |
|
|
|
def prev_item(index, data): |
|
return max(index - 1, 0) |
|
|
|
def create_app(json_path): |
|
data = load_json(json_path) |
|
|
|
with gr.Blocks() as app: |
|
gr.Markdown("# Chest X-Ray Analysis Viewer") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
image = gr.Image(label="X-Ray Image") |
|
with gr.Column(scale=2): |
|
note = gr.Textbox(label="Note", lines=4) |
|
summary = gr.HTML(label="Summary") |
|
mcqs = gr.HTML(label="MCQs") |
|
|
|
index = gr.State(0) |
|
item_count = gr.Textbox(label="Item Count") |
|
|
|
with gr.Row(): |
|
prev_btn = gr.Button("Previous") |
|
next_btn = gr.Button("Next") |
|
|
|
def update_display(index): |
|
return display_data(index, data) |
|
|
|
next_btn.click( |
|
next_item, |
|
inputs=[index, gr.State(data)], |
|
outputs=[index] |
|
).then( |
|
update_display, |
|
inputs=[index], |
|
outputs=[note, summary, mcqs, image, item_count] |
|
) |
|
|
|
prev_btn.click( |
|
prev_item, |
|
inputs=[index, gr.State(data)], |
|
outputs=[index] |
|
).then( |
|
update_display, |
|
inputs=[index], |
|
outputs=[note, summary, mcqs, image, item_count] |
|
) |
|
|
|
app.load( |
|
update_display, |
|
inputs=[index], |
|
outputs=[note, summary, mcqs, image, item_count] |
|
) |
|
|
|
return app |
|
|
|
|
|
json_path = Path("mimic_data.json") |
|
app = create_app(json_path) |
|
app.launch() |