{"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":52254,"databundleVersionId":6863140,"sourceType":"competition"}],"dockerImageVersionId":30558,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-28T09:02:23.726781Z","iopub.execute_input":"2023-10-28T09:02:23.727426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport os\nimport pydicom\nfrom pydicom.data import get_testdata_files\nimport plotly.express as px\nfrom pprint import pprint\nimport nibabel as nib\nfrom ipywidgets import interact","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"main_folder = \"/kaggle/input/rsna-2023-abdominal-trauma-detection/\"\n!ls {main_folder}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(main_folder + \"train.csv\")\ntrain.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"EDA of train Data","metadata":{}},{"cell_type":"code","source":"print(\"Number of rows and columns:\", train.shape) \nprint()\nprint('*************************************')\nprint()\nprint(train.info())\nprint()\nprint('*************************************')\nprint()\nprint(\"Number of Unique Values:\\n\",train.nunique())\nprint()\nprint('*************************************')\nprint()\nprint(\"Duplicate Values:\\n\",train.duplicated().sum())\nprint()\nprint('*************************************')\nprint()\nprint(\"Null Values:\\n\",train.isnull().sum())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* There are total 3147 rows and 15 columns.\n* It seems data is well structed like a one-hot encoding is already done on the columns as a particular column categorized into several columns and there are no null values.\n* Also each column just contains binary values (0 or 1).","metadata":{}},{"cell_type":"markdown","source":"meta info of images","metadata":{}},{"cell_type":"code","source":"train_series_meta = pd.read_csv(main_folder + \"train_series_meta.csv\")\ntrain_series_meta.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Number of rows and columns:\", train_series_meta.shape) \nprint()\nprint('*************************************')\nprint()\nprint(train_series_meta.info())\nprint()\nprint('*************************************')\nprint()\nprint(\"Number of Unique Values:\\n\",train_series_meta.nunique())\nprint()\nprint('*************************************')\nprint()\nprint(\"Duplicate Values:\\n\",train_series_meta.duplicated().sum())\nprint()\nprint('*************************************')\nprint()\nprint(\"Null Values:\\n\",train_series_meta.isnull().sum())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"There are total 4711 rows and 4 columns.\nHere the only column with all unique values in series_id with all different values.\nWe have repetiting patient IDs too, so can say particular patient having multiple data entries.","metadata":{}},{"cell_type":"markdown","source":"Feature Engineering¶\nTo extract more usefull information from the data.","metadata":{}},{"cell_type":"code","source":"train['bowel'] = (train.iloc[:, 1:3] == 1).idxmax(1)\ntrain['extravasation'] = (train.iloc[:, 3:5] == 1).idxmax(1)\ntrain['kidney'] = (train.iloc[:, 5:8] == 1).idxmax(1)\ntrain['liver'] = (train.iloc[:, 8:11] == 1).idxmax(1)\ntrain['spleen'] = (train.iloc[:, 11:14] == 1).idxmax(1)\n\ntrain.head()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = train.drop(columns =['bowel_healthy','bowel_injury','extravasation_healthy','extravasation_injury','kidney_healthy','kidney_low','kidney_high','liver_healthy','liver_low','liver_high',\n                             'spleen_healthy','spleen_low','spleen_high'])\ntrain.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['bowel'] = train['bowel'].replace(['bowel_injury','bowel_healthy'], [0, 1])\ntrain['extravasation'] = train['extravasation'].replace(['extravasation_injury', 'extravasation_healthy'], [0, 1])\ntrain['kidney'] = train['kidney'].replace(['kidney_low','kidney_high','kidney_healthy'], [0, 1, 2])\ntrain['liver'] = train['liver'].replace(['liver_low','liver_high','liver_healthy'], [0, 1, 2])\ntrain['spleen'] = train['spleen'].replace(['spleen_low','spleen_high','spleen_healthy'], [0, 1, 2])\n\ntrain.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_labels = pd.read_csv(main_folder + \"image_level_labels.csv\")\nimage_labels.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Number of rows and columns:\", image_labels.shape) \nprint()\nprint('*************************************')\nprint()\nprint(image_labels.info())\nprint()\nprint('*************************************')\nprint()\nprint(\"Number of Unique Values:\\n\",image_labels.nunique())\nprint()\nprint('*************************************')\nprint()\nprint(\"Duplicate Values:\\n\",image_labels.duplicated().sum())\nprint()\nprint('*************************************')\nprint()\nprint(\"Null Values:\\n\",image_labels.isnull().sum())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"It tell us more a columnar storage file format often used for efficient and scalable data storage and processing, especially in the context of big data and data analytics. In the context of machine learning or medical imaging, \"dicom\" typically refers to Digital Imaging and Communications in Medicine, a standard for handling, storing, and transmitting medical images, including data like patient information and metadata.","metadata":{}},{"cell_type":"code","source":"train_dicom_tags = pd.read_parquet(main_folder + \"train_dicom_tags.parquet\")\ntrain_dicom_tags.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Number of rows and columns:\", train_dicom_tags.shape) \nprint()\nprint('*************************************')\nprint()\nprint(train_dicom_tags.info())\nprint()\nprint('*************************************')\nprint()\nprint(\"Number of Unique Values:\\n\",train_dicom_tags.nunique())\nprint()\nprint('*************************************')\nprint()\nprint(\"Duplicate Values:\\n\",train_dicom_tags.duplicated().sum())\nprint()\nprint('*************************************')\nprint()\nprint(\"Null Values:\\n\",train_dicom_tags.isnull().sum())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Data Vizualization","metadata":{}},{"cell_type":"code","source":"#Checking the distribution of patients having any injury\nfig = px.pie(train, names=train['any_injury'].map({1: 'Patient Injured', 0: 'No Injury'}), height=500, width= 500, color_discrete_sequence=['#D3D3D3','#71797E'], title='Injuries reported in patients')\nfig.update_traces(textfont_size=15)\nfig.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Checking (Bowel, Extravasation) organs Health in patients\nfor column in train.columns[2:4]:\n    fig = px.pie(train, names=train[column].map({1: 'Healthy', 0: 'Injury'}), height=450, width= 450, color_discrete_sequence=['#E5E4E2','#71797E', '#D3D3D3'], \n             title=f' Pie-Chart of {column}')\n    fig.update_traces(textfont_size=15)\n    fig.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Checking (Kidney, Liver, Spleen) Organs Health in patients\nfor column in train.columns[4:]:\n    fig = px.pie(train, names=train[column].map({2: 'Healthy', 1: 'High Level Injury', 0: 'Low Level Injury'}), height=500, width= 500, color_discrete_sequence=['#E5E4E2','#71797E', '#D3D3D3'], \n             title=f' Pie-Chart of {column}')\n    fig.update_traces(textfont_size=15)\n    fig.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.histplot(train_series_meta['aortic_hu'],kde=True)\nplt.title('Histogram of volume of the Aorta in hounsfield units',fontsize=15)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_series_meta[train_series_meta['aortic_hu']<0]\n#removing all the non zero ones since they are error\nsns.histplot(np.abs(train_series_meta['aortic_hu']), kde=True)\nplt.title('Histplot of volume of the Aorta in hounsfield units',fontsize=15)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Checking whether organs scanned properly during scaning\nsns.set_style('whitegrid')\nfig,axes = plt.subplots(figsize=(6,6))\nax = sns.countplot(x='incomplete_organ',data=train_series_meta, palette=['#e3784d','#87ace8'])\nfor container in ax.containers:\n    ax.bar_label(container)\nplt.title('Organs not covered by the scan',fontsize=15)\nplt.show()\n\nfig = px.pie(train_series_meta, names=train_series_meta['incomplete_organ'].map({1: 'Organs covered by scan', 0: 'No organs covered by scan'}), height=550, width= 550,\n             color_discrete_sequence=['#D3D3D3','#71797E'], title='Organs covered during scan')\nfig.update_traces(textfont_size=15)\nfig.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"health_columns = [\"kidney\", \"liver\", \"spleen\"]\n\ncorrelation_matrix = train[health_columns].corr()\n\nsns.heatmap(correlation_matrix, annot=True, cmap=\"PuBu\", linewidths=.5)\nplt.title(\"Correlation Heatmap of Organs\")\nplt.show()\nsns.set_style('whitegrid')\nfig,axes = plt.subplots(figsize=(6,6))\nax = sns.countplot(x='injury_name',data=image_labels, palette=['#e3784d','#87ace8'])\nfor container in ax.containers:\n    ax.bar_label(container)\nplt.title('Count of different injury affected persons',fontsize=15)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"organ_columns = ['bowel', 'extravasation', 'kidney', 'liver', 'spleen']\n\norgan_counts = pd.DataFrame()\norgan_counts['Organ'] = train.columns[1:]\norgan_counts[\"count\"] = [0 for _ in range(organ_counts.shape[0])]\nfor index , column in enumerate(train.columns[1:]):\n    organ_counts['count'][index] = train[column].sum()\n    \nplt.figure(figsize=(10, 3))\nsns.barplot(data=organ_counts.sort_values(by=['count']), x='Organ', y='count')\nplt.xticks(rotation=90)\nplt.title(\"Distribution of Injury\")\nplt.xlabel(\"Injury --->\")\nplt.ylabel(\"Count --->\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.set_style('whitegrid')\nfig,axes = plt.subplots(figsize=(20,6))\nax = sns.countplot(x='SliceThickness',palette='rocket', data=train_dicom_tags)\nfor container in ax.containers:\n    ax.bar_label(container)\nplt.title('Slice Thickness',fontsize=15)\nplt.xticks(rotation=45)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Understanding dicom files and images","metadata":{}},{"cell_type":"code","source":"sample_image = \"/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images/35794/42578/140.dcm\"\ndef get_observation_data(path):\n    '''\n    Get information from the .dcm files\n    '''\n    dataset = pydicom.read_file(path)\n    \n    # Dictionary to store the information from the image\n    observation_data = {\n        \"Rows\" : dataset.get(\"Rows\"),\n        \"Columns\" : dataset.get(\"Columns\"),\n        \"SOPInstanceUID\" : dataset.get(\"SOPInstanceUID\"),\n        \"ContentDate\" : dataset.get(\"ContentDate\"),\n        \"SliceThickness\" : dataset.get(\"SliceThickness\"),\n        \"InstanceNumber\" : dataset.get(\"InstanceNumber\"),\n        \"ImagePositionPatient\" : dataset.get(\"ImagePositionPatient\"),\n        \"ImageOrientationPatient\" : dataset.get(\"ImageOrientationPatient\"),\n    }\n\n    # String columns\n    str_columns = [\"SOPInstanceUID\", \"ContentDate\", \n                   \"SliceThickness\", \"InstanceNumber\"]\n    for k in str_columns:\n        observation_data[k] = str(dataset.get(k)) if k in dataset else None\n\n    \n    return observation_data","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example = get_observation_data(sample_image)\npprint(example)\n#what is in a dicom file","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_image(Image_path):\n    ds = pydicom.dcmread(Image_path)\n    plt.imshow(ds.pixel_array, cmap=plt.cm.bone)\n    plt.show()\n    \nplot_image(sample_image)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -q keras-cv-attention-models\n!pip install -qU wandb\nimport os\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'  # to avoid too many logging messages\nimport pandas as pd, numpy as np, random, shutil\nimport tensorflow as tf, re, math\nimport tensorflow.keras.backend as K\nimport sklearn\nimport matplotlib.pyplot as plt\nimport tensorflow_addons as tfa\nimport tensorflow_probability as tfp\nimport wandb\nimport yaml\n\nfrom IPython import display as ipd\nfrom glob import glob\nfrom tqdm import tqdm\nfrom sklearn.model_selection import KFold, StratifiedKFold, GroupKFold, StratifiedGroupKFold\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.utils.class_weight import compute_class_weight","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**CNN(Convolution Neural Nreywork)**","metadata":{}},{"cell_type":"code","source":"import wandb\n\ntry:\n    from kaggle_secrets import UserSecretsClient\n    user_secrets = UserSecretsClient()\n    api_key = user_secrets.get_secret(\"WANDB\")\n\n    wandb.login(key=cc3fd1df8757bcdc52c3adf03ceb4155300f4038)\n    anonymous = None\nexcept:\n    anonymous = \"must\"\n    print('To use your W&B account,\\nGo to Add-ons -> Secrets and provide your W&B access token. Use the Label name as WANDB. \\nGet your W&B access token from here: https://wandb.ai/authorize')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CFG:\n    wandb         = True\n    competition   = 'rsna-atd' \n    _wandb_kernel = 'awsaf49'\n    debug         = False\n    comment       = 'EfficientNetV1B0-256x256-low_lr-vflip'\n    exp_name      = 'baseline-v4: new_ds + multi_head' # name of the experiment, folds will be grouped using 'exp_name'\n    \n    # use verbose=0 for silent, vebose=1 for interactive,\n    verbose      = 0\n    display_plot = True\n\n    # device\n    device = \"TPU-VM\" #or \"GPU\"\n\n    model_name = 'EfficientNetV1B0'\n\n    # seed for data-split, layer init, augs\n    seed = 42\n\n    # number of folds for data-split\n    folds = 4\n    \n    # which folds to train\n    selected_folds = [0, 1, 2]\n\n    # size of the image\n    img_size = [256, 256]\n#     eq_dim = np.prod(img_size)**0.5\n\n    # batch_size and epochs\n    batch_size = 48\n    epochs = 10\n\n    # loss\n    loss      = 'BCE & CCE'  # BCE, Focal\n    \n    # optimizer\n    optimizer = 'Adam'\n\n    # augmentation\n    augment   = True\n\n    # scale-shift-rotate-shear\n    transform = 0.90  # transform prob\n    fill_mode = 'constant'\n    rot    = 2.0\n    shr    = 2.0\n    hzoom  = 50.0\n    wzoom  = 50.0\n    hshift = 10.0\n    wshift = 10.0\n\n    # flip\n    hflip = True\n    vflip = True\n\n    # clip\n    clip = False\n\n    # lr-scheduler\n    scheduler   = 'cosine' # cosine\n\n    # dropout\n    drop_prob   = 0.6\n    drop_cnt    = 5\n    drop_size   = 0.05\n    \n    # cut-mix-up\n    mixup_prob = 0.0\n    mixup_alpha = 0.5\n    \n    cutmix_prob = 0.0\n    cutmix_alpha = 2.5\n\n    # pixel-augment\n    pixel_aug = 0.90  # prob of pixel_aug\n    sat  = [0.7, 1.3]\n    cont = [0.8, 1.2]\n    bri  = 0.15\n    hue  = 0.05\n\n    # test-time augs\n    tta = 1\n    \n    # target column\n    target_col  = [ \"bowel_injury\", \"extravasation_injury\", \"kidney_healthy\", \"kidney_low\",\n                   \"kidney_high\", \"liver_healthy\", \"liver_low\", \"liver_high\",\n                   \"spleen_healthy\", \"spleen_low\", \"spleen_high\"] # not using \"bowel_healthy\" & \"extravasation_healthy\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#seeding and radomising training data\ndef seeding(SEED):\n    np.random.seed(SEED)\n    random.seed(SEED)\n    os.environ['PYTHONHASHSEED'] = str(SEED)\n#     os.environ['TF_CUDNN_DETERMINISTIC'] = str(SEED)\n    tf.random.set_seed(SEED)\n    print('seeding done!!!')\nseeding(CFG.seed)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if \"TPU\" in CFG.device:\n    tpu = 'local' if CFG.device=='TPU-VM' else None\n    print(\"connecting to TPU...\")\n    try:\n        tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect(tpu=tpu)\n        strategy = tf.distribute.TPUStrategy(tpu)\n    except:\n        CFG.device = \"GPU\"\n        \nif CFG.device == \"GPU\"  or CFG.device==\"CPU\":\n    ngpu = len(tf.config.experimental.list_physical_devices('GPU'))\n    if ngpu>1:\n        print(\"Using multi GPU\")\n        strategy = tf.distribute.MirroredStrategy()\n    elif ngpu==1:\n        print(\"Using single GPU\")\n        strategy = tf.distribute.get_strategy()\n    else:\n        print(\"Using CPU\")\n        strategy = tf.distribute.get_strategy()\n        CFG.device = \"CPU\"\n\nif CFG.device == \"GPU\":\n    print(\"Num GPUs Available: \", ngpu)\n    \n\nAUTO     = tf.data.experimental.AUTOTUNE\nREPLICAS = strategy.num_replicas_in_sync\nprint(f'REPLICAS: {REPLICAS}')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BASE_PATH = f'/kaggle/input/rsna-atd-512x512-png-v2-dataset'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"rsna-atd.keras\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}