{"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":"gpu","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":216553369,"sourceType":"kernelVersion"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:38.532709Z","iopub.execute_input":"2025-01-15T18:51:38.533130Z","iopub.status.idle":"2025-01-15T18:51:38.537104Z","shell.execute_reply.started":"2025-01-15T18:51:38.533091Z","shell.execute_reply":"2025-01-15T18:51:38.536185Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#!rm -rf /kaggle/working/*","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:38.538166Z","iopub.execute_input":"2025-01-15T18:51:38.538419Z","iopub.status.idle":"2025-01-15T18:51:38.559535Z","shell.execute_reply.started":"2025-01-15T18:51:38.538389Z","shell.execute_reply":"2025-01-15T18:51:38.558574Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#base_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/'\noutput_dir = \"/kaggle/working/\"\nbase_dir=\"/kaggle/working\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:38.561524Z","iopub.execute_input":"2025-01-15T18:51:38.561777Z","iopub.status.idle":"2025-01-15T18:51:38.575334Z","shell.execute_reply.started":"2025-01-15T18:51:38.561756Z","shell.execute_reply":"2025-01-15T18:51:38.574545Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def 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)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:38.576727Z","iopub.execute_input":"2025-01-15T18:51:38.577000Z","iopub.status.idle":"2025-01-15T18:51:38.593221Z","shell.execute_reply.started":"2025-01-15T18:51:38.576979Z","shell.execute_reply":"2025-01-15T18:51:38.592410Z"}},"outputs":[],"execution_count":null},{"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)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:38.594030Z","iopub.execute_input":"2025-01-15T18:51:38.594297Z","iopub.status.idle":"2025-01-15T18:51:38.611458Z","shell.execute_reply.started":"2025-01-15T18:51:38.594275Z","shell.execute_reply":"2025-01-15T18:51:38.610773Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\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":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:38.612202Z","iopub.execute_input":"2025-01-15T18:51:38.612415Z","iopub.status.idle":"2025-01-15T18:51:38.910191Z","shell.execute_reply.started":"2025-01-15T18:51:38.612398Z","shell.execute_reply":"2025-01-15T18:51:38.909111Z"}},"outputs":[],"execution_count":null},{"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    print(train_file_path, val_file_path)\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":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:38.911001Z","iopub.execute_input":"2025-01-15T18:51:38.911196Z","iopub.status.idle":"2025-01-15T18:51:39.011493Z","shell.execute_reply.started":"2025-01-15T18:51:38.911179Z","shell.execute_reply":"2025-01-15T18:51:39.010595Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.head(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:39.012358Z","iopub.execute_input":"2025-01-15T18:51:39.012655Z","iopub.status.idle":"2025-01-15T18:51:39.031913Z","shell.execute_reply.started":"2025-01-15T18:51:39.012610Z","shell.execute_reply":"2025-01-15T18:51:39.030927Z"}},"outputs":[],"execution_count":null},{"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        # 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            continue\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":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:39.034269Z","iopub.execute_input":"2025-01-15T18:51:39.034530Z","iopub.status.idle":"2025-01-15T18:51:39.048456Z","shell.execute_reply.started":"2025-01-15T18:51:39.034511Z","shell.execute_reply":"2025-01-15T18:51:39.047688Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class_mapping = { 'normal_mild': 0, 'moderate': 1, 'severe': 2 }","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:39.049737Z","iopub.execute_input":"2025-01-15T18:51:39.050023Z","iopub.status.idle":"2025-01-15T18:51:39.066167Z","shell.execute_reply.started":"2025-01-15T18:51:39.049995Z","shell.execute_reply":"2025-01-15T18:51:39.065283Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:39.067088Z","iopub.execute_input":"2025-01-15T18:51:39.067439Z","iopub.status.idle":"2025-01-15T18:51:39.082128Z","shell.execute_reply.started":"2025-01-15T18:51:39.067409Z","shell.execute_reply":"2025-01-15T18:51:39.081308Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def create_yaml(data_path, group_name, 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.join('kaggle/input/datas-for-yolo', group_name),\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":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:39.082911Z","iopub.execute_input":"2025-01-15T18:51:39.083145Z","iopub.status.idle":"2025-01-15T18:51:39.096202Z","shell.execute_reply.started":"2025-01-15T18:51:39.083126Z","shell.execute_reply":"2025-01-15T18:51:39.095450Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for group_name, conditions in condition_groups.items():\n    group_name_save=group_name.replace(' ','_')\n    \n    train_labels_dir = os.path.join(base_dir, group_name_save, 'labels', 'train') \n    val_labels_dir = os.path.join(base_dir, group_name_save, 'labels', 'val') \n\n    \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)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:51:39.096857Z","iopub.execute_input":"2025-01-15T18:51:39.097027Z","iopub.status.idle":"2025-01-15T18:53:21.520362Z","shell.execute_reply.started":"2025-01-15T18:51:39.097011Z","shell.execute_reply":"2025-01-15T18:53:21.519591Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for group_name in condition_groups.keys(): \n    new_group_name = group_name.replace(' ', '_')\n    group_dir = os.path.join(base_dir, new_group_name) \n    yaml_path = os.path.join(group_dir, 'dataset.yaml') \n    \n    create_yaml(group_dir, new_group_name, ['normal_mild', 'moderate', 'severe'], yaml_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:53:21.521066Z","iopub.execute_input":"2025-01-15T18:53:21.521274Z","iopub.status.idle":"2025-01-15T18:53:21.528402Z","shell.execute_reply.started":"2025-01-15T18:53:21.521250Z","shell.execute_reply":"2025-01-15T18:53:21.527754Z"}},"outputs":[],"execution_count":null}]}