RadInSight

RadInSight, tıbbi radyoloji görüntülerinin analizi ve bu görüntüler üzerine çok turlu (multi-turn) karmaşık diyaloglar yürütülmesi amacıyla özel olarak eğitilmiş, 11 milyar parametreli bir Vizyon-Dil Modelidir (VLM).

Model, unsloth/Llama-3.2-11B-Vision-Instruct-bnb-4bit temel modeli üzerine, radyoloji odaklı RadImageNet-VQA veriseti kullanılarak iki aşamalı bir finetuning (ince ayar) stratejisiyle Unsloth kütüphanesi yardımıyla optimize edilmiştir.

🚀 Öne Çıkan Özellikler

  • İki Aşamalı Eğitim (Alignment + Instruct): Model önce görsel-metin hizalamasını öğrenmiş, ardından karmaşık tıbbi soru-cevap senaryolarında kararlı kalabilmesi için talimat (instruct) eğitimine tabi tutulmuştur.
  • Çok Turlu (Multi-turn) Diyalog Desteği: Radyoloji görselleri üzerinde sadece tek bir soruya cevap vermekle kalmaz; bağlamı kaybetmeden hastanın/doktorun takip eden sorularını da yanıtlayabilir.
  • Deterministik ve Güvenli Çıkarım: Medikal halüsinasyonları önlemek adına çıkarım parametreleri optimize edilmiş; çıktı akışındaki özel karakter sızıntıları (<|eot_id|>) tamamen engellenmiştir.

📊 Eğitim Detayları ve Loss Performansı

Eğitim süreci boyunca loss (kayıp) değerleri son derece kararlı ve keskin bir düşüş sergilemiştir:

  • 1. Aşama (Alignment): 4.82 seviyesinden başlayan loss değeri, görsel-metin eşleşmesinin hızla kavranmasıyla birlikte 0.35 seviyesine kadar gerilemiş ve başarılı bir plato yakalamıştır.
  • 2. Aşama (Instruct): Çok turlu diyalog yapısına geçildiğinde 2.81 seviyesinden başlayan loss, modelin karmaşık tıbbi senaryoları ezberlemeden (overfitting olmadan) sindirmesiyle birlikte 0.15 seviyesine kadar düşerek eğitimi kararlı bir şekilde tamamlamıştır.

🛠️ Kullanım Şekli (Inference)

Modeli kendi radyoloji projelerinizde çok turlu (multi-turn) bir sohbet döngüsüyle çalıştırmak ve en kararlı medikal sonuçları almak için aşağıdaki güncel kod bloğunu kullanabilirsiniz:

import torch
from unsloth import FastVisionModel
from transformers import TextStreamer
from PIL import Image

# 1. Modeli ve Tokenizer'ı Yükleme
model, tokenizer = FastVisionModel.from_pretrained(
    model_name = "ahmet1338/RadInSight",
    load_in_4bit = True,
)
FastVisionModel.for_inference(model)

# 2. Radyoloji Görüntüsünü Yükleme
image_path = "YOUR_PIL_IMAGE_PATH" # Test edeceğiniz medikal görselin yolu
image = Image.open(image_path).convert("RGB")

# 3. Sohbet Geçmişi (Context) Yönetimi
chat_history = []

print("RadInSight Canlı Test Modu Başlatıldı. Çıkmak için 'exit' yazın.\n" + "="*50)

while True:
    user_question = input("User: ")
    if user_question.lower() == 'exit':
        break
        
    # İlk adımda görseli ve soruyu birlikte, sonraki adımlarda sadece metni ekliyoruz (Bağlam Koruma)
    if len(chat_history) == 0:
        new_message = {
            "role": "user",
            "content": [
                {"type": "image"},
                {"type": "text", "text": user_question}
            ]
        }
    else:
        new_message = {
            "role": "user",
            "content": [
                {"type": "text", "text": user_question}
            ]
        }
    
    chat_history.append(new_message)
    
    # 4. Tokenize ve Girdi Hazırlığı
    input_text = tokenizer.apply_chat_template(chat_history, add_generation_prompt=True)
    inputs = tokenizer(
        [image],
        input_text,
        add_special_tokens=False,
        return_tensors="pt",
    ).to("cuda")
    
    # 5. Deterministik Üretim Ayarları (Halüsinasyonu Önleme)
    outputs = model.generate(
        **inputs,
        max_new_tokens=512,
        use_cache=True,
        do_sample=False,   # En kararlı tıbbi yanıtlar için Greedy Decoding aktiftir
        temperature=0.0,   # Rastgeleliği sıfırlıyoruz
    )
    
    # 6. Çıktı Temizleme ve Ekrana Basma
    input_length = inputs.input_ids.shape[1]
    response_ids = outputs[0][input_length:]
    response_text = tokenizer.decode(response_ids, skip_special_tokens=True)
    
    # Özel belirteç sızıntılarını (<|eot_id|>) temizleme filtresi
    stop_tokens = ["<|eot_id|>", "<|im_end|>", "<|end_of_text|>", "</s>"]
    for token in stop_tokens:
        response_text = response_text.replace(token, "")
    response_text = response_text.strip()
    
    print(f"Assistant: {response_text}")
    
    # Cevabı geçmişe ekle
    chat_history.append({"role": "assistant", "content": [{"type": "text", "text": response_text}]})
    print("\n" + "-"*30)
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for ahmetcangunay/RadInSight

Dataset used to train ahmetcangunay/RadInSight