| --- |
| language: en |
| license: mit |
| tags: |
| - medical-imaging |
| - brain-tumor |
| - segmentation |
| - vlm |
| - glioblastoma |
| - ucsf-pdgm |
| datasets: |
| - UCSF-PDGM-v5 |
| metrics: |
| - bertscore |
| - rouge |
| - bleu |
| --- |
| |
| # RCMTUNetV4-VLM — Brain Tumor Segmentation & Report Generation |
|
|
| ## Description |
| Multimodal pipeline for brain tumor segmentation and automated neuro-oncology |
| report generation. Architecture: **RCMTUNetV4** segmentation + **RAG** (40 WHO CNS 2021 chunks, FAISS) + **LLaVA-Med** report generation. |
|
|
| ## 📂 Fichiers dans ce dépôt |
|
|
| | Fichier | Description | |
| |---|---| |
| | `rcmt_unet_v4_final.pth` | Poids segmentation RCMTUNetV4 | |
| | `pipeline.py` | **Architecture complète** (toutes classes) | |
| | `rag_who_chunks.json` | **40 chunks RAG** WHO CNS 2021 | |
| | `rag_faiss.index` | **Index FAISS** pré-calculé | |
| | `rag_embeddings.npy` | Embeddings numpy (backup) | |
| | `prompts.json` | **Tous les prompts** v3.2 + profils ACP | |
| | `config.json` | Configuration et métriques | |
| | `evaluation_metrics.json` | Résultats détaillés | |
|
|
| ## Performance (n=50, seed=42, UCSF-PDGM) |
|
|
| | Métrique | Score | vs Baseline | |
| |---|---|---| |
| | BERTScore-F | 0.814 | > MediVLM (0.616) ✅ | |
| | TBFact | 0.922 | > BTReport (0.353) ✅ | |
| | RadGraph-F1 | 0.871 | > AutoRG (0.380) ✅ | |
| | Anti-hallucination | 1.000 | UNIQUE ✅ | |
| | Cross-validation | 1.000 | UNIQUE ✅ | |
| | Global score | 0.852 | Classe A ✅ | |
|
|
| ## 🚀 Usage — Chargement complet en 10 lignes |
|
|
| ```python |
| import torch, json, faiss, numpy as np |
| from huggingface_hub import hf_hub_download, snapshot_download |
| from sentence_transformers import SentenceTransformer |
| |
| # 1. Télécharger tous les fichiers |
| local_dir = snapshot_download(repo_id="mayoula/RAMTUNET_VLM") |
| |
| # 2. Charger l'architecture |
| import sys; sys.path.insert(0, local_dir) |
| from pipeline import RCMTUNetV4 |
| |
| # 3. Charger les poids segmentation |
| seg_model = RCMTUNetV4(in_channels=4, out_channels=4, features=(24,48,96,192)) |
| seg_model.load_state_dict(torch.load(f"{local_dir}/rcmt_unet_v4_final.pth", map_location="cpu")) |
| seg_model.eval() |
| |
| # 4. Charger le RAG |
| with open(f"{local_dir}/rag_who_chunks.json") as f: |
| rag_data = json.load(f) |
| WHO_CHUNKS = rag_data["chunks"] |
| faiss_idx = faiss.read_index(f"{local_dir}/rag_faiss.index") |
| embedder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2") |
| |
| # 5. Charger les prompts |
| with open(f"{local_dir}/prompts.json") as f: |
| prompts = json.load(f) |
| |
| # 6. Charger le VLM (LLaVA-Med — non fine-tuné, rechargé depuis HF) |
| from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration, BitsAndBytesConfig |
| bnb = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16, |
| bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True) |
| vlm_processor = LlavaNextProcessor.from_pretrained("microsoft/llava-med-v1.5-mistral-7b") |
| vlm_model = LlavaNextForConditionalGeneration.from_pretrained( |
| "microsoft/llava-med-v1.5-mistral-7b", quantization_config=bnb, device_map="auto") |
| |
| # 7. Fonction RAG retrieve |
| def rag_retrieve(query, top_k=4): |
| emb = embedder.encode([query], normalize_embeddings=True) |
| D, I = faiss_idx.search(emb.astype(np.float32), top_k) |
| refs = [f"[REF-{r+1}] {WHO_CHUNKS[i]}" for r, (d, i) in enumerate(zip(D[0], I[0])) if d > 0.10] |
| return "\n".join(refs) if refs else "Standard glioma protocol (WHO CNS 2021)." |
| ``` |
|
|
| ## Dataset |
| Trained and evaluated on [UCSF-PDGM](https://wiki.cancerimagingarchive.net/pages/viewpage.action?pageId=119705830) (n=50 patients, seed=42). |
|
|