Spaces:
Sleeping
Sleeping
| 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() |