{
  "id": 118780,
  "title": "8th place solution + code",
  "url": "/competitions/rsna-intracranial-hemorrhage-detection/discussion/118780",
  "author_name": "Maciej Budyś",
  "post_date": "2019-11-24T13:46:58.345000",
  "votes": 17,
  "comment_count": 1,
  "views": 0,
  "content": "<p>First, I'd like to thank the whole team for the great collaboration: @meanshift, @tgilewicz, @nordberdt, @dmytropoplavskiy, it was a pleasure working with you on this competition. Following is a summary of our solution and experiments.</p>\n\n<p>Code: <a href=\"https://github.com/ambrzeski/kaggle-rsna-2019\">https://github.com/ambrzeski/kaggle-rsna-2019</a></p>\n\n<h1>Preprocessing</h1>\n\n<h2>Gantry tilt correction</h2>\n\n<p>In order to reduce the impact of radiation on patient’s eyes during head CT, sometimes scans are performed with a tilted gantry. Such studies have slices not aligned properly in the y axis, which causes the distortion in the 3D volume, visible on the sagittal view. To correct the distortion, slices must be shifted in the y axis with a shear transform. The angle of the shear can be determined from “Image Orientation (Patient)” DICOM field.</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F4d53a9260f20571c9869308cff6ff522%2Ftmp.png?generation=1574347411118888&amp;alt=media\" alt=\"\">\n<em>Saggital view before and after gantry tilt correction.</em></p>\n\n<p>We observed that gantry tilt is quite common in this dataset, occurring in more than 50% of studies in the train set and 90% in stage1 test set. We haven’t measured the impact of gantry tilt correction on models’ performance. Supposedly it doesn’t matter too much when inputting slices as channels to 2D model, but when using wider 3D context it could make a difference, especially considering the fact that the angle of the shear varies among studies.</p>\n\n<h2>Windowing</h2>\n\n<p>First, HU values were clipped to [-400, 1000] range. Then, instead of using fixed size windows, we apply a non-linear transform, which stretches out most valuable HU ranges and compresses less interesting ranges. The exact shape of the transform function is manually designed by us. We’ve tried modeling this function as a cumulative distribution function of histogram of pixel values in the dataset, but setting the values by hand allowed us to enhance specific ranges containing hemorrhages, and consequently worked slightly better.</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F73aee48d3ffbd4e946fddb9ffed245f6%2Fcdf.png?generation=1574347839604990&amp;alt=media\" alt=\"\">\n<em>Mapping from HU values to normalized values</em></p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2Fbfd8f13a2fad296ce7b15bc421a23b0a%2Ftmp2.png?generation=1574347948527157&amp;alt=media\" alt=\"\">\n<em>From left to right: image clipped to [-400, 1000] range, brain window (L:40, W:80), non-linear transform</em></p>\n\n<p>We’ve also tried fixed and learnable windows, but our non-linear transform gave the best results, while also being the most convenient to use.</p>\n\n<h1>Models</h1>\n\n<p>All of our models are various variants of 2D CNNs with consequent slices being fed to the network as image channels, predicting classes for the middle slice only. Models were trained on 5 folds with no patient overlap between folds. As an optimizer, we used RAdam. For data augmentation we used standard spatial transformations. Any transforms messing with pixel values resulted in a decrease in performance.</p>\n\n<p>For some of the models, slices (or groups of slices) were forwarded separately through the network backbone and their feature maps concatenated and combined by a convolutional layer. As such approach for 5 slices would increase 5x the training time, for the first 4 epochs, the model has been trained on the current slice only with weights of combining 3d convolution related to other slices set to 0. For two more epochs, the model has been trained on all 5 input slices. Combining model outputs improved results more (around 0.006-0.01) compared to multiple inputs to single model.</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F408f11eb7f3aed5077c61e42b9352bde%2Fd1.png?generation=1574348143538768&amp;alt=media\" alt=\"\"></p>\n\n<p>Summary of all the models in the ensemble is presented below.\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2Fec45c41cb7847d4f71d7291a026948fd%2FScreenshot_2019-11-21_16-06-37.png?generation=1574348844202508&amp;alt=media\" alt=\"\">\n*in stage2 we had a bug in validation, which may cause the results to be slightly inaccurate</p>\n\n<p>As many have noticed, scores on the final leaderboard are significantly lower than stage 1 leaderboard. We also observed a large divergence between model ranking on local cross-validation and private leaderboard. Specifically, simpler models, like resnet18, seem to perform better on private leaderboard, compared to more complex ones.</p>\n\n<h1>Segmentation masks</h1>\n\n<p>We hand-labeled 196 studies with segmentation masks. For the labeling we picked studies with the highest log loss on out-of-fold predictions. We’ve tried multi-task learning, using pre-computed mask as attention masks or additional features for a classifier, but all of these approaches failed to provide any significant boost to log loss metric. Anyway, we included one of the models trained with masks to a final ensemble, hoping to at least increase the variety within the ensemble. Segmentation based model performed slightly better on other metrics like F1.</p>\n\n<p>The model has been trained to do both classification and segmentation (for labeled samples), with segmentation samples oversampled for initial few epoch and switched to the original samples distribution after.</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F3e2561e87c2d3b3c4f9b9ccdc6408b0f%2Fd2.png?generation=1574349217941420&amp;alt=media\" alt=\"\"></p>\n\n<h1>TTA, ensembling and second-level model</h1>\n\n<p>For each model we perform 5-fold ensembling and test-time augmentations. Then, final predictions are obtained using a L2 linear model, which takes as an input 1st level predictions for 5 consecutive slices from each model and returns final predictions for a middle slice. The L2 model gives a very slight improvement (0.0002 difference from simple averaging on LB).</p>\n\n<h1>What didn’t work</h1>\n\n<ul>\n<li>We’ve tried transfer learning with 3D CNNs from <a href=\"https://github.com/Tencent/MedicalNet\">https://github.com/Tencent/MedicalNet</a>, but trainings were taking too much time and we had to abandon this idea, but it still might be worth trying given more time</li>\n<li>Experiments with segmentation masks</li>\n<li>Class balancing</li>\n<li>Multiple trainable windows</li>\n</ul>",
  "messages": [
    {
      "id": 680341,
      "postDate": "2019-11-24T13:46:58.347Z",
      "content": "<p>First, I'd like to thank the whole team for the great collaboration: @meanshift, @tgilewicz, @nordberdt, @dmytropoplavskiy, it was a pleasure working with you on this competition. Following is a summary of our solution and experiments.</p>\n\n<p>Code: <a href=\"https://github.com/ambrzeski/kaggle-rsna-2019\">https://github.com/ambrzeski/kaggle-rsna-2019</a></p>\n\n<h1>Preprocessing</h1>\n\n<h2>Gantry tilt correction</h2>\n\n<p>In order to reduce the impact of radiation on patient’s eyes during head CT, sometimes scans are performed with a tilted gantry. Such studies have slices not aligned properly in the y axis, which causes the distortion in the 3D volume, visible on the sagittal view. To correct the distortion, slices must be shifted in the y axis with a shear transform. The angle of the shear can be determined from “Image Orientation (Patient)” DICOM field.</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F4d53a9260f20571c9869308cff6ff522%2Ftmp.png?generation=1574347411118888&amp;alt=media\" alt=\"\">\n<em>Saggital view before and after gantry tilt correction.</em></p>\n\n<p>We observed that gantry tilt is quite common in this dataset, occurring in more than 50% of studies in the train set and 90% in stage1 test set. We haven’t measured the impact of gantry tilt correction on models’ performance. Supposedly it doesn’t matter too much when inputting slices as channels to 2D model, but when using wider 3D context it could make a difference, especially considering the fact that the angle of the shear varies among studies.</p>\n\n<h2>Windowing</h2>\n\n<p>First, HU values were clipped to [-400, 1000] range. Then, instead of using fixed size windows, we apply a non-linear transform, which stretches out most valuable HU ranges and compresses less interesting ranges. The exact shape of the transform function is manually designed by us. We’ve tried modeling this function as a cumulative distribution function of histogram of pixel values in the dataset, but setting the values by hand allowed us to enhance specific ranges containing hemorrhages, and consequently worked slightly better.</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F73aee48d3ffbd4e946fddb9ffed245f6%2Fcdf.png?generation=1574347839604990&amp;alt=media\" alt=\"\">\n<em>Mapping from HU values to normalized values</em></p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2Fbfd8f13a2fad296ce7b15bc421a23b0a%2Ftmp2.png?generation=1574347948527157&amp;alt=media\" alt=\"\">\n<em>From left to right: image clipped to [-400, 1000] range, brain window (L:40, W:80), non-linear transform</em></p>\n\n<p>We’ve also tried fixed and learnable windows, but our non-linear transform gave the best results, while also being the most convenient to use.</p>\n\n<h1>Models</h1>\n\n<p>All of our models are various variants of 2D CNNs with consequent slices being fed to the network as image channels, predicting classes for the middle slice only. Models were trained on 5 folds with no patient overlap between folds. As an optimizer, we used RAdam. For data augmentation we used standard spatial transformations. Any transforms messing with pixel values resulted in a decrease in performance.</p>\n\n<p>For some of the models, slices (or groups of slices) were forwarded separately through the network backbone and their feature maps concatenated and combined by a convolutional layer. As such approach for 5 slices would increase 5x the training time, for the first 4 epochs, the model has been trained on the current slice only with weights of combining 3d convolution related to other slices set to 0. For two more epochs, the model has been trained on all 5 input slices. Combining model outputs improved results more (around 0.006-0.01) compared to multiple inputs to single model.</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F408f11eb7f3aed5077c61e42b9352bde%2Fd1.png?generation=1574348143538768&amp;alt=media\" alt=\"\"></p>\n\n<p>Summary of all the models in the ensemble is presented below.\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2Fec45c41cb7847d4f71d7291a026948fd%2FScreenshot_2019-11-21_16-06-37.png?generation=1574348844202508&amp;alt=media\" alt=\"\">\n*in stage2 we had a bug in validation, which may cause the results to be slightly inaccurate</p>\n\n<p>As many have noticed, scores on the final leaderboard are significantly lower than stage 1 leaderboard. We also observed a large divergence between model ranking on local cross-validation and private leaderboard. Specifically, simpler models, like resnet18, seem to perform better on private leaderboard, compared to more complex ones.</p>\n\n<h1>Segmentation masks</h1>\n\n<p>We hand-labeled 196 studies with segmentation masks. For the labeling we picked studies with the highest log loss on out-of-fold predictions. We’ve tried multi-task learning, using pre-computed mask as attention masks or additional features for a classifier, but all of these approaches failed to provide any significant boost to log loss metric. Anyway, we included one of the models trained with masks to a final ensemble, hoping to at least increase the variety within the ensemble. Segmentation based model performed slightly better on other metrics like F1.</p>\n\n<p>The model has been trained to do both classification and segmentation (for labeled samples), with segmentation samples oversampled for initial few epoch and switched to the original samples distribution after.</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F3e2561e87c2d3b3c4f9b9ccdc6408b0f%2Fd2.png?generation=1574349217941420&amp;alt=media\" alt=\"\"></p>\n\n<h1>TTA, ensembling and second-level model</h1>\n\n<p>For each model we perform 5-fold ensembling and test-time augmentations. Then, final predictions are obtained using a L2 linear model, which takes as an input 1st level predictions for 5 consecutive slices from each model and returns final predictions for a middle slice. The L2 model gives a very slight improvement (0.0002 difference from simple averaging on LB).</p>\n\n<h1>What didn’t work</h1>\n\n<ul>\n<li>We’ve tried transfer learning with 3D CNNs from <a href=\"https://github.com/Tencent/MedicalNet\">https://github.com/Tencent/MedicalNet</a>, but trainings were taking too much time and we had to abandon this idea, but it still might be worth trying given more time</li>\n<li>Experiments with segmentation masks</li>\n<li>Class balancing</li>\n<li>Multiple trainable windows</li>\n</ul>",
      "rawMarkdown": "First, I'd like to thank the whole team for the great collaboration: @meanshift, @tgilewicz, @nordberdt, @dmytropoplavskiy, it was a pleasure working with you on this competition. Following is a summary of our solution and experiments.\n\nCode: https://github.com/ambrzeski/kaggle-rsna-2019\n\n# Preprocessing\n## Gantry tilt correction\nIn order to reduce the impact of radiation on patient’s eyes during head CT, sometimes scans are performed with a tilted gantry. Such studies have slices not aligned properly in the y axis, which causes the distortion in the 3D volume, visible on the sagittal view. To correct the distortion, slices must be shifted in the y axis with a shear transform. The angle of the shear can be determined from “Image Orientation (Patient)” DICOM field.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F4d53a9260f20571c9869308cff6ff522%2Ftmp.png?generation=1574347411118888&amp;alt=media)\n*Saggital view before and after gantry tilt correction.*\n\nWe observed that gantry tilt is quite common in this dataset, occurring in more than 50% of studies in the train set and 90% in stage1 test set. We haven’t measured the impact of gantry tilt correction on models’ performance. Supposedly it doesn’t matter too much when inputting slices as channels to 2D model, but when using wider 3D context it could make a difference, especially considering the fact that the angle of the shear varies among studies.\n\n## Windowing\nFirst, HU values were clipped to [-400, 1000] range. Then, instead of using fixed size windows, we apply a non-linear transform, which stretches out most valuable HU ranges and compresses less interesting ranges. The exact shape of the transform function is manually designed by us. We’ve tried modeling this function as a cumulative distribution function of histogram of pixel values in the dataset, but setting the values by hand allowed us to enhance specific ranges containing hemorrhages, and consequently worked slightly better.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F73aee48d3ffbd4e946fddb9ffed245f6%2Fcdf.png?generation=1574347839604990&amp;alt=media)\n*Mapping from HU values to normalized values*\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2Fbfd8f13a2fad296ce7b15bc421a23b0a%2Ftmp2.png?generation=1574347948527157&amp;alt=media)\n*From left to right: image clipped to [-400, 1000] range, brain window (L:40, W:80), non-linear transform*\n\nWe’ve also tried fixed and learnable windows, but our non-linear transform gave the best results, while also being the most convenient to use.\n\n# Models\nAll of our models are various variants of 2D CNNs with consequent slices being fed to the network as image channels, predicting classes for the middle slice only. Models were trained on 5 folds with no patient overlap between folds. As an optimizer, we used RAdam. For data augmentation we used standard spatial transformations. Any transforms messing with pixel values resulted in a decrease in performance.\n\nFor some of the models, slices (or groups of slices) were forwarded separately through the network backbone and their feature maps concatenated and combined by a convolutional layer. As such approach for 5 slices would increase 5x the training time, for the first 4 epochs, the model has been trained on the current slice only with weights of combining 3d convolution related to other slices set to 0. For two more epochs, the model has been trained on all 5 input slices. Combining model outputs improved results more (around 0.006-0.01) compared to multiple inputs to single model.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F408f11eb7f3aed5077c61e42b9352bde%2Fd1.png?generation=1574348143538768&amp;alt=media)\n\n\nSummary of all the models in the ensemble is presented below.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2Fec45c41cb7847d4f71d7291a026948fd%2FScreenshot_2019-11-21_16-06-37.png?generation=1574348844202508&amp;alt=media)\n*in stage2 we had a bug in validation, which may cause the results to be slightly inaccurate\n\nAs many have noticed, scores on the final leaderboard are significantly lower than stage 1 leaderboard. We also observed a large divergence between model ranking on local cross-validation and private leaderboard. Specifically, simpler models, like resnet18, seem to perform better on private leaderboard, compared to more complex ones.\n\n# Segmentation masks\nWe hand-labeled 196 studies with segmentation masks. For the labeling we picked studies with the highest log loss on out-of-fold predictions. We’ve tried multi-task learning, using pre-computed mask as attention masks or additional features for a classifier, but all of these approaches failed to provide any significant boost to log loss metric. Anyway, we included one of the models trained with masks to a final ensemble, hoping to at least increase the variety within the ensemble. Segmentation based model performed slightly better on other metrics like F1.\n\nThe model has been trained to do both classification and segmentation (for labeled samples), with segmentation samples oversampled for initial few epoch and switched to the original samples distribution after.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F3e2561e87c2d3b3c4f9b9ccdc6408b0f%2Fd2.png?generation=1574349217941420&amp;alt=media)\n\n# TTA, ensembling and second-level model\nFor each model we perform 5-fold ensembling and test-time augmentations. Then, final predictions are obtained using a L2 linear model, which takes as an input 1st level predictions for 5 consecutive slices from each model and returns final predictions for a middle slice. The L2 model gives a very slight improvement (0.0002 difference from simple averaging on LB).\n\n# What didn’t work\n- We’ve tried transfer learning with 3D CNNs from https://github.com/Tencent/MedicalNet, but trainings were taking too much time and we had to abandon this idea, but it still might be worth trying given more time\n- Experiments with segmentation masks\n- Class balancing\n- Multiple trainable windows\n\n",
      "votes": 17
    },
    {
      "id": 680729,
      "postDate": "2019-11-25T06:25:39.837Z",
      "rawMarkdown": "",
      "isDeleted": true
    }
  ],
  "comments": [
    {
      "id": 680729,
      "author_name": "",
      "author_url": "",
      "post_date": "2019-11-25T06:25:39.837000",
      "content": "",
      "votes": 0,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "680341": "First, I'd like to thank the whole team for the great collaboration: @meanshift, @tgilewicz, @nordberdt, @dmytropoplavskiy, it was a pleasure working with you on this competition. Following is a summary of our solution and experiments.\n\nCode: https://github.com/ambrzeski/kaggle-rsna-2019\n\n# Preprocessing\n## Gantry tilt correction\nIn order to reduce the impact of radiation on patient’s eyes during head CT, sometimes scans are performed with a tilted gantry. Such studies have slices not aligned properly in the y axis, which causes the distortion in the 3D volume, visible on the sagittal view. To correct the distortion, slices must be shifted in the y axis with a shear transform. The angle of the shear can be determined from “Image Orientation (Patient)” DICOM field.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F4d53a9260f20571c9869308cff6ff522%2Ftmp.png?generation=1574347411118888&amp;alt=media)\n*Saggital view before and after gantry tilt correction.*\n\nWe observed that gantry tilt is quite common in this dataset, occurring in more than 50% of studies in the train set and 90% in stage1 test set. We haven’t measured the impact of gantry tilt correction on models’ performance. Supposedly it doesn’t matter too much when inputting slices as channels to 2D model, but when using wider 3D context it could make a difference, especially considering the fact that the angle of the shear varies among studies.\n\n## Windowing\nFirst, HU values were clipped to [-400, 1000] range. Then, instead of using fixed size windows, we apply a non-linear transform, which stretches out most valuable HU ranges and compresses less interesting ranges. The exact shape of the transform function is manually designed by us. We’ve tried modeling this function as a cumulative distribution function of histogram of pixel values in the dataset, but setting the values by hand allowed us to enhance specific ranges containing hemorrhages, and consequently worked slightly better.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F73aee48d3ffbd4e946fddb9ffed245f6%2Fcdf.png?generation=1574347839604990&amp;alt=media)\n*Mapping from HU values to normalized values*\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2Fbfd8f13a2fad296ce7b15bc421a23b0a%2Ftmp2.png?generation=1574347948527157&amp;alt=media)\n*From left to right: image clipped to [-400, 1000] range, brain window (L:40, W:80), non-linear transform*\n\nWe’ve also tried fixed and learnable windows, but our non-linear transform gave the best results, while also being the most convenient to use.\n\n# Models\nAll of our models are various variants of 2D CNNs with consequent slices being fed to the network as image channels, predicting classes for the middle slice only. Models were trained on 5 folds with no patient overlap between folds. As an optimizer, we used RAdam. For data augmentation we used standard spatial transformations. Any transforms messing with pixel values resulted in a decrease in performance.\n\nFor some of the models, slices (or groups of slices) were forwarded separately through the network backbone and their feature maps concatenated and combined by a convolutional layer. As such approach for 5 slices would increase 5x the training time, for the first 4 epochs, the model has been trained on the current slice only with weights of combining 3d convolution related to other slices set to 0. For two more epochs, the model has been trained on all 5 input slices. Combining model outputs improved results more (around 0.006-0.01) compared to multiple inputs to single model.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F408f11eb7f3aed5077c61e42b9352bde%2Fd1.png?generation=1574348143538768&amp;alt=media)\n\n\nSummary of all the models in the ensemble is presented below.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2Fec45c41cb7847d4f71d7291a026948fd%2FScreenshot_2019-11-21_16-06-37.png?generation=1574348844202508&amp;alt=media)\n*in stage2 we had a bug in validation, which may cause the results to be slightly inaccurate\n\nAs many have noticed, scores on the final leaderboard are significantly lower than stage 1 leaderboard. We also observed a large divergence between model ranking on local cross-validation and private leaderboard. Specifically, simpler models, like resnet18, seem to perform better on private leaderboard, compared to more complex ones.\n\n# Segmentation masks\nWe hand-labeled 196 studies with segmentation masks. For the labeling we picked studies with the highest log loss on out-of-fold predictions. We’ve tried multi-task learning, using pre-computed mask as attention masks or additional features for a classifier, but all of these approaches failed to provide any significant boost to log loss metric. Anyway, we included one of the models trained with masks to a final ensemble, hoping to at least increase the variety within the ensemble. Segmentation based model performed slightly better on other metrics like F1.\n\nThe model has been trained to do both classification and segmentation (for labeled samples), with segmentation samples oversampled for initial few epoch and switched to the original samples distribution after.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F868944%2F3e2561e87c2d3b3c4f9b9ccdc6408b0f%2Fd2.png?generation=1574349217941420&amp;alt=media)\n\n# TTA, ensembling and second-level model\nFor each model we perform 5-fold ensembling and test-time augmentations. Then, final predictions are obtained using a L2 linear model, which takes as an input 1st level predictions for 5 consecutive slices from each model and returns final predictions for a middle slice. The L2 model gives a very slight improvement (0.0002 difference from simple averaging on LB).\n\n# What didn’t work\n- We’ve tried transfer learning with 3D CNNs from https://github.com/Tencent/MedicalNet, but trainings were taking too much time and we had to abandon this idea, but it still might be worth trying given more time\n- Experiments with segmentation masks\n- Class balancing\n- Multiple trainable windows\n\n",
    "680729": ""
  }
}