{"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 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-08T17:15:19.635002Z","iopub.execute_input":"2025-01-08T17:15:19.635352Z","iopub.status.idle":"2025-01-08T17:15:21.314798Z","shell.execute_reply.started":"2025-01-08T17:15:19.635324Z","shell.execute_reply":"2025-01-08T17:15:21.313857Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#base_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/'\noutput_dir = \"/kaggle/working/\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T17:15:23.592591Z","iopub.execute_input":"2025-01-08T17:15:23.593002Z","iopub.status.idle":"2025-01-08T17:15:23.596562Z","shell.execute_reply.started":"2025-01-08T17:15:23.592979Z","shell.execute_reply":"2025-01-08T17:15:23.595563Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T17:15:25.978348Z","iopub.execute_input":"2025-01-08T17:15:25.978645Z","iopub.status.idle":"2025-01-08T17:15:25.984691Z","shell.execute_reply.started":"2025-01-08T17:15:25.978625Z","shell.execute_reply":"2025-01-08T17:15:25.983735Z"}},"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)\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":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T17:15:29.618464Z","iopub.execute_input":"2025-01-08T17:15:29.618833Z","iopub.status.idle":"2025-01-08T17:15:30.048579Z","shell.execute_reply.started":"2025-01-08T17:15:29.618802Z","shell.execute_reply":"2025-01-08T17:15:30.047685Z"}},"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    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-08T17:15:33.803951Z","iopub.execute_input":"2025-01-08T17:15:33.804378Z","iopub.status.idle":"2025-01-08T17:15:33.923800Z","shell.execute_reply.started":"2025-01-08T17:15:33.804336Z","shell.execute_reply":"2025-01-08T17:15:33.922827Z"}},"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_file = pydicom.dcmread(image_path)\n        image_array = dicom_file.pixel_array\n        \n        height, width = image_array.shape\n        height_list.append(height)\n        width_list.append(width)\n        resized_image = cv2.resize(image_array, target_size) \n        images_list.append(resized_image)\n    \n        png_path = os.path.join(output_dir, f'image_{index}.png') \n        success = cv2.imwrite(png_path, resized_image)\n        if success:\n            continue\n        else:\n            print(f\"Failed to save {png_path} to {output_dir}\")\n        \n    print(f\"all {group_name} images are saved to {png_path}\")\n\n    return height_list, width_list","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T17:15:36.841080Z","iopub.execute_input":"2025-01-08T17:15:36.841426Z","iopub.status.idle":"2025-01-08T17:15:36.848584Z","shell.execute_reply.started":"2025-01-08T17:15:36.841400Z","shell.execute_reply":"2025-01-08T17:15:36.847651Z"}},"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-08T17:15:40.368802Z","iopub.execute_input":"2025-01-08T17:15:40.369072Z","iopub.status.idle":"2025-01-08T17:15:40.372732Z","shell.execute_reply.started":"2025-01-08T17:15:40.369052Z","shell.execute_reply":"2025-01-08T17:15:40.371944Z"}},"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-08T17:15:42.855022Z","iopub.execute_input":"2025-01-08T17:15:42.855382Z","iopub.status.idle":"2025-01-08T17:15:42.860504Z","shell.execute_reply.started":"2025-01-08T17:15:42.855353Z","shell.execute_reply":"2025-01-08T17:15:42.859691Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T17:15:45.810705Z","iopub.execute_input":"2025-01-08T17:15:45.810988Z","iopub.status.idle":"2025-01-08T17:15:45.815626Z","shell.execute_reply.started":"2025-01-08T17:15:45.810965Z","shell.execute_reply":"2025-01-08T17:15:45.814673Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true},"outputs":[],"execution_count":null}]}