{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":216553369,"sourceType":"kernelVersion"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":153.257695,"end_time":"2025-01-08T17:24:55.181733","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2025-01-08T17:22:21.924038","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"20cab568","cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport pydicom\nimport yaml\nimport cv2\nfrom sklearn.model_selection import train_test_split","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2025-01-08T17:22:24.113382Z","iopub.status.busy":"2025-01-08T17:22:24.113082Z","iopub.status.idle":"2025-01-08T17:22:26.636460Z","shell.execute_reply":"2025-01-08T17:22:26.635726Z"},"papermill":{"duration":2.529095,"end_time":"2025-01-08T17:22:26.638039","exception":false,"start_time":"2025-01-08T17:22:24.108944","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"a3b191c6","cell_type":"code","source":"#base_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/'\noutput_dir = \"/kaggle/working/\"","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:26.644154Z","iopub.status.busy":"2025-01-08T17:22:26.643785Z","iopub.status.idle":"2025-01-08T17:22:26.646754Z","shell.execute_reply":"2025-01-08T17:22:26.646201Z"},"papermill":{"duration":0.007175,"end_time":"2025-01-08T17:22:26.648011","exception":false,"start_time":"2025-01-08T17:22:26.640836","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"05630c97","cell_type":"code","source":"# Dosya yollarını hazırla\nbase_dir=\"/kaggle/working\"\ndef create_dataset_structure(condition_groups, base_dir):\n    for group_name, conditions in condition_groups.items():\n        group_dir = os.path.join(base_dir, group_name.replace(' ', '_'))\n        labels_dir = os.path.join(group_dir, 'labels')\n        train_labels_dir = os.path.join(labels_dir, 'train')\n        val_labels_dir = os.path.join(labels_dir, 'val')\n        images_dir = os.path.join(group_dir, 'images')\n        train_images_dir = os.path.join(images_dir, 'train')\n        val_images_dir = os.path.join(images_dir, 'val')\n\n        os.makedirs(train_labels_dir, exist_ok=True)\n        os.makedirs(val_labels_dir, exist_ok=True)\n        os.makedirs(train_images_dir, exist_ok=True)\n        os.makedirs(val_images_dir, exist_ok=True)\n        # Oluşturulan yolları yazdır\n        print(f\"Klasörler oluşturuldu:\\n\"\n              f\"Train Images: {train_images_dir}\\n\"\n              f\"Validation Images: {val_images_dir}\\n\"\n              f\"Train Labels: {train_labels_dir}\\n\"\n              f\"Validation Labels: {val_labels_dir}\\n\")\n        print(train_images_dir, train_labels_dir, val_labels_dir, val_images_dir)","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:26.653525Z","iopub.status.busy":"2025-01-08T17:22:26.653283Z","iopub.status.idle":"2025-01-08T17:22:26.658554Z","shell.execute_reply":"2025-01-08T17:22:26.657774Z"},"papermill":{"duration":0.009074,"end_time":"2025-01-08T17:22:26.659685","exception":false,"start_time":"2025-01-08T17:22:26.650611","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"3699ffd1","cell_type":"code","source":"condition_groups = {\n    'Spinal Canal Stenosis': ['Spinal Canal Stenosis'],\n    'Neural Foraminal Narrowing': ['Right Neural Foraminal Narrowing', 'Left Neural Foraminal Narrowing'],\n    'Subarticular Stenosis': ['Right Subarticular Stenosis', 'Left Subarticular Stenosis']\n}\n\ncreate_dataset_structure(condition_groups, base_dir)\n\n###\n\n#Veri setini severe'e indirgeme\ndf = pd.read_csv('/kaggle/input/png-for-cagla/clean_data.csv')\n\nnormal_mild = df[df['severity'] == 'normal_mild']\nmoderate = df[df['severity'] == 'moderate']\nsevere = df[df['severity'] == 'severe']\n\nsevere_count = len(severe)\n#print(severe_count)\n\nnormal_mild_sample = normal_mild.sample(n=severe_count, random_state=42)\nmoderate_sample = moderate.sample(n=severe_count, random_state=42)\n\nbalanced_df = pd.concat([normal_mild_sample, moderate_sample, severe])\n\nbalanced_df.to_csv('/kaggle/working/balanced_veri_seti.csv', index=False)","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:26.664927Z","iopub.status.busy":"2025-01-08T17:22:26.664698Z","iopub.status.idle":"2025-01-08T17:22:27.076160Z","shell.execute_reply":"2025-01-08T17:22:27.075409Z"},"papermill":{"duration":0.415675,"end_time":"2025-01-08T17:22:27.077675","exception":false,"start_time":"2025-01-08T17:22:26.662000","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"57db20ea","cell_type":"code","source":"# Gruplara ayır\nfor group_name, conditions in condition_groups.items():\n    # Filter rows based on condition\n    filtered_df = balanced_df[balanced_df['condition'].isin(conditions)]\n    # Split the data into train and validation sets \n    train_df, val_df = train_test_split(filtered_df, test_size=0.2, random_state=42)\n    # Save to new CSV file\n    group_name_save=group_name.replace(' ','_')\n    train_file_path = os.path.join(output_dir, f'{group_name_save}_train.csv')\n    val_file_path = os.path.join(output_dir, f'{group_name_save}_val.csv')\n    train_df.to_csv(train_file_path, index=False)\n    val_df.to_csv(val_file_path, index=False)\n    \n    #train_df.to_csv(f'{group_name_save}_train.csv', index=False) \n    #val_df.to_csv(f'{group_name_save}_val.csv', index=False)\n    \n    print(group_name_save)","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:27.083866Z","iopub.status.busy":"2025-01-08T17:22:27.083650Z","iopub.status.idle":"2025-01-08T17:22:27.192827Z","shell.execute_reply":"2025-01-08T17:22:27.191783Z"},"papermill":{"duration":0.113813,"end_time":"2025-01-08T17:22:27.194307","exception":false,"start_time":"2025-01-08T17:22:27.080494","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"09bc041f","cell_type":"code","source":"# Görüntüleri istenen formata dönüştür, pathler image_path'de\ndef dicom_to_png(df, is_train, target_size=(224,224)):\n    \n    images_list = []\n    height_list = []\n    width_list = []\n\n    for index, row in df.iterrows():\n        \n        image_path = row['image_path']\n        condition = row['condition']\n\n        group_name = None \n        for key, values in condition_groups.items(): \n            if condition in values: \n                group_name = key.replace(' ', '_') \n                break \n        if group_name is None: \n                print(f\"Condition '{condition}' için group_name bulunamadı.\") \n                continue\n        \n        group_dir = os.path.join(base_dir, group_name)\n        added_dir = os.path.join(group_dir, 'images')\n\n        if is_train:\n            output_dir = os.path.join(added_dir, 'train')\n        else:\n            output_dir = os.path.join(added_dir, 'val')\n\n        # Grup dizinleri oluşturma\n        group_dir = os.path.join(base_dir, group_name)\n        added_dir = os.path.join(group_dir, 'images')\n\n        if is_train:\n            output_dir = os.path.join(added_dir, 'train')\n        else:\n            output_dir = os.path.join(added_dir, 'val')\n\n        # DICOM dosyasını yükle\n        dicom_file = pydicom.dcmread(image_path)\n        \n        # Pixel array'i al\n        image_array = dicom_file.pixel_array\n\n        # RescaleIntercept ve RescaleSlope uygulama\n        intercept = getattr(dicom_file, \"RescaleIntercept\", 0)\n        slope = getattr(dicom_file, \"RescaleSlope\", 1)\n        image_array = image_array * slope + intercept\n        \n        # Görüntü boyutlarını kaydet\n        height, width = image_array.shape\n        height_list.append(height)\n        width_list.append(width)\n\n        # Normalize et (0-255 aralığına)\n        normalized_image = cv2.normalize(image_array, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)\n\n        # Görüntüyü hedef boyutlara resize et\n        resized_image = cv2.resize(normalized_image, target_size) \n        images_list.append(resized_image)\n    \n        # PNG olarak kaydet\n        png_path = os.path.join(output_dir, f'image_{index}.png') \n        os.makedirs(output_dir, exist_ok=True)  # Çıkış klasörünü oluştur\n        success = cv2.imwrite(png_path, resized_image)\n        if success:\n            print(f\"Saved {image_path} to {png_path}\")\n        else:\n            print(f\"Failed to save {image_path} to {png_path}\")\n        \n    print(f\"All images in group '{group_name}' are saved.\")\n\n    return height_list, width_list","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:27.200551Z","iopub.status.busy":"2025-01-08T17:22:27.200283Z","iopub.status.idle":"2025-01-08T17:22:27.207433Z","shell.execute_reply":"2025-01-08T17:22:27.206613Z"},"papermill":{"duration":0.011917,"end_time":"2025-01-08T17:22:27.208986","exception":false,"start_time":"2025-01-08T17:22:27.197069","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"22d7e4c5","cell_type":"code","source":"class_mapping = { 'normal_mild': 0, 'moderate': 1, 'severe': 2 }","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:27.214857Z","iopub.status.busy":"2025-01-08T17:22:27.214607Z","iopub.status.idle":"2025-01-08T17:22:27.217930Z","shell.execute_reply":"2025-01-08T17:22:27.217132Z"},"papermill":{"duration":0.007693,"end_time":"2025-01-08T17:22:27.219281","exception":false,"start_time":"2025-01-08T17:22:27.211588","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"4468a28e","cell_type":"code","source":"def create_annotations(df, is_train, output_dir):\n    # bu formatta olacak: <class_id> <x_center> <y_center> <width> <height>\n    heights, widths = dicom_to_png(df, is_train)\n    \n    os.makedirs(output_dir, exist_ok=True)\n\n    for index, row in df.iterrows():\n        severity = row['severity'] \n        class_id = class_mapping[severity]\n\n        x_center = row['x'] / widths[index]\n        y_center = row['y'] / heights[index]\n        box_width = 50 / widths[index]\n        box_height = 50 / heights[index]\n\n        annotation_path = os.path.join(output_dir, f'image_{index}.txt')\n        with open(annotation_path, 'w') as f:\n            f.write(f\"{class_id} {x_center} {y_center} {box_width} {box_height}\\n\")\n\n        #print(f'Saved annotation for image_{index} to {annotation_path}')\n    print(\"Annotation files are saved.\")","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:27.224842Z","iopub.status.busy":"2025-01-08T17:22:27.224591Z","iopub.status.idle":"2025-01-08T17:22:27.229463Z","shell.execute_reply":"2025-01-08T17:22:27.228650Z"},"papermill":{"duration":0.009089,"end_time":"2025-01-08T17:22:27.230780","exception":false,"start_time":"2025-01-08T17:22:27.221691","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"c3d04a54","cell_type":"code","source":"data_path = \"/kaggle/working\"\ndef create_yaml(data_path, class_names, yaml_path):\n    # veri setinin yolunu ve sınıf isimlerini belirten bir konfigürasyon dosyası (yaml formatında) oluştur\n\n    yaml_content = {\n        'path': os.path.abspath(data_path),\n        'train': 'images/train',\n        'val': 'images/val',\n        'nc': len(class_names),\n        'names': class_names\n    }\n\n    with open(yaml_path, 'w') as yaml_file:\n        yaml.dump(yaml_content, yaml_file, default_flow_style=False)\n        print(f'YAML dosyası {yaml_path} oluşturuldu.')","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:27.236879Z","iopub.status.busy":"2025-01-08T17:22:27.236632Z","iopub.status.idle":"2025-01-08T17:22:27.240751Z","shell.execute_reply":"2025-01-08T17:22:27.239973Z"},"papermill":{"duration":0.008635,"end_time":"2025-01-08T17:22:27.241993","exception":false,"start_time":"2025-01-08T17:22:27.233358","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"ec7776df","cell_type":"code","source":"for group_name, conditions in condition_groups.items():\n    train_labels_dir = os.path.join(base_dir, group_name.replace(' ', '_'), 'labels', 'train') \n    val_labels_dir = os.path.join(base_dir, group_name.replace(' ', '_'), 'labels', 'val') \n\n    group_name_save=group_name.replace(' ','_')\n    tr_df = pd.read_csv(f'{group_name_save}_train.csv')\n    val_df = pd.read_csv(f'{group_name_save}_val.csv')\n    is_train = 1\n    create_annotations(tr_df, is_train, train_labels_dir) \n    is_train = 0\n    create_annotations(val_df,is_train, val_labels_dir)\n\nfor group_name in condition_groups.keys(): \n    group_dir = os.path.join(base_dir, group_name.replace(' ', '_')) \n    yaml_path = os.path.join(group_dir, 'dataset.yaml') \n    create_yaml(group_dir, ['normal_mild', 'moderate', 'severe'], yaml_path)","metadata":{"execution":{"iopub.execute_input":"2025-01-08T17:22:27.247686Z","iopub.status.busy":"2025-01-08T17:22:27.247435Z","iopub.status.idle":"2025-01-08T17:24:54.558097Z","shell.execute_reply":"2025-01-08T17:24:54.557028Z"},"papermill":{"duration":147.314935,"end_time":"2025-01-08T17:24:54.559452","exception":false,"start_time":"2025-01-08T17:22:27.244517","status":"completed"},"tags":[]},"outputs":[],"execution_count":null}]}