medai_server / app.py
mnni43353's picture
Update app.py
630ca2a verified
raw
history blame
2.88 kB
import gradio as gr
import numpy as np
from PIL import Image
import torch
import io
import json
import pydicom
import cv2
import base64
from models import load_vision_model, get_image_transform, load_segmentation_model, load_text_models, load_translation_model, DEVICE
from interpret import ensure_tensor, compute_gradcam, overlay_cam_on_original, mc_dropout_predictions
from text_pipeline import summarize_report, translate_en_to_ar
# تحميل كل النماذج مرة واحدة
vision_model, seg_model, text_tok, text_model, mt_tok, mt_model, transform = (
load_vision_model(num_classes=14),
load_segmentation_model(),
*load_text_models(),
*load_translation_model(),
get_image_transform(),
)
def analyze_image(file):
"""
الدالة الرئيسية لتحليل الأشعة
"""
filename = file.name.lower()
if filename.endswith(".dcm"):
ds = pydicom.dcmread(io.BytesIO(file.read()))
img = ds.pixel_array
img_norm = (img - img.min()) / (img.max() - img.min() + 1e-8)
display_img = (np.stack([img_norm]*3, axis=-1) * 255).astype(np.uint8)
else:
image = Image.open(file).convert("RGB")
display_img = np.array(image)
# تجهيز الصورة للنموذج
input_tensor = ensure_tensor(display_img, transform).to(DEVICE)
# التنبؤ
mean_probs, std_probs = mc_dropout_predictions(vision_model, input_tensor, n_samples=8)
# إنشاء تقرير مختصر
top_idx = np.argsort(mean_probs)[::-1][:5]
findings = []
for idx in top_idx:
p = mean_probs[idx]
u = std_probs[idx]
findings.append(f"Finding_{idx}: probability={p:.3f}, uncertainty={u:.3f}")
auto_report_en = "Model findings:\n" + "\n".join(findings)
auto_report_ar = translate_en_to_ar(auto_report_en, mt_tok, mt_model)
# إعداد JSON للإرسال لتطبيق Android
result = {
"filename": filename,
"vision_probs": mean_probs.tolist(),
"vision_uncertainty": std_probs.tolist(),
"auto_report_en": auto_report_en,
"auto_report_ar": auto_report_ar
}
# تحويل الصورة مع GradCAM لعرض بصري
cam_mask = compute_gradcam(vision_model, input_tensor)
overlay = overlay_cam_on_original(display_img.astype(float)/255.0, cam_mask)
return overlay, json.dumps(result, ensure_ascii=False, indent=2)
# واجهة Gradio
demo = gr.Interface(
fn=analyze_image,
inputs=gr.Image(type="file", label="حمّل صورة الأشعة (JPG/PNG/DICOM)"),
outputs=[
gr.Image(label="Grad-CAM Overlay"),
gr.Textbox(label="نتائج JSON", lines=15)
],
title="MedAI — قارئ الأشعة الذكي",
description="يرجى رفع صورة أشعة لتحليلها وإنتاج تقرير تلقائي (تجريبي)."
)
demo.launch()