{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":99552,"databundleVersionId":13851420,"sourceType":"competition"}],"dockerImageVersionId":31259,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport glob\nimport pydicom\nimport numpy as np\nimport pandas as pd\nimport cv2\nfrom tqdm import tqdm  # İlerleme çubuğu için\n\n# --- AYARLAR ---\nDATA_DIR = \"/kaggle/input/rsna-intracranial-aneurysm-detection\"                 # Kaggle'da \"../input/rsna-...\" olabilir, kontrol edin\nSAVE_DIR = \"/kaggle/working/processed_data\"   # İşlenmiş verilerin kaydedileceği yer\nIMG_SIZE = 128                  # Hedef resim boyutu (128x128)\nDEPTH_SIZE = 64                 # Hedef derinlik (64 kesit)\n\n# Klasörü oluştur\nos.makedirs(SAVE_DIR, exist_ok=True)\n\n# --- FONKSİYON: TEK BİR HASTAYI İŞLE ---\ndef process_scan(series_id):\n    series_dir = os.path.join(DATA_DIR, \"series\", series_id)\n    dicom_files = glob.glob(os.path.join(series_dir, \"*.dcm\"))\n    \n    # Dosya yoksa boş dön\n    if not dicom_files:\n        return None\n\n    slices = []\n    # Dosyaları oku\n    for f in dicom_files:\n        try:\n            ds = pydicom.dcmread(f)\n            # Kritik etiketler var mı kontrol et\n            if hasattr(ds, \"pixel_array\") and hasattr(ds, \"ImagePositionPatient\"):\n                slices.append(ds)\n        except:\n            continue\n            \n    # Eğer geçerli slice yoksa None dön\n    if not slices:\n        return None\n\n    # Z konumuna göre sırala (ImagePositionPatient[2])\n    try:\n        slices.sort(key=lambda x: float(x.ImagePositionPatient[2]))\n    except:\n        return None\n\n    # 3D Hacim Oluşturma\n    volume = []\n    for s in slices:\n        try:\n            img = s.pixel_array\n            # Resim boyutlandırma (OpenCV)\n            img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))\n            volume.append(img)\n        except:\n            continue\n            \n    volume = np.array(volume)\n    \n    # Hacim boşsa çık\n    if volume.shape[0] == 0:\n        return None\n\n    # --- DERİNLİK SABİTLEME (DEPTH RESAMPLING) ---\n    # Her hastada farklı sayıda kesit vardır (örn: 30, 100, 200).\n    # Hepsini DEPTH_SIZE (64) sayısına sabitliyoruz.\n    current_depth = volume.shape[0]\n    if current_depth != DEPTH_SIZE:\n        indices = np.linspace(0, current_depth - 1, DEPTH_SIZE).astype(int)\n        volume = volume[indices]\n\n    # --- NORMALİZASYON ---\n    # Piksel değerlerini 0-1 arasına çek\n    v_min = np.min(volume)\n    v_max = np.max(volume)\n    if v_max - v_min > 0:\n        volume = (volume - v_min) / (v_max - v_min)\n    else:\n        volume = np.zeros_like(volume) # Hepsi aynı renkse siyah yap\n\n    # Veriyi float16'ya çevir (Disk alanından %50 tasarruf sağlar)\n    return volume.astype(np.float16)\n\n# --- ANA DÖNGÜ ---\ndef run_preprocessing():\n    # Train dosyasını oku\n    df = pd.read_csv(os.path.join(DATA_DIR, 'train.csv'))\n    \n    # Benzersiz Seri ID'lerini al\n    series_ids = df['SeriesInstanceUID'].unique()\n    \n    print(f\"Toplam {len(series_ids)} seri işlenecek...\")\n    \n    error_count = 0\n    success_count = 0\n    \n    # TQDM ile ilerleme çubuğu göstererek döngüye gir\n    for series_uid in tqdm(series_ids):\n        save_path = os.path.join(SAVE_DIR, f\"{series_uid}.npy\")\n        \n        # Eğer daha önce işlendiyse tekrar yapma (Resume özelliği)\n        if os.path.exists(save_path):\n            success_count += 1\n            continue\n            \n        # İşlemi yap\n        volume = process_scan(series_uid)\n        \n        if volume is not None:\n            np.save(save_path, volume)\n            success_count += 1\n        else:\n            error_count += 1\n            \n    print(f\"\\nİşlem Tamamlandı!\")\n    print(f\"Başarılı: {success_count}\")\n    print(f\"Hatalı/Atlanan: {error_count}\")\n    print(f\"Dosyalar '{SAVE_DIR}' klasörüne kaydedildi.\")\n\n# Kodu Çalıştır\nif __name__ == \"__main__\":\n    run_preprocessing()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-01T07:42:03.999603Z","iopub.execute_input":"2026-02-01T07:42:04.000076Z","execution_failed":"2026-02-01T07:44:27.508Z"}},"outputs":[],"execution_count":null}]}