{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.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":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":10397721,"sourceType":"datasetVersion","datasetId":6442527}],"dockerImageVersionId":30822,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms, models\nimport pandas as pd\nimport numpy as np\nimport pydicom\nfrom PIL import Image\nimport torch.nn as nn\n\nclass SpineDataset(Dataset):\n    def __init__(self, dataframe, img_dir, transform=None):\n        self.df = dataframe\n        self.img_dir = img_dir\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        study_id = self.df.iloc[idx]['study_id']\n        study_dir = os.path.join(self.img_dir, str(study_id))\n        \n        # Dizin yoksa veya DICOM dosyası yoksa None döndür\n        if not os.path.isdir(study_dir):\n            return None\n        \n        # DICOM dosyasını arama\n        dicom_file_found = False\n        dicom_file_path = None\n\n        for root, dirs, files in os.walk(study_dir):\n            dicom_files = [f for f in files if f.lower().endswith('.dcm')]\n            if dicom_files:\n                dicom_file_found = True\n                dicom_file_path = os.path.join(root, dicom_files[0])\n                break\n        \n        if not dicom_file_found:\n            return None\n        \n        # DICOM dosyasını yükle\n        dicom_data = pydicom.dcmread(dicom_file_path)\n        image = dicom_data.pixel_array\n\n        # Gri tonlamalı resmi RGB'ye dönüştür\n        image = Image.fromarray(image).convert('RGB')\n        \n        # Etiketleri al\n        labels = self.df.iloc[idx, 1:].values\n        labels = labels.astype(np.float32)\n        \n        if self.transform:\n            image = self.transform(image)\n\n        return image, torch.tensor(labels, dtype=torch.float32)\n\n# Etiketleri sayısal verilere dönüştürme için bir fonksiyon\ndef label_to_numeric(label):\n    if label == 'Severe':\n        return 1\n    elif label == 'Moderate':\n        return 2\n    elif label == 'Mild':\n        return 3\n    else:\n        return 0  # 'Normal' gibi bir değer\n\n# Test Verisini Yükleme\ntest_labels = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv')\ntest_labels['study_id'] = test_labels['study_id'].astype(str)\n\n# Etiketleri sayıya dönüştürme\ntest_labels.iloc[:, 1:] = test_labels.iloc[:, 1:].applymap(label_to_numeric)\n\n# DICOM Veri Seti\nimg_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images'\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n])\n\n# Dataset ve DataLoader\ndataset = SpineDataset(dataframe=test_labels, img_dir=img_dir, transform=transform)\ntest_loader = DataLoader(dataset, batch_size=32, shuffle=False, collate_fn=lambda x: list(filter(None, x)))  # Boş batch'leri atla\n\n# Modeli Yükleyin\nmodel_path = '/kaggle/input/2222222/all_epoch_models-2.pth'\nmodel = models.resnet18(weights=None)  # Pretrained kullanmıyoruz\nmodel.fc = nn.Linear(model.fc.in_features, len(test_labels.columns[1:]))  # Test verisi için etiket sayısını ayarlayın\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel = model.to(device)\n\n# Modeli yükleyin (CPU'ya yükleme)\ntry:\n    checkpoint = torch.load(model_path, map_location=torch.device('cpu'), weights_only=True)  # weights_only=True kullanıldı\n    model.load_state_dict(checkpoint, strict=False)\n    print(\"Model başarıyla yüklendi.\")\nexcept Exception as e:\n    print(f\"Model yüklenirken bir hata oluştu: {e}\")\n\nmodel.eval()\n\n# Tahminler için boş bir liste oluşturun\npredictions = []\n\n# Test verisinde tahmin yapma\nwith torch.no_grad():\n    for batch in test_loader:\n        if not batch:\n            continue  # Eğer batch boşsa, bir sonraki batch'e geç\n\n        images, _ = zip(*batch)  # Etiketlere gerek yok\n        images = torch.stack(images).to(device)\n\n        outputs = model(images)\n        predictions.append(outputs.cpu().numpy())\n\n# Tahminleri birleştirme\npredictions = np.concatenate(predictions, axis=0)\n\n# Sonuçları DataFrame'e dönüştürme\nsubmission = pd.DataFrame(predictions, columns=test_labels.columns[1:])\nsubmission['study_id'] = test_labels['study_id']\n\n# Sonuçları 'Label' ve 'Count' başlıklarıyla uzun formata dönüştürme\nsubmission_long = pd.melt(submission, id_vars=['study_id'], var_name='Label', value_name='Count')\n\n# Sonuçları CSV'ye kaydetme\nsubmission_file = '/kaggle/working/submission.csv'\nsubmission_long.to_csv(submission_file, index=False)\n\nprint(f\"Submission dosyası kaydedildi: {submission_file}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T20:08:52.560799Z","iopub.execute_input":"2025-01-07T20:08:52.561297Z","iopub.status.idle":"2025-01-07T20:08:53.159887Z","shell.execute_reply.started":"2025-01-07T20:08:52.561263Z","shell.execute_reply":"2025-01-07T20:08:53.158944Z"}},"outputs":[],"execution_count":null}]}