{
  "id": 362613,
  "title": "My learning experiment using data reduction",
  "url": "/competitions/rsna-2022-cervical-spine-fracture-detection/discussion/362613",
  "author_name": "Nghi Huynh",
  "post_date": "2022-10-28T05:27:34.636000",
  "votes": 5,
  "comment_count": 1,
  "views": 0,
  "content": "<p>First of all, I would like to thank the <strong>organizers</strong> and <strong>Kaggle</strong> team for hosting this competition, and congratulate to all the winners! I'm looking forward to learning more from their upcoming written-up solutions! Taking part in this competition was a great learning opportunity for me since I've been inspired a lot from previous RSNA top solutions. Thus, I wanted to try out a similar approach and see how it went in this competition. Even though I didn't get far in this competition, I still wanted to share my approach as a way to document my learning process. My approach was specifically inspired by the <a href=\"https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/193402\" target=\"_blank\">Fast GPU Experimentation Pipeline</a> by <a href=\"https://www.kaggle.com/cdeotte\" target=\"_blank\">Chris Deotte</a> and the 2-stage training strategies (<a href=\"https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/194145\" target=\"_blank\">1st place</a> and <a href=\"https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/193401\" target=\"_blank\">2nd place</a>) from <a href=\"https://www.kaggle.com/wowfattie\" target=\"_blank\">Guanshuo Xu</a> and <a href=\"https://www.kaggle.com/vaillant\" target=\"_blank\">Ian Pan</a>. </p>\n<hr>\n<p>Due to my computing and RAM limitations, I decided to only use <strong>26%</strong> of the train data (235 UIDs from bbox.csv + 295 other UIDs) to design my experiment pipeline. After analyzing a subset of data from bbox.csv, and segmentation data, I observed that cervical spines (C1-C7) are mostly present in the middle images. Moreover, the slice numbers are consistent with the z-position. Thus, I further reduced the data by selecting only <strong>30%</strong> of the middle images in each study instance. </p>\n<table>\n<thead>\n<tr>\n<th>Train data</th>\n<th>My experimental data</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>2019 Study Instance UIDs</td>\n<td>530 Study Instance UIDs</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Data preparation + preprocessing:</strong><br>\n<em>Image preprocessing:</em></p>\n<ul>\n<li>Resize all images to 512x512</li>\n<li>Stack neighbouring images with bone windowing (WL:400, WW:1800)</li>\n<li>Save as JPEG</li>\n<li>CenterCrop to 320x320 for training</li>\n</ul>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F6261540%2F06f8bc9059009e066da9420d14c9c226%2Fdata_preprocessing.png?generation=1666929011220015&amp;alt=media\" alt=\"\"></p>\n<p><em>Metadata preparation:</em></p>\n<ul>\n<li>Prepare metadata for training using bbox.csv and label all fracture slices with its exam-level cervical spine fracture labels (C1-C7) with an understanding that it would introduce noises during training. </li>\n</ul>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F6261540%2F10d8272d959bf0f46f1a492f98298650%2FScreen%20Shot%202022-10-28%20at%201.20.30%20AM.png?generation=1666934448784408&amp;alt=media\" alt=\"\"></p>\n<p><strong>Data splitting:</strong></p>\n<ul>\n<li>Create 4 folds using different random_seed and set aside 15% of the StudyInstanceUIDs for validation, and the rest for training and hyperparameters tuning.</li>\n</ul>\n<p><strong>Model architecture:</strong></p>\n<ul>\n<li><p><strong>Baseline</strong>: Convnext_base architecture with no pretrained weights.</p></li>\n<li><p><strong>CNN_LSTM</strong>: 2-stage training inspired by previous RSNA top solutions</p>\n<ul>\n<li><p><strong><em>Stage 1</em></strong>: Vertebrate fracture detection<br>\n      I used ConvNext_base pretrained with ImageNet1K for cervical spine fracture detection (from C1 to C7). Features were then extracted for all selected slices.</p></li>\n<li><p><strong><em>Stage 2</em></strong>: Patient overall detection<br>\n      I used the features extracted from the stage 1 model as an embedding for a bidirectional GRU to predict whether a given study has any fracture or not.</p></li></ul></li>\n</ul>\n<p><strong>Training setup:</strong></p>\n<ul>\n<li>Loss function: weighted log loss based on the competition metrics</li>\n</ul>\n<p><em>Baseline:</em></p>\n<ul>\n<li>Batch size: 32</li>\n<li>Weight decay: 0.01</li>\n<li>Number epochs: 15 </li>\n<li>Learning rate: one cycle policy  to progressively increase the lr from  1.0e-5 to 1.0e-4</li>\n<li>Optimizer: Adam </li>\n<li>Early stopping with patience: 3</li>\n</ul>\n<p><em>CNN_LSTM:</em></p>\n<ul>\n<li>Stage 1: same as the baseline</li>\n<li>Stage 2:<ul>\n<li>Batch size: 32</li>\n<li>Number epochs: 30</li>\n<li>Learning rate: 1.0e-5</li>\n<li>Optimizer: Adam optimizer with Step LR (step_size: 10, gamma:0.8)</li></ul></li>\n</ul>\n<p><strong>Results:</strong></p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>Model</th>\n<th></th>\n<th>CV</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Baseline</td>\n<td>convnext_base ensemble</td>\n<td></td>\n<td>0.6115</td>\n<td>0.5750</td>\n<td><strong>0.5965</strong></td>\n</tr>\n<tr>\n<td>Experiment</td>\n<td>convnext_base_lstm</td>\n<td>stage 1: vertebrate   fracture detection</td>\n<td>0.4978</td>\n<td><strong>0.5466</strong></td>\n<td>0.5975</td>\n</tr>\n<tr>\n<td></td>\n<td></td>\n<td>stage 2: patient overall detection</td>\n<td>0.6124</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n<hr>\n<p>Other things I tried but failed:</p>\n<ul>\n<li>used different preprocessing pipeline: stacking different bone-windowing, stacking neighbouring images only</li>\n<li>used additional information from vertebrate segmentation (I do think I made some logic bugs thus making the results much worst)</li>\n<li>used different pretrained models like Efficientnet_b4, Densenet_121, Resnet_50, Resnet_101 gave poorer results</li>\n<li>increased the training data to 40% of the train data, however the results did not improve. Due to my heuristic labeling, I believe that more noises were accumulated when I used more data. </li>\n</ul>\n<hr>\n<p>Thanks for reading!</p>",
  "messages": [
    {
      "id": 2007223,
      "postDate": "2022-10-28T05:27:34.637Z",
      "content": "<p>First of all, I would like to thank the <strong>organizers</strong> and <strong>Kaggle</strong> team for hosting this competition, and congratulate to all the winners! I'm looking forward to learning more from their upcoming written-up solutions! Taking part in this competition was a great learning opportunity for me since I've been inspired a lot from previous RSNA top solutions. Thus, I wanted to try out a similar approach and see how it went in this competition. Even though I didn't get far in this competition, I still wanted to share my approach as a way to document my learning process. My approach was specifically inspired by the <a href=\"https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/193402\" target=\"_blank\">Fast GPU Experimentation Pipeline</a> by <a href=\"https://www.kaggle.com/cdeotte\" target=\"_blank\">Chris Deotte</a> and the 2-stage training strategies (<a href=\"https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/194145\" target=\"_blank\">1st place</a> and <a href=\"https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/193401\" target=\"_blank\">2nd place</a>) from <a href=\"https://www.kaggle.com/wowfattie\" target=\"_blank\">Guanshuo Xu</a> and <a href=\"https://www.kaggle.com/vaillant\" target=\"_blank\">Ian Pan</a>. </p>\n<hr>\n<p>Due to my computing and RAM limitations, I decided to only use <strong>26%</strong> of the train data (235 UIDs from bbox.csv + 295 other UIDs) to design my experiment pipeline. After analyzing a subset of data from bbox.csv, and segmentation data, I observed that cervical spines (C1-C7) are mostly present in the middle images. Moreover, the slice numbers are consistent with the z-position. Thus, I further reduced the data by selecting only <strong>30%</strong> of the middle images in each study instance. </p>\n<table>\n<thead>\n<tr>\n<th>Train data</th>\n<th>My experimental data</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>2019 Study Instance UIDs</td>\n<td>530 Study Instance UIDs</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Data preparation + preprocessing:</strong><br>\n<em>Image preprocessing:</em></p>\n<ul>\n<li>Resize all images to 512x512</li>\n<li>Stack neighbouring images with bone windowing (WL:400, WW:1800)</li>\n<li>Save as JPEG</li>\n<li>CenterCrop to 320x320 for training</li>\n</ul>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F6261540%2F06f8bc9059009e066da9420d14c9c226%2Fdata_preprocessing.png?generation=1666929011220015&amp;alt=media\" alt=\"\"></p>\n<p><em>Metadata preparation:</em></p>\n<ul>\n<li>Prepare metadata for training using bbox.csv and label all fracture slices with its exam-level cervical spine fracture labels (C1-C7) with an understanding that it would introduce noises during training. </li>\n</ul>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F6261540%2F10d8272d959bf0f46f1a492f98298650%2FScreen%20Shot%202022-10-28%20at%201.20.30%20AM.png?generation=1666934448784408&amp;alt=media\" alt=\"\"></p>\n<p><strong>Data splitting:</strong></p>\n<ul>\n<li>Create 4 folds using different random_seed and set aside 15% of the StudyInstanceUIDs for validation, and the rest for training and hyperparameters tuning.</li>\n</ul>\n<p><strong>Model architecture:</strong></p>\n<ul>\n<li><p><strong>Baseline</strong>: Convnext_base architecture with no pretrained weights.</p></li>\n<li><p><strong>CNN_LSTM</strong>: 2-stage training inspired by previous RSNA top solutions</p>\n<ul>\n<li><p><strong><em>Stage 1</em></strong>: Vertebrate fracture detection<br>\n      I used ConvNext_base pretrained with ImageNet1K for cervical spine fracture detection (from C1 to C7). Features were then extracted for all selected slices.</p></li>\n<li><p><strong><em>Stage 2</em></strong>: Patient overall detection<br>\n      I used the features extracted from the stage 1 model as an embedding for a bidirectional GRU to predict whether a given study has any fracture or not.</p></li></ul></li>\n</ul>\n<p><strong>Training setup:</strong></p>\n<ul>\n<li>Loss function: weighted log loss based on the competition metrics</li>\n</ul>\n<p><em>Baseline:</em></p>\n<ul>\n<li>Batch size: 32</li>\n<li>Weight decay: 0.01</li>\n<li>Number epochs: 15 </li>\n<li>Learning rate: one cycle policy  to progressively increase the lr from  1.0e-5 to 1.0e-4</li>\n<li>Optimizer: Adam </li>\n<li>Early stopping with patience: 3</li>\n</ul>\n<p><em>CNN_LSTM:</em></p>\n<ul>\n<li>Stage 1: same as the baseline</li>\n<li>Stage 2:<ul>\n<li>Batch size: 32</li>\n<li>Number epochs: 30</li>\n<li>Learning rate: 1.0e-5</li>\n<li>Optimizer: Adam optimizer with Step LR (step_size: 10, gamma:0.8)</li></ul></li>\n</ul>\n<p><strong>Results:</strong></p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>Model</th>\n<th></th>\n<th>CV</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Baseline</td>\n<td>convnext_base ensemble</td>\n<td></td>\n<td>0.6115</td>\n<td>0.5750</td>\n<td><strong>0.5965</strong></td>\n</tr>\n<tr>\n<td>Experiment</td>\n<td>convnext_base_lstm</td>\n<td>stage 1: vertebrate   fracture detection</td>\n<td>0.4978</td>\n<td><strong>0.5466</strong></td>\n<td>0.5975</td>\n</tr>\n<tr>\n<td></td>\n<td></td>\n<td>stage 2: patient overall detection</td>\n<td>0.6124</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n<hr>\n<p>Other things I tried but failed:</p>\n<ul>\n<li>used different preprocessing pipeline: stacking different bone-windowing, stacking neighbouring images only</li>\n<li>used additional information from vertebrate segmentation (I do think I made some logic bugs thus making the results much worst)</li>\n<li>used different pretrained models like Efficientnet_b4, Densenet_121, Resnet_50, Resnet_101 gave poorer results</li>\n<li>increased the training data to 40% of the train data, however the results did not improve. Due to my heuristic labeling, I believe that more noises were accumulated when I used more data. </li>\n</ul>\n<hr>\n<p>Thanks for reading!</p>",
      "rawMarkdown": "First of all, I would like to thank the **organizers** and **Kaggle** team for hosting this competition, and congratulate to all the winners! I'm looking forward to learning more from their upcoming written-up solutions! Taking part in this competition was a great learning opportunity for me since I've been inspired a lot from previous RSNA top solutions. Thus, I wanted to try out a similar approach and see how it went in this competition. Even though I didn't get far in this competition, I still wanted to share my approach as a way to document my learning process. My approach was specifically inspired by the [Fast GPU Experimentation Pipeline](https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/193402) by [Chris Deotte](https://www.kaggle.com/cdeotte) and the 2-stage training strategies ([1st place](https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/194145) and [2nd place](https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/193401)) from [Guanshuo Xu](https://www.kaggle.com/wowfattie) and [Ian Pan](https://www.kaggle.com/vaillant). \n\n---\nDue to my computing and RAM limitations, I decided to only use **26%** of the train data (235 UIDs from bbox.csv + 295 other UIDs) to design my experiment pipeline. After analyzing a subset of data from bbox.csv, and segmentation data, I observed that cervical spines (C1-C7) are mostly present in the middle images. Moreover, the slice numbers are consistent with the z-position. Thus, I further reduced the data by selecting only **30%** of the middle images in each study instance. \n\n| Train data    | My experimental data |\n| ----------- | ----------- |\n| 2019 Study Instance UIDs     | 530 Study Instance UIDs       |\n\n\n**Data preparation + preprocessing:**\n*Image preprocessing:*\n* Resize all images to 512x512\n* Stack neighbouring images with bone windowing (WL:400, WW:1800)\n* Save as JPEG\n* CenterCrop to 320x320 for training\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F6261540%2F06f8bc9059009e066da9420d14c9c226%2Fdata_preprocessing.png?generation=1666929011220015&alt=media)\n\n*Metadata preparation:*\n* Prepare metadata for training using bbox.csv and label all fracture slices with its exam-level cervical spine fracture labels (C1-C7) with an understanding that it would introduce noises during training. \n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F6261540%2F10d8272d959bf0f46f1a492f98298650%2FScreen%20Shot%202022-10-28%20at%201.20.30%20AM.png?generation=1666934448784408&alt=media)\n\n\n**Data splitting:**\n\n* Create 4 folds using different random_seed and set aside 15% of the StudyInstanceUIDs for validation, and the rest for training and hyperparameters tuning.\n\n**Model architecture:**\n\n* **Baseline**: Convnext_base architecture with no pretrained weights.\n* **CNN_LSTM**: 2-stage training inspired by previous RSNA top solutions\n\n    - ***Stage 1***: Vertebrate fracture detection\n              I used ConvNext_base pretrained with ImageNet1K for cervical spine fracture detection (from C1 to C7). Features were then extracted for all selected slices.\n\n    - ***Stage 2***: Patient overall detection\n              I used the features extracted from the stage 1 model as an embedding for a bidirectional GRU to predict whether a given study has any fracture or not.\n\n**Training setup:**\n\n* Loss function: weighted log loss based on the competition metrics\n\n*Baseline:*\n* Batch size: 32\n* Weight decay: 0.01\n* Number epochs: 15 \n* Learning rate: one cycle policy  to progressively increase the lr from  1.0e-5 to 1.0e-4\n* Optimizer: Adam \n* Early stopping with patience: 3\n\n*CNN_LSTM:*\n* Stage 1: same as the baseline\n* Stage 2:\n  - Batch size: 32\n  - Number epochs: 30\n  - Learning rate: 1.0e-5\n  - Optimizer: Adam optimizer with Step LR (step_size: 10, gamma:0.8)\n\n**Results:**\n\n\n|            \t| Model             \t|                                          \t| CV                        \t| Public LB\t| Private LB \t|\n|------------\t|-------------------\t|------------------------------------------\t|---------------------------\t|--------\t|---------\t|\n| Baseline   \t| convnext_base ensemble \t|                                          \t| 0.6115                  \t| 0.5750\t| **0.5965**    \t|\n| Experiment \t| convnext_base_lstm     \t| stage 1: vertebrate   fracture detection \t|        0.4978           \t| **0.5466**   \t|0.5975    \t|\n|            \t|                   \t| stage 2: patient overall detection       \t|                  0.6124\t|        \t|         \t|\n\n---\n\nOther things I tried but failed:\n* used different preprocessing pipeline: stacking different bone-windowing, stacking neighbouring images only\n* used additional information from vertebrate segmentation (I do think I made some logic bugs thus making the results much worst)\n* used different pretrained models like Efficientnet_b4, Densenet_121, Resnet_50, Resnet_101 gave poorer results\n* increased the training data to 40% of the train data, however the results did not improve. Due to my heuristic labeling, I believe that more noises were accumulated when I used more data. \n\n---\n\nThanks for reading!\n\n",
      "votes": 5
    },
    {
      "id": 2013212,
      "postDate": "2022-11-01T18:11:55.617Z",
      "content": "<p>Thanx for sharing. Really in-depth and clean analysis <a href=\"https://www.kaggle.com/nghihuynh\" target=\"_blank\">@nghihuynh</a> </p>",
      "rawMarkdown": "Thanx for sharing. Really in-depth and clean analysis @nghihuynh ",
      "votes": 1
    }
  ],
  "comments": [
    {
      "id": 2013212,
      "author_name": "Allena Venkata Sai Abhishek",
      "author_url": "",
      "post_date": "2022-11-01T18:11:55.617000",
      "content": "<p>Thanx for sharing. Really in-depth and clean analysis <a href=\"https://www.kaggle.com/nghihuynh\" target=\"_blank\">@nghihuynh</a> </p>",
      "votes": 1,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "2007223": "First of all, I would like to thank the **organizers** and **Kaggle** team for hosting this competition, and congratulate to all the winners! I'm looking forward to learning more from their upcoming written-up solutions! Taking part in this competition was a great learning opportunity for me since I've been inspired a lot from previous RSNA top solutions. Thus, I wanted to try out a similar approach and see how it went in this competition. Even though I didn't get far in this competition, I still wanted to share my approach as a way to document my learning process. My approach was specifically inspired by the [Fast GPU Experimentation Pipeline](https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/193402) by [Chris Deotte](https://www.kaggle.com/cdeotte) and the 2-stage training strategies ([1st place](https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/194145) and [2nd place](https://www.kaggle.com/competitions/rsna-str-pulmonary-embolism-detection/discussion/193401)) from [Guanshuo Xu](https://www.kaggle.com/wowfattie) and [Ian Pan](https://www.kaggle.com/vaillant). \n\n---\nDue to my computing and RAM limitations, I decided to only use **26%** of the train data (235 UIDs from bbox.csv + 295 other UIDs) to design my experiment pipeline. After analyzing a subset of data from bbox.csv, and segmentation data, I observed that cervical spines (C1-C7) are mostly present in the middle images. Moreover, the slice numbers are consistent with the z-position. Thus, I further reduced the data by selecting only **30%** of the middle images in each study instance. \n\n| Train data    | My experimental data |\n| ----------- | ----------- |\n| 2019 Study Instance UIDs     | 530 Study Instance UIDs       |\n\n\n**Data preparation + preprocessing:**\n*Image preprocessing:*\n* Resize all images to 512x512\n* Stack neighbouring images with bone windowing (WL:400, WW:1800)\n* Save as JPEG\n* CenterCrop to 320x320 for training\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F6261540%2F06f8bc9059009e066da9420d14c9c226%2Fdata_preprocessing.png?generation=1666929011220015&alt=media)\n\n*Metadata preparation:*\n* Prepare metadata for training using bbox.csv and label all fracture slices with its exam-level cervical spine fracture labels (C1-C7) with an understanding that it would introduce noises during training. \n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F6261540%2F10d8272d959bf0f46f1a492f98298650%2FScreen%20Shot%202022-10-28%20at%201.20.30%20AM.png?generation=1666934448784408&alt=media)\n\n\n**Data splitting:**\n\n* Create 4 folds using different random_seed and set aside 15% of the StudyInstanceUIDs for validation, and the rest for training and hyperparameters tuning.\n\n**Model architecture:**\n\n* **Baseline**: Convnext_base architecture with no pretrained weights.\n* **CNN_LSTM**: 2-stage training inspired by previous RSNA top solutions\n\n    - ***Stage 1***: Vertebrate fracture detection\n              I used ConvNext_base pretrained with ImageNet1K for cervical spine fracture detection (from C1 to C7). Features were then extracted for all selected slices.\n\n    - ***Stage 2***: Patient overall detection\n              I used the features extracted from the stage 1 model as an embedding for a bidirectional GRU to predict whether a given study has any fracture or not.\n\n**Training setup:**\n\n* Loss function: weighted log loss based on the competition metrics\n\n*Baseline:*\n* Batch size: 32\n* Weight decay: 0.01\n* Number epochs: 15 \n* Learning rate: one cycle policy  to progressively increase the lr from  1.0e-5 to 1.0e-4\n* Optimizer: Adam \n* Early stopping with patience: 3\n\n*CNN_LSTM:*\n* Stage 1: same as the baseline\n* Stage 2:\n  - Batch size: 32\n  - Number epochs: 30\n  - Learning rate: 1.0e-5\n  - Optimizer: Adam optimizer with Step LR (step_size: 10, gamma:0.8)\n\n**Results:**\n\n\n|            \t| Model             \t|                                          \t| CV                        \t| Public LB\t| Private LB \t|\n|------------\t|-------------------\t|------------------------------------------\t|---------------------------\t|--------\t|---------\t|\n| Baseline   \t| convnext_base ensemble \t|                                          \t| 0.6115                  \t| 0.5750\t| **0.5965**    \t|\n| Experiment \t| convnext_base_lstm     \t| stage 1: vertebrate   fracture detection \t|        0.4978           \t| **0.5466**   \t|0.5975    \t|\n|            \t|                   \t| stage 2: patient overall detection       \t|                  0.6124\t|        \t|         \t|\n\n---\n\nOther things I tried but failed:\n* used different preprocessing pipeline: stacking different bone-windowing, stacking neighbouring images only\n* used additional information from vertebrate segmentation (I do think I made some logic bugs thus making the results much worst)\n* used different pretrained models like Efficientnet_b4, Densenet_121, Resnet_50, Resnet_101 gave poorer results\n* increased the training data to 40% of the train data, however the results did not improve. Due to my heuristic labeling, I believe that more noises were accumulated when I used more data. \n\n---\n\nThanks for reading!\n\n",
    "2013212": "Thanx for sharing. Really in-depth and clean analysis @nghihuynh "
  }
}