{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Training\n* [Baseline](https://www.kaggle.com/code/juhjoo/0-56-tf-keras-efficientnet-rsna-baseline)\n\n## Inference\n* [Inference](https://www.kaggle.com/juhjoo/tf-keras-efficientnet-rsna-inference)\n    \n## Summary of Notebook\n\n* Model: EfficientNetB5\n* Image Size: 320\n* Learning Rate: maximum 3e-3, cosine decay with warmup\n* Epochs: 15 (2 for warmup and the rests are cosine decay)\n* Batch Size: 8","metadata":{}},{"cell_type":"code","source":"import sys\nsys.path.append('../input/kerasapplications')\nsys.path.append('../input/efficientnet-keras-source-code/')\nimport keras_applications\nimport efficientnet.tfkeras as efficientnet\nfrom keras_applications.inception_v3 import InceptionV3","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:29.429304Z","iopub.execute_input":"2022-10-06T12:30:29.431592Z","iopub.status.idle":"2022-10-06T12:30:29.43783Z","shell.execute_reply.started":"2022-10-06T12:30:29.431547Z","shell.execute_reply":"2022-10-06T12:30:29.436741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cv2\nimport glob\nimport traceback\nimport cv2 as cv\nimport numpy as np\nimport pandas as pd\nfrom path import Path\nfrom tqdm import tqdm\nimport nibabel as nib\nimport pydicom as dicom\nimport tensorflow as tf\nfrom keras import layers\nfrom pydicom import dcmread\nfrom tensorflow import keras\nimport tensorflow_hub as hub\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras import backend as K\nfrom pydicom.data import get_testdata_files\nfrom tensorflow.keras.utils import to_categorical\nfrom sklearn.model_selection import StratifiedKFold\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2D\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array\nimport random\n\nfrom glob import glob\n\nfrom sklearn.model_selection import train_test_split, StratifiedGroupKFold, GroupKFold\nfrom sklearn.ensemble import RandomForestClassifier","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:38.924398Z","iopub.execute_input":"2022-10-06T12:30:38.925356Z","iopub.status.idle":"2022-10-06T12:30:38.935092Z","shell.execute_reply.started":"2022-10-06T12:30:38.925321Z","shell.execute_reply":"2022-10-06T12:30:38.93408Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gpu_devices = tf.config.experimental.list_physical_devices('GPU')\nfor device in gpu_devices:\n    tf.config.experimental.set_memory_growth(device, True)","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:38.938377Z","iopub.execute_input":"2022-10-06T12:30:38.93868Z","iopub.status.idle":"2022-10-06T12:30:39.129175Z","shell.execute_reply.started":"2022-10-06T12:30:38.938641Z","shell.execute_reply":"2022-10-06T12:30:39.127713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CFG:\n\n    # Use verbose=0 for silent, 1 for interactive\n    verbose = 0\n    display_plot = True\n    debug = False\n\n    # Device for training\n    device = None  # device is automatically selected\n\n    # Model\n    model_name = \"efficientnetb5\"\n\n    # Seeding for reproducibility\n    seed = 101\n\n    # Number of folds\n    folds = 5\n\n    # Which Folds to train\n    selected_folds = [0, 1, 2, 3, 4]\n\n    # Image Size\n    img_size = [320, 320]\n    IMAGE_SIZE = 320\n\n    # Batch Size & Epochs\n    batch_size = 16\n    drop_remainder = False\n    epochs = 15\n    steps_per_execution = None\n\n    # Loss & Optimizer\n    optimizer = \"Adam\"\n    lr = 3e-4\n    patience = 5\n    \n    \n    n_splits = 5\n    \n    clip = False","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.130659Z","iopub.execute_input":"2022-10-06T12:30:39.131162Z","iopub.status.idle":"2022-10-06T12:30:39.139921Z","shell.execute_reply.started":"2022-10-06T12:30:39.131126Z","shell.execute_reply":"2022-10-06T12:30:39.138814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bad = np.array([['1.2.826.0.1.3680043.10197_C1', '1.2.826.0.1.3680043.10197','C1'],['1.2.826.0.1.3680043.10454_C1', '1.2.826.0.1.3680043.10454','C1'],['1.2.826.0.1.3680043.10690_C1', '1.2.826.0.1.3680043.10690','C1']], dtype=np.object)\n\ntrain_df = pd.read_csv(\"../input/rsna-2022-cervical-spine-fracture-detection/train.csv\")\ntest_df = pd.read_csv(\"../input/rsna-2022-cervical-spine-fracture-detection/test.csv\")\n\ntrain_dir = '../input/rsna-2022-cervical-spine-fracture-detection/train_images'\ntest_dir = '../input/rsna-2022-cervical-spine-fracture-detection/test_images'\nmeta_dir = '../input/rsna-2022-dataset'\nfirst_image = os.path.join(test_dir, test_df['StudyInstanceUID'].iloc[0])","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.14191Z","iopub.execute_input":"2022-10-06T12:30:39.142403Z","iopub.status.idle":"2022-10-06T12:30:39.174503Z","shell.execute_reply.started":"2022-10-06T12:30:39.142329Z","shell.execute_reply":"2022-10-06T12:30:39.173567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_submission = []\nmeans = train_df.median(numeric_only=True).to_dict()\nmeans = dict(zip(train_df.columns[1:], np.average(train_df[train_df.columns[1:]], axis=0, weights=train_df['patient_overall'] + 1)))\nprediction_type = test_df['prediction_type'].tolist()","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.175856Z","iopub.execute_input":"2022-10-06T12:30:39.176391Z","iopub.status.idle":"2022-10-06T12:30:39.189495Z","shell.execute_reply.started":"2022-10-06T12:30:39.176355Z","shell.execute_reply":"2022-10-06T12:30:39.188418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv('../input/rsna-2022-cervical-spine-fracture-detection/sample_submission.csv')\nfor i in range(len(submission)) :\n    new_submission.append(means[prediction_type[i]])\nsubmission['fractured'] = new_submission","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.191472Z","iopub.execute_input":"2022-10-06T12:30:39.192082Z","iopub.status.idle":"2022-10-06T12:30:39.203853Z","shell.execute_reply.started":"2022-10-06T12:30:39.192048Z","shell.execute_reply":"2022-10-06T12:30:39.20279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if(test_df.values[0][0] == bad[0][0]): \n    test_df = pd.DataFrame({\"row_id\": ['1.2.826.0.1.3680043.22327_C1', '1.2.826.0.1.3680043.25399_C1', '1.2.826.0.1.3680043.5876_C1'], \"StudyInstanceUID\": ['1.2.826.0.1.3680043.22327', '1.2.826.0.1.3680043.25399', '1.2.826.0.1.3680043.5876'], \"prediction_type\": [\"C1\", \"C1\", \"C1\"]})  \nprediction_type_mapping = test_df['prediction_type'].map({'patient_overall': 0, 'C1': 1, 'C2': 2, 'C3': 3, 'C4': 4, 'C5': 5, 'C6': 6, 'C7': 7}).values","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.208522Z","iopub.execute_input":"2022-10-06T12:30:39.208797Z","iopub.status.idle":"2022-10-06T12:30:39.218727Z","shell.execute_reply.started":"2022-10-06T12:30:39.208773Z","shell.execute_reply":"2022-10-06T12:30:39.217816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction_type_mapping","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.220124Z","iopub.execute_input":"2022-10-06T12:30:39.220608Z","iopub.status.idle":"2022-10-06T12:30:39.233337Z","shell.execute_reply.started":"2022-10-06T12:30:39.220569Z","shell.execute_reply":"2022-10-06T12:30:39.232333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.236195Z","iopub.execute_input":"2022-10-06T12:30:39.236513Z","iopub.status.idle":"2022-10-06T12:30:39.250953Z","shell.execute_reply.started":"2022-10-06T12:30:39.236488Z","shell.execute_reply":"2022-10-06T12:30:39.249947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\n\nmeta_train = pd.read_csv(\"../input/rsna-2022-dataset/meta_data.csv\")\nmeta_train[\"StudyInstanceUID\"] = meta_train[\"SOPInstanceUID\"].apply(lambda x: \".\".join(x.split(\".\")[:-2]))\nmeta_train[\"ImageSize\"] = meta_train[\"Rows\"].astype(str) + \" x \" + meta_train[\"Columns\"].astype(str)\nmeta_train['ImagePositionPatient_x'] = meta_train['ImagePositionPatient'].apply(lambda x: float(x.replace(',','').replace(']','').replace('[','').split()[0]))\nmeta_train['ImagePositionPatient_y'] = meta_train['ImagePositionPatient'].apply(lambda x: float(x.replace(',','').replace(']','').replace('[','').split()[1]))\nmeta_train['ImagePositionPatient_z'] = meta_train['ImagePositionPatient'].apply(lambda x: float(x.replace(',','').replace(']','').replace('[','').split()[2]))\nmeta_train.rename(columns={\"Rows\": \"ImageHeight\", \"Columns\": \"ImageWidth\",\"InstanceNumber\": \"Slice\"}, inplace=True)\nmeta_train = meta_train[['StudyInstanceUID','Slice','ImageHeight','ImageWidth','SliceThickness','ImagePositionPatient_x','ImagePositionPatient_y','ImagePositionPatient_z']]\nmeta_train.sort_values(by=['StudyInstanceUID','Slice'], inplace=True)\nmeta_train.reset_index(drop=True, inplace=True)\nmeta_train.head()\n\nbase_path = \"../input/rsna-2022-cervical-spine-fracture-detection\"\nseg_paths = glob(f\"{base_path}/segmentations/*\")\nseg_df = pd.DataFrame({'path': seg_paths})\nseg_df['StudyInstanceUID'] = seg_df['path'].apply(lambda x:x.split('/')[-1][:-4])\nseg_df = seg_df[['StudyInstanceUID','path']]\nprint('seg_df shape:', seg_df.shape)\n\nmeta_seg = meta_train[meta_train['StudyInstanceUID'].isin(seg_df['StudyInstanceUID'])].reset_index(drop=True)\nprint('meta_seg shape:', meta_seg.shape)\nmeta_seg.head(3)\n'''","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.252608Z","iopub.execute_input":"2022-10-06T12:30:39.252972Z","iopub.status.idle":"2022-10-06T12:30:39.260517Z","shell.execute_reply.started":"2022-10-06T12:30:39.252938Z","shell.execute_reply":"2022-10-06T12:30:39.25943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_train = pd.read_csv(\"../input/rsna-2022-dataset/meta_data.csv\")\nmeta_train[\"StudyInstanceUID\"] = meta_train[\"SOPInstanceUID\"].apply(lambda x: \".\".join(x.split(\".\")[:-2]))\nmeta_train[\"ImageSize\"] = meta_train[\"Rows\"].astype(str) + \" x \" + meta_train[\"Columns\"].astype(str)\nmeta_train['ImagePositionPatient_x'] = meta_train['ImagePositionPatient'].apply(lambda x: float(x.replace(',','').replace(']','').replace('[','').split()[0]))\nmeta_train['ImagePositionPatient_y'] = meta_train['ImagePositionPatient'].apply(lambda x: float(x.replace(',','').replace(']','').replace('[','').split()[1]))\nmeta_train['ImagePositionPatient_z'] = meta_train['ImagePositionPatient'].apply(lambda x: float(x.replace(',','').replace(']','').replace('[','').split()[2]))\nmeta_train.rename(columns={\"Rows\": \"ImageHeight\", \"Columns\": \"ImageWidth\",\"InstanceNumber\": \"Slice\"}, inplace=True)\nmeta_train = meta_train[['StudyInstanceUID','Slice','ImageHeight','ImageWidth','SliceThickness','ImagePositionPatient_x','ImagePositionPatient_y','ImagePositionPatient_z']]\nmeta_train.sort_values(by=['StudyInstanceUID','Slice'], inplace=True)\nmeta_train.reset_index(drop=True, inplace=True)\nmeta_train.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:39.262425Z","iopub.execute_input":"2022-10-06T12:30:39.263116Z","iopub.status.idle":"2022-10-06T12:30:46.187945Z","shell.execute_reply.started":"2022-10-06T12:30:39.263081Z","shell.execute_reply":"2022-10-06T12:30:46.186781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\n\ntargets = ['C1','C2','C3','C4','C5','C6','C7']\nmeta_seg[targets]=0\n\nk=0\n# Loop over 87 patients with segmentations\nfor path, UID in zip(seg_df['path'], seg_df['StudyInstanceUID']):\n    # Get segmentations for patient\n    seg_nib = nib.load(path)\n    seg = seg_nib.get_fdata()\n    seg = seg[:, ::-1, ::-1].transpose(2, 1, 0) # Align orientation with train images\n    num_slices, _, _ = seg.shape\n    \n    # Loop over slices\n    for i in range(num_slices):\n        mask = seg[i]\n        unique_vals = np.unique(mask)\n        \n        # Loop over unique values (except 0)\n        for j in unique_vals[1:]:\n            \n            # Ignore thoratic spine etc\n            if j <= 7:   \n                meta_seg.loc[(meta_seg['StudyInstanceUID']==UID)&(meta_seg['Slice']==i),f'C{int(j)}'] = 1\n                \n    # Iteration tracker\n    if (k%10)==0:\n        print(f'Iteration:{k}')\n    k+=1\n    \nmeta_seg.to_csv(\"meta_segmentation.csv\", index=False)\n\n'''","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:46.189802Z","iopub.execute_input":"2022-10-06T12:30:46.190184Z","iopub.status.idle":"2022-10-06T12:30:46.198693Z","shell.execute_reply.started":"2022-10-06T12:30:46.190147Z","shell.execute_reply":"2022-10-06T12:30:46.197607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ex_path = \"../input/rsna-2022-cervical-spine-fracture-detection/segmentations/1.2.826.0.1.3680043.12281.nii\"\nexample = nib.load(ex_path)\nexample = example.get_fdata()  # convert to numpy array\nexample = example[:, ::-1, ::-1].transpose(2, 1, 0)  # align orientation with train image\nnp.unique(example[119])","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:46.200373Z","iopub.execute_input":"2022-10-06T12:30:46.201054Z","iopub.status.idle":"2022-10-06T12:30:47.753677Z","shell.execute_reply.started":"2022-10-06T12:30:46.201018Z","shell.execute_reply":"2022-10-06T12:30:47.752558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure()\nplt.imshow(example[119])\nplt.title('Segmentation example')\nplt.colorbar()\nplt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:47.754986Z","iopub.execute_input":"2022-10-06T12:30:47.755941Z","iopub.status.idle":"2022-10-06T12:30:47.991438Z","shell.execute_reply.started":"2022-10-06T12:30:47.755901Z","shell.execute_reply":"2022-10-06T12:30:47.990691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_seg = pd.read_csv('../input/rsna-2022-dataset/meta_segmentation.csv')\nmeta_seg.head(3)","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:47.992758Z","iopub.execute_input":"2022-10-06T12:30:47.993774Z","iopub.status.idle":"2022-10-06T12:30:48.070697Z","shell.execute_reply.started":"2022-10-06T12:30:47.993738Z","shell.execute_reply":"2022-10-06T12:30:48.069665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nslice_max_seg = meta_seg.groupby('StudyInstanceUID')['Slice'].max().to_dict()\nmeta_seg['SliceRatio'] = 0\nmeta_seg['SliceRatio'] = meta_seg['Slice']/meta_seg['StudyInstanceUID'].map(slice_max_seg)\n\nfeatures = ['SliceRatio','SliceThickness','ImagePositionPatient_x','ImagePositionPatient_y','ImagePositionPatient_z']\n\n# Features and targets\nX = meta_seg[['StudyInstanceUID']+features]\ny = meta_seg[targets]\n\ngkf = GroupKFold(n_splits=5)\n(train_idx, valid_idx) = next(gkf.split(X, y, groups = X['StudyInstanceUID']))\n\n# Train set\nX_train, y_train = X.iloc[train_idx,:], y.iloc[train_idx,:]\n\n# Validation set\nX_valid, y_valid = X.iloc[valid_idx,:], y.iloc[valid_idx,:]\n\n# Drop patient id\nX_train = X_train.drop('StudyInstanceUID', axis=1)\nX_valid = X_valid.drop('StudyInstanceUID', axis=1)\n\nclf = RandomForestClassifier()\nclf.fit(X_train, y_train)\n\ny_preds = clf.predict(X_valid)\n\ntotal_acc = 0 \nfor i in range(7):\n    acc = (y_valid[f'C{i+1}']==y_preds[:,i]).sum()/len(y_preds[:,i])\n    total_acc+=acc/7\n    print(f'Accuracy of C{i+1}: {acc} %')\n\nprint('')\nprint(f'Overall accuracy: {total_acc} %')\n'''","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:48.072284Z","iopub.execute_input":"2022-10-06T12:30:48.072694Z","iopub.status.idle":"2022-10-06T12:30:48.080509Z","shell.execute_reply.started":"2022-10-06T12:30:48.072653Z","shell.execute_reply":"2022-10-06T12:30:48.079313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nfeatures = ['SliceRatio','SliceThickness','ImagePositionPatient_x','ImagePositionPatient_y','ImagePositionPatient_z']\n\nslice_max_train = meta_train.groupby('StudyInstanceUID')['Slice'].max().to_dict()\nmeta_train['SliceRatio'] = 0\nmeta_train['SliceRatio'] = meta_train['Slice']/meta_train['StudyInstanceUID'].map(slice_max_train)\n\nmeta_train[targets]=0\n\nmeta_train[targets] = clf.predict(meta_train[features])\n\nmeta_train.loc[meta_train['StudyInstanceUID'].isin(meta_seg['StudyInstanceUID']),targets] = meta_seg[targets].values\n\nmeta_train.to_csv('meta_train_with_vertebrae.csv', index=False)\n\nmeta_train.head(3)\n'''","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:48.082572Z","iopub.execute_input":"2022-10-06T12:30:48.083402Z","iopub.status.idle":"2022-10-06T12:30:48.09345Z","shell.execute_reply.started":"2022-10-06T12:30:48.083366Z","shell.execute_reply":"2022-10-06T12:30:48.09228Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_train = pd.read_csv('../input/rsna-2022-dataset/meta_train_with_vertebrae.csv')\nmeta_train = meta_train.groupby('StudyInstanceUID')['C1','C2','C3','C4','C5','C6','C7'].mean().reset_index()\nmeta_train.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:48.095515Z","iopub.execute_input":"2022-10-06T12:30:48.095888Z","iopub.status.idle":"2022-10-06T12:30:49.777246Z","shell.execute_reply.started":"2022-10-06T12:30:48.095854Z","shell.execute_reply":"2022-10-06T12:30:49.776201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.set_index('StudyInstanceUID').join(meta_train.set_index('StudyInstanceUID'),\n                                                              rsuffix='_vertebrae').reset_index().copy()","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:49.778566Z","iopub.execute_input":"2022-10-06T12:30:49.779569Z","iopub.status.idle":"2022-10-06T12:30:49.79088Z","shell.execute_reply.started":"2022-10-06T12:30:49.77953Z","shell.execute_reply":"2022-10-06T12:30:49.790021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:49.792231Z","iopub.execute_input":"2022-10-06T12:30:49.792797Z","iopub.status.idle":"2022-10-06T12:30:49.827541Z","shell.execute_reply.started":"2022-10-06T12:30:49.79276Z","shell.execute_reply":"2022-10-06T12:30:49.82656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom(path, size=64) :\n    try :\n        img = dicom.dcmread(path)\n        img.PhotometricInterpretation = 'YBR_FULL'\n        data = img.pixel_array\n        data = data - np.min(data)\n        if np.max(data) != 0 :\n            data = data / np.max(data)\n        data = (data * 255).astype(np.uint8)\n        return cv2.cvtColor(data.reshape(512, 512), cv2.COLOR_GRAY2RGB)\n    except :\n        print('error!')\n        return np.zeros((512, 512, 3))\n\ndef listdirs(folder) :\n    return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]\n\ntrain_dir = '../input/rsna-2022-cervical-spine-fracture-detection/train_images'\ntest_dir = '../input/rsna-2022-cervical-spine-fracture-detection/test_images'\npatients = sorted(os.listdir(train_dir))","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:49.82896Z","iopub.execute_input":"2022-10-06T12:30:49.829338Z","iopub.status.idle":"2022-10-06T12:30:49.923269Z","shell.execute_reply.started":"2022-10-06T12:30:49.829303Z","shell.execute_reply":"2022-10-06T12:30:49.922422Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_file = glob(\"../input/rsna-2022-cervical-spine-fracture-detection/train_images/1.2.826.0.1.3680043.10001/*.dcm\")\nplt.figure(figsize=(20, 20))\n\nfor i in range(28) :\n    ax = plt.subplot(7, 7, i + 1)\n    image_path = image_file[i]\n    image = load_dicom(image_path)\n    plt.axis('off')\n    plt.imshow(image)","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:49.928445Z","iopub.execute_input":"2022-10-06T12:30:49.928731Z","iopub.status.idle":"2022-10-06T12:30:53.386087Z","shell.execute_reply.started":"2022-10-06T12:30:49.928706Z","shell.execute_reply":"2022-10-06T12:30:53.385095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def RSNATrainGenerator(train_df, batch_size, infinite = True, base_path = train_dir):\n    while True:\n        trainset = []\n        trainidt = []\n        trainlabel = []\n        for i in (range(len(train_df))):\n            idt = train_df.loc[i, 'StudyInstanceUID']\n            path = os.path.join(train_dir, idt)\n            for im in os.listdir(path):\n                dc = dicom.read_file(os.path.join(path,im))\n                if dc.file_meta.TransferSyntaxUID.name =='JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1])':\n                    continue\n                img = load_dicom(os.path.join(path , im))\n                img = cv.resize(img, (CFG.IMAGE_SIZE , CFG.IMAGE_SIZE))\n                image = img_to_array(img)\n                image = image / 255.0\n                trainset += [image]\n                cur_label = []\n                cur_label.append(train_df.loc[i,'patient_overall'])\n                cur_label.append(train_df.loc[i,'C1'])\n                cur_label.append(train_df.loc[i,'C2'])\n                cur_label.append(train_df.loc[i,'C3'])\n                cur_label.append(train_df.loc[i,'C4'])\n                cur_label.append(train_df.loc[i,'C5'])\n                cur_label.append(train_df.loc[i,'C6'])\n                cur_label.append(train_df.loc[i,'C7'])\n                trainlabel += [cur_label]\n                trainidt += [idt]\n                if len(trainidt) == batch_size:                    \n                    yield np.array(trainset), np.array(trainlabel).astype('float32')\n                    trainset, trainlabel, trainidt = [], [], []\n            #i+=1","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:53.387072Z","iopub.execute_input":"2022-10-06T12:30:53.387708Z","iopub.status.idle":"2022-10-06T12:30:53.40202Z","shell.execute_reply.started":"2022-10-06T12:30:53.387671Z","shell.execute_reply":"2022-10-06T12:30:53.40074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def RSNATestGenerator(test_df, batch_size, infinite = True, base_path = test_dir):\n    while 1:        \n        testset=[]\n        testidt=[]\n        for i in (range(len(test_df))):        \n            if type(test_df) is list: idt = test_df[i]\n            else: idt = test_df['StudyInstanceUID'].iloc[i]\n            path = os.path.join(base_path, idt)\n            if os.path.exists(path):\n                for im in os.listdir(path):\n                    dc = dicom.read_file(os.path.join(path,im))\n                    if dc.file_meta.TransferSyntaxUID.name =='JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1])':\n                        continue\n                    img=load_dicom(os.path.join(path,im))\n                    img=cv.resize(img,(CFG.IMAGE_SIZE, CFG.IMAGE_SIZE))\n                    image=img_to_array(img)\n                    image=image/255.0\n                    testset+=[image]\n                    testidt+=[idt]\n                    if len(testset) == batch_size:                        \n                        yield np.array(testset)\n                        testset = []\n        if len(testset) > 0: yield np.array(testset)\n        if not infinite: break","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:53.4036Z","iopub.execute_input":"2022-10-06T12:30:53.404161Z","iopub.status.idle":"2022-10-06T12:30:53.417035Z","shell.execute_reply.started":"2022-10-06T12:30:53.404125Z","shell.execute_reply":"2022-10-06T12:30:53.415937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def competiton_loss(y_true, y_pred):\n\n    competition_weights = {\n        '-' : tf.constant([7, 1, 1, 1, 1, 1, 1, 1], dtype=tf.float32),\n        '+' : tf.constant([14, 2, 2, 2, 2, 2, 2, 2], dtype=tf.float32)\n    }\n    \n    loss = tf.keras.losses.BinaryCrossentropy(reduction=tf.keras.losses.Reduction.NONE)(tf.expand_dims(y_true, -1),tf.expand_dims(y_pred,-1))\n    weights  = y_true*competition_weights['+'] + (1-y_true)*competition_weights['-'] \n    \n    loss = tf.reduce_mean(tf.reduce_sum(loss * weights, axis=1)) / tf.reduce_sum(weights)\n    return loss","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:53.418742Z","iopub.execute_input":"2022-10-06T12:30:53.419092Z","iopub.status.idle":"2022-10-06T12:30:53.429601Z","shell.execute_reply.started":"2022-10-06T12:30:53.419058Z","shell.execute_reply":"2022-10-06T12:30:53.428602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" def get_model():\n    inp = keras.layers.Input((None, None ,1))\n    x = Conv2D(3, 3, padding = 'SAME')(inp)\n    x = efficientnet.EfficientNetB5(include_top=False, weights='../input/efficientnet-weights-for-keras/noisy-student/notop/efficientnet-b5_noisy-student_notop.h5')(x)\n    x = keras.layers.GlobalAveragePooling2D()(x)\n    x = keras.layers.Dropout(0.25)(x)\n    x = keras.layers.Dense(512, activation='swish')(x)\n    x = keras.layers.Dropout(0.25)(x)\n    out = keras.layers.Dense(8, 'sigmoid')(x)\n    model = keras.models.Model(inp, out)\n    model.summary()\n    \n    \n    model.compile(loss=competiton_loss, optimizer = tf.keras.optimizers.Adam(learning_rate = CFG.lr))\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-10-06T13:09:00.08958Z","iopub.execute_input":"2022-10-06T13:09:00.090117Z","iopub.status.idle":"2022-10-06T13:09:00.100117Z","shell.execute_reply.started":"2022-10-06T13:09:00.090081Z","shell.execute_reply":"2022-10-06T13:09:00.099153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"skf = StratifiedKFold(n_splits=CFG.folds, shuffle=False)\n\nfor fold, (train_idx, val_idx) in enumerate(skf.split(train_df, train_df['patient_overall'])):    \n    K.clear_session()\n    x_train = train_df.iloc[train_idx].reset_index()\n    x_val = train_df.iloc[val_idx].reset_index()\n    \n    TRAIN_DATASET = RSNATrainGenerator(x_train, CFG.batch_size, infinite = True, base_path = train_dir)\n    VALID_DATASET = RSNATrainGenerator(x_val, CFG.batch_size, infinite = True, base_path = train_dir)\n    TEST_DATASET = RSNATestGenerator(test_df, CFG.batch_size, infinite = False, base_path = test_dir)\n    checkpoint = tf.keras.callbacks.ModelCheckpoint(\n            \"effb5_result_frac_fold-%i.h5\" % fold,\n            monitor = 'val_loss',\n            mode = 'min',\n            verbose=1,\n            save_best_only=True,\n            save_weights_only=True\n        )\n\n    lr_cosine = tf.keras.experimental.CosineDecay(initial_learning_rate=CFG.lr, decay_steps=CFG.epochs + 2, alpha=CFG.lr / 1e2)\n    lr_cosine = tf.keras.callbacks.LearningRateScheduler(lr_cosine, verbose=1)\n        \n    callbacks=[checkpoint, lr_cosine]\n    \n    model = get_model()\n    history = model.fit(TRAIN_DATASET,\n                    epochs = CFG.epochs,\n                    verbose = 0,\n                    callbacks = callbacks,\n                    validation_steps = max((len(x_val) // CFG.batch_size), 1),\n                    steps_per_epoch = max((len(x_train) // CFG.batch_size), 1),\n                    validation_data = VALID_DATASET)\n\n    history_df = pd.DataFrame(history.history)\n        \n    history_df.to_csv(\"history-%i.csv\" % fold)\n\n    plt.figure(figsize=(20, 20))\n    plt.subplot(1, 3, 1)\n    plt.plot(range(history.epoch[-1] + 1), history.history['loss'], label='Train Loss' )\n    plt.plot(range(history.epoch[-1] + 1), history.history['val_loss'], label='Validation Loss' )\n    plt.title('Loss')\n    plt.xlabel('Epochs')\n    plt.ylabel('Losses')\n    plt.legend()\n    \n    try: # the best we can do at the moment..\n        preds = model.predict(TEST_DATASET, steps = max((len(test_df) // CFG.batch_size), 1))\n        \n        new_preds = []\n        for pred_idx in range(len(preds)):\n            new_preds.append(preds[pred_idx][prediction_type_mapping[pred_idx]])\n        submission['fractured'] += np.array(new_preds) / 5\n        \n    except: traceback.print_exc()    ","metadata":{"execution":{"iopub.status.busy":"2022-10-06T13:09:19.320041Z","iopub.execute_input":"2022-10-06T13:09:19.320533Z","iopub.status.idle":"2022-10-06T13:09:34.123031Z","shell.execute_reply.started":"2022-10-06T13:09:19.320482Z","shell.execute_reply":"2022-10-06T13:09:34.120565Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:56.003214Z","iopub.status.idle":"2022-10-06T12:30:56.005162Z","shell.execute_reply.started":"2022-10-06T12:30:56.004945Z","shell.execute_reply":"2022-10-06T12:30:56.004971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=0)","metadata":{"execution":{"iopub.status.busy":"2022-10-06T12:30:56.006595Z","iopub.status.idle":"2022-10-06T12:30:56.007092Z","shell.execute_reply.started":"2022-10-06T12:30:56.00684Z","shell.execute_reply":"2022-10-06T12:30:56.006863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}