{
  "id": 666453,
  "title": "[Host Baseline] -- modified nnUNet 0.543 LB raw, 0.562 w/ post processing",
  "url": "/competitions/vesuvius-challenge-surface-detection/discussion/666453",
  "author_name": "Giorgio Angelotti",
  "post_date": "2026-01-07T08:54:42.835000",
  "votes": 28,
  "comment_count": 48,
  "views": 0,
  "content": "<p>We are already talked about our baseline in some comments across the Discussions. I imagine that at this point of the competition it would be better to condensate the knowledge in a pinned post.</p>\n<p>In the past days we had anticipated that our baseline reached 0.59 LB, but actually the metrics script used was different than the one that's running on Kaggle, which is doing a chunked computation for resource optimization.</p>\n<p><strong>Our Kaggle sandbox submission with our baseline reaches 0.543 LB (Public LB)</strong></p>\n<p><strong>With some prediction post processing the score gets up to 0.562 LB (Public LB)</strong></p>\n<p>Our baseline is greatly based on three works by the <a href=\"https://www.dkfz.de/en/medical-image-computing\" target=\"_blank\">MIC-DKFZ</a> lab, which at some point also independently submitted a solution on the old version of the dataset in this competition ( <a href=\"https://www.kaggle.com/fabianisensee\" target=\"_blank\">@fabianisensee</a> ).</p>\n<p>These three works are <a href=\"https://arxiv.org/pdf/2404.09556\" target=\"_blank\">nnUNetv2</a>, the <a href=\"https://arxiv.org/pdf/2404.03010\" target=\"_blank\">SkeletonRecall Loss</a> and <a href=\"https://github.com/MIC-DKFZ/batchgeneratorsv2\" target=\"_blank\">batchgeneratorsv2</a> .</p>\n<p>The architecture of the baseline is a nnUNetv2, trained with this <code>3d_fullres</code> plan:</p>\n<pre><code>        \"3d_fullres\": {\n            \"data_identifier\": \"nnUNetPlans_3d_fullres\",\n            \"preprocessor_name\": \"DefaultPreprocessor\",\n            \"batch_size\": 2,\n            \"patch_size\": [\n                192,\n                192,\n                192\n            ],\n            \"spacing\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"normalization_schemes\": [\n                \"ZScoreNormalization\"\n            ],\n            \"use_mask_for_norm\": [\n                false\n            ],\n            \"resampling_fn_data\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_seg\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_data_kwargs\": {\n                \"is_seg\": false,\n                \"order\": 3,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"resampling_fn_seg_kwargs\": {\n                \"is_seg\": true,\n                \"order\": 1,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"resampling_fn_probabilities\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_probabilities_kwargs\": {\n                \"is_seg\": false,\n                \"order\": 1,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"architecture\": {\n                \"network_class_name\": \"dynamic_network_architectures.architectures.unet.ResidualEncoderUNet\",\n                \"arch_kwargs\": {\n                    \"n_stages\": 6,\n                    \"features_per_stage\": [\n                        32,\n                        64,\n                        128,\n                        256,\n                        320,\n                        320\n                    ],\n                    \"conv_op\": \"torch.nn.modules.conv.Conv3d\",\n                    \"kernel_sizes\": [\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ]\n                    ],\n                    \"strides\": [\n                        [\n                            1,\n                            1,\n                            1\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ]\n                    ],\n                    \"n_blocks_per_stage\": [\n                        1,\n                        3,\n                        4,\n                        6,\n                        6,\n                        6\n                    ],\n                    \"n_conv_per_stage_decoder\": [\n                        1,\n                        1,\n                        1,\n                        1,\n                        1\n                    ],\n                    \"conv_bias\": true,\n                    \"norm_op\": \"torch.nn.modules.instancenorm.InstanceNorm3d\",\n                    \"norm_op_kwargs\": {\n                        \"eps\": 1e-05,\n                        \"affine\": true\n                    },\n                    \"dropout_op\": null,\n                    \"dropout_op_kwargs\": null,\n                    \"nonlin\": \"torch.nn.LeakyReLU\",\n                    \"nonlin_kwargs\": {\n                        \"inplace\": true\n                    }\n                },\n                \"_kw_requires_import\": [\n                    \"conv_op\",\n                    \"norm_op\",\n                    \"dropout_op\",\n                    \"nonlin\"\n                ]\n            },\n            \"batch_dice\": false\n        }\n    }\n</code></pre>\n<p>As a custom trainer/loss, we used the <code>MedialSurfaceRecall</code> trainer defined <a href=\"https://github.com/ScrollPrize/villa/blob/main/segmentation/models/arch/nnunet/nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerSkeletonRecall.py\" target=\"_blank\">in this repository</a>, which is a modified version of the <code>SkeletonRecall trainer</code>. Our version, instead of computing a 3D tree-like skeleton, tries to approximate (with some impurities) the medial surface of the labels by just aggregating per-slice 2D skeletonizations across the 3 different axes. This loss helps fighting the creation of holes in the predictions, making the output look more sheet-like, at the expenses of having some more mergers, especially in more \"packed\" regions.</p>\n<p>During training, some custom augmentation were introduced <a href=\"https://github.com/ScrollPrize/villa/tree/main/segmentation/models/batchgeneratorsv2\" target=\"_blank\">in this edited version</a> of <code>batchgeneratorsv2</code>.</p>\n<p>The model was trained for about <code>1200 epochs</code> with a <code>starting learning rate of 0.01</code>.</p>\n<p>As an additional post-processing step, which boosted the Public LB from 0.543 LB to 0.562 LB, we thresholded the softmax output at <code>0.75</code>, and run on it a modified Frangi filter that enhances <strong>surfaceness</strong> rather than <strong>vesselness</strong> (it's basically the same, but with a different handling of the eigenvalues in the formula).</p>\n<p>We know that many of you already developed some solutions which fare better than this, and we hope that our knowledge can help you develop even more performing solutions (we didn't want to share it at the beginning of the challenge to avoid constraining your creativity on a particular road, rather than have you trying more exotic solutions 😃 . I am very curious to see the results of what <a href=\"https://www.kaggle.com/hengck23\" target=\"_blank\">@hengck23</a> and <a href=\"https://www.kaggle.com/tom99763\" target=\"_blank\">@tom99763</a> are doing to be honest ahah 👀)</p>\n<p>For more details, <a href=\"https://www.kaggle.com/seanjohnsonsp\" target=\"_blank\">@seanjohnsonsp</a> (who took care of the development of the baseline), will be happy to answer your questions!</p>",
  "messages": [
    {
      "id": 3387544,
      "postDate": "2026-01-07T08:54:42.837Z",
      "content": "<p>We are already talked about our baseline in some comments across the Discussions. I imagine that at this point of the competition it would be better to condensate the knowledge in a pinned post.</p>\n<p>In the past days we had anticipated that our baseline reached 0.59 LB, but actually the metrics script used was different than the one that's running on Kaggle, which is doing a chunked computation for resource optimization.</p>\n<p><strong>Our Kaggle sandbox submission with our baseline reaches 0.543 LB (Public LB)</strong></p>\n<p><strong>With some prediction post processing the score gets up to 0.562 LB (Public LB)</strong></p>\n<p>Our baseline is greatly based on three works by the <a href=\"https://www.dkfz.de/en/medical-image-computing\" target=\"_blank\">MIC-DKFZ</a> lab, which at some point also independently submitted a solution on the old version of the dataset in this competition ( <a href=\"https://www.kaggle.com/fabianisensee\" target=\"_blank\">@fabianisensee</a> ).</p>\n<p>These three works are <a href=\"https://arxiv.org/pdf/2404.09556\" target=\"_blank\">nnUNetv2</a>, the <a href=\"https://arxiv.org/pdf/2404.03010\" target=\"_blank\">SkeletonRecall Loss</a> and <a href=\"https://github.com/MIC-DKFZ/batchgeneratorsv2\" target=\"_blank\">batchgeneratorsv2</a> .</p>\n<p>The architecture of the baseline is a nnUNetv2, trained with this <code>3d_fullres</code> plan:</p>\n<pre><code>        \"3d_fullres\": {\n            \"data_identifier\": \"nnUNetPlans_3d_fullres\",\n            \"preprocessor_name\": \"DefaultPreprocessor\",\n            \"batch_size\": 2,\n            \"patch_size\": [\n                192,\n                192,\n                192\n            ],\n            \"spacing\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"normalization_schemes\": [\n                \"ZScoreNormalization\"\n            ],\n            \"use_mask_for_norm\": [\n                false\n            ],\n            \"resampling_fn_data\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_seg\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_data_kwargs\": {\n                \"is_seg\": false,\n                \"order\": 3,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"resampling_fn_seg_kwargs\": {\n                \"is_seg\": true,\n                \"order\": 1,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"resampling_fn_probabilities\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_probabilities_kwargs\": {\n                \"is_seg\": false,\n                \"order\": 1,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"architecture\": {\n                \"network_class_name\": \"dynamic_network_architectures.architectures.unet.ResidualEncoderUNet\",\n                \"arch_kwargs\": {\n                    \"n_stages\": 6,\n                    \"features_per_stage\": [\n                        32,\n                        64,\n                        128,\n                        256,\n                        320,\n                        320\n                    ],\n                    \"conv_op\": \"torch.nn.modules.conv.Conv3d\",\n                    \"kernel_sizes\": [\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ]\n                    ],\n                    \"strides\": [\n                        [\n                            1,\n                            1,\n                            1\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ]\n                    ],\n                    \"n_blocks_per_stage\": [\n                        1,\n                        3,\n                        4,\n                        6,\n                        6,\n                        6\n                    ],\n                    \"n_conv_per_stage_decoder\": [\n                        1,\n                        1,\n                        1,\n                        1,\n                        1\n                    ],\n                    \"conv_bias\": true,\n                    \"norm_op\": \"torch.nn.modules.instancenorm.InstanceNorm3d\",\n                    \"norm_op_kwargs\": {\n                        \"eps\": 1e-05,\n                        \"affine\": true\n                    },\n                    \"dropout_op\": null,\n                    \"dropout_op_kwargs\": null,\n                    \"nonlin\": \"torch.nn.LeakyReLU\",\n                    \"nonlin_kwargs\": {\n                        \"inplace\": true\n                    }\n                },\n                \"_kw_requires_import\": [\n                    \"conv_op\",\n                    \"norm_op\",\n                    \"dropout_op\",\n                    \"nonlin\"\n                ]\n            },\n            \"batch_dice\": false\n        }\n    }\n</code></pre>\n<p>As a custom trainer/loss, we used the <code>MedialSurfaceRecall</code> trainer defined <a href=\"https://github.com/ScrollPrize/villa/blob/main/segmentation/models/arch/nnunet/nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerSkeletonRecall.py\" target=\"_blank\">in this repository</a>, which is a modified version of the <code>SkeletonRecall trainer</code>. Our version, instead of computing a 3D tree-like skeleton, tries to approximate (with some impurities) the medial surface of the labels by just aggregating per-slice 2D skeletonizations across the 3 different axes. This loss helps fighting the creation of holes in the predictions, making the output look more sheet-like, at the expenses of having some more mergers, especially in more \"packed\" regions.</p>\n<p>During training, some custom augmentation were introduced <a href=\"https://github.com/ScrollPrize/villa/tree/main/segmentation/models/batchgeneratorsv2\" target=\"_blank\">in this edited version</a> of <code>batchgeneratorsv2</code>.</p>\n<p>The model was trained for about <code>1200 epochs</code> with a <code>starting learning rate of 0.01</code>.</p>\n<p>As an additional post-processing step, which boosted the Public LB from 0.543 LB to 0.562 LB, we thresholded the softmax output at <code>0.75</code>, and run on it a modified Frangi filter that enhances <strong>surfaceness</strong> rather than <strong>vesselness</strong> (it's basically the same, but with a different handling of the eigenvalues in the formula).</p>\n<p>We know that many of you already developed some solutions which fare better than this, and we hope that our knowledge can help you develop even more performing solutions (we didn't want to share it at the beginning of the challenge to avoid constraining your creativity on a particular road, rather than have you trying more exotic solutions 😃 . I am very curious to see the results of what <a href=\"https://www.kaggle.com/hengck23\" target=\"_blank\">@hengck23</a> and <a href=\"https://www.kaggle.com/tom99763\" target=\"_blank\">@tom99763</a> are doing to be honest ahah 👀)</p>\n<p>For more details, <a href=\"https://www.kaggle.com/seanjohnsonsp\" target=\"_blank\">@seanjohnsonsp</a> (who took care of the development of the baseline), will be happy to answer your questions!</p>",
      "rawMarkdown": "We are already talked about our baseline in some comments across the Discussions. I imagine that at this point of the competition it would be better to condensate the knowledge in a pinned post.\n\nIn the past days we had anticipated that our baseline reached 0.59 LB, but actually the metrics script used was different than the one that's running on Kaggle, which is doing a chunked computation for resource optimization.\n\n**Our Kaggle sandbox submission with our baseline reaches 0.543 LB (Public LB)**\n\n**With some prediction post processing the score gets up to 0.562 LB (Public LB)**\n\nOur baseline is greatly based on three works by the [MIC-DKFZ](https://www.dkfz.de/en/medical-image-computing) lab, which at some point also independently submitted a solution on the old version of the dataset in this competition ( @fabianisensee ).\n\nThese three works are [nnUNetv2](https://arxiv.org/pdf/2404.09556), the [SkeletonRecall Loss](https://arxiv.org/pdf/2404.03010) and [batchgeneratorsv2](https://github.com/MIC-DKFZ/batchgeneratorsv2) .\n\nThe architecture of the baseline is a nnUNetv2, trained with this `3d_fullres` plan:\n```python\n        \"3d_fullres\": {\n            \"data_identifier\": \"nnUNetPlans_3d_fullres\",\n            \"preprocessor_name\": \"DefaultPreprocessor\",\n            \"batch_size\": 2,\n            \"patch_size\": [\n                192,\n                192,\n                192\n            ],\n            \"spacing\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"normalization_schemes\": [\n                \"ZScoreNormalization\"\n            ],\n            \"use_mask_for_norm\": [\n                false\n            ],\n            \"resampling_fn_data\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_seg\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_data_kwargs\": {\n                \"is_seg\": false,\n                \"order\": 3,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"resampling_fn_seg_kwargs\": {\n                \"is_seg\": true,\n                \"order\": 1,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"resampling_fn_probabilities\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_probabilities_kwargs\": {\n                \"is_seg\": false,\n                \"order\": 1,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"architecture\": {\n                \"network_class_name\": \"dynamic_network_architectures.architectures.unet.ResidualEncoderUNet\",\n                \"arch_kwargs\": {\n                    \"n_stages\": 6,\n                    \"features_per_stage\": [\n                        32,\n                        64,\n                        128,\n                        256,\n                        320,\n                        320\n                    ],\n                    \"conv_op\": \"torch.nn.modules.conv.Conv3d\",\n                    \"kernel_sizes\": [\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ]\n                    ],\n                    \"strides\": [\n                        [\n                            1,\n                            1,\n                            1\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ]\n                    ],\n                    \"n_blocks_per_stage\": [\n                        1,\n                        3,\n                        4,\n                        6,\n                        6,\n                        6\n                    ],\n                    \"n_conv_per_stage_decoder\": [\n                        1,\n                        1,\n                        1,\n                        1,\n                        1\n                    ],\n                    \"conv_bias\": true,\n                    \"norm_op\": \"torch.nn.modules.instancenorm.InstanceNorm3d\",\n                    \"norm_op_kwargs\": {\n                        \"eps\": 1e-05,\n                        \"affine\": true\n                    },\n                    \"dropout_op\": null,\n                    \"dropout_op_kwargs\": null,\n                    \"nonlin\": \"torch.nn.LeakyReLU\",\n                    \"nonlin_kwargs\": {\n                        \"inplace\": true\n                    }\n                },\n                \"_kw_requires_import\": [\n                    \"conv_op\",\n                    \"norm_op\",\n                    \"dropout_op\",\n                    \"nonlin\"\n                ]\n            },\n            \"batch_dice\": false\n        }\n    }\n```\n\nAs a custom trainer/loss, we used the `MedialSurfaceRecall` trainer defined [in this repository](https://github.com/ScrollPrize/villa/blob/main/segmentation/models/arch/nnunet/nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerSkeletonRecall.py), which is a modified version of the `SkeletonRecall trainer`. Our version, instead of computing a 3D tree-like skeleton, tries to approximate (with some impurities) the medial surface of the labels by just aggregating per-slice 2D skeletonizations across the 3 different axes. This loss helps fighting the creation of holes in the predictions, making the output look more sheet-like, at the expenses of having some more mergers, especially in more \"packed\" regions.\n\nDuring training, some custom augmentation were introduced [in this edited version](https://github.com/ScrollPrize/villa/tree/main/segmentation/models/batchgeneratorsv2) of `batchgeneratorsv2`.\n\nThe model was trained for about `1200 epochs` with a `starting learning rate of 0.01 `.\n\nAs an additional post-processing step, which boosted the Public LB from 0.543 LB to 0.562 LB, we thresholded the softmax output at `0.75`, and run on it a modified Frangi filter that enhances **surfaceness** rather than **vesselness** (it's basically the same, but with a different handling of the eigenvalues in the formula).\n\nWe know that many of you already developed some solutions which fare better than this, and we hope that our knowledge can help you develop even more performing solutions (we didn't want to share it at the beginning of the challenge to avoid constraining your creativity on a particular road, rather than have you trying more exotic solutions 😃 . I am very curious to see the results of what @hengck23 and @tom99763 are doing to be honest ahah 👀)\n\nFor more details, @seanjohnsonsp (who took care of the development of the baseline), will be happy to answer your questions!",
      "votes": 28
    },
    {
      "id": 3387614,
      "postDate": "2026-01-07T11:29:59.033Z",
      "content": "<p>I find this post highly demotivating. Whats the point in having worked on this problem, when you (as host) share a recipe in the last third of the competition which achieves a Top10 LB. You are constraining creativity so much with this. </p>",
      "rawMarkdown": "I find this post highly demotivating. Whats the point in having worked on this problem, when you (as host) share a recipe in the last third of the competition which achieves a Top10 LB. You are constraining creativity so much with this. ",
      "votes": 23,
      "replies": [
        {
          "id": 3387647,
          "postDate": "2026-01-07T12:00:07.837Z",
          "content": "<p>Thanks for the feedback. I understand how a strong baseline shared mid‑competition can feel discouraging after you’ve invested a lot of effort.</p>\n<p>A couple clarifications: this isn’t meant as a “winning recipe,” it’s a reference point. It scores 0.543 / 0.562 on the public LB, and several teams (including yours) are already ahead of it; it may also rank very differently on the private evaluation.</p>\n<p>We intentionally didn’t pin a baseline at the start because we didn’t want everyone to default to nnU‑Net immediately. I am confident that the top solutions will be much more creative than that! Our implementation has been public in our repo, but we’re surfacing it now in one place for transparency and to give everyone a shared benchmark. Eventually, the goal (for us) is the strongest final solution, and a reproducible baseline helps people compare ideas and push beyond it, not replace the work already done or constrain creativity.</p>",
          "rawMarkdown": "Thanks for the feedback. I understand how a strong baseline shared mid‑competition can feel discouraging after you’ve invested a lot of effort.\n\nA couple clarifications: this isn’t meant as a “winning recipe,” it’s a reference point. It scores 0.543 / 0.562 on the public LB, and several teams (including yours) are already ahead of it; it may also rank very differently on the private evaluation.\n\nWe intentionally didn’t pin a baseline at the start because we didn’t want everyone to default to nnU‑Net immediately. I am confident that the top solutions will be much more creative than that! Our implementation has been public in our repo, but we’re surfacing it now in one place for transparency and to give everyone a shared benchmark. Eventually, the goal (for us) is the strongest final solution, and a reproducible baseline helps people compare ideas and push beyond it, not replace the work already done or constrain creativity.",
          "votes": 1,
          "replies": [
            {
              "id": 3387657,
              "postDate": "2026-01-07T12:24:01.500Z",
              "content": "<p>Hi <a href=\"https://www.kaggle.com/giorgioangelotti\" target=\"_blank\">@giorgioangelotti</a>, I really respect  all of your effort for hosting this competition. </p>\n<p>However, I think it's about fairness. It would be much better if you post all of the great baseiline/ideas at the early stages of the competition.The update of the dataset, along with all of the posts, makes the effort in the first 50 days meanless. </p>",
              "rawMarkdown": "Hi @giorgioangelotti, I really respect  all of your effort for hosting this competition. \n\nHowever, I think it's about fairness. It would be much better if you post all of the great baseiline/ideas at the early stages of the competition.The update of the dataset, along with all of the posts, makes the effort in the first 50 days meanless. "
            }
          ]
        },
        {
          "id": 3387705,
          "postDate": "2026-01-07T14:09:23.967Z",
          "content": "<p>Tbh it's not fair to publish a top 10 lb baseline mid competition, but for this case nnUNet performs well was already known and even public notebooks are available which were top 10.</p>",
          "rawMarkdown": "Tbh it's not fair to publish a top 10 lb baseline mid competition, but for this case nnUNet performs well was already known and even public notebooks are available which were top 10.",
          "votes": 10
        },
        {
          "id": 3387798,
          "postDate": "2026-01-07T16:26:34.833Z",
          "rawMarkdown": "",
          "votes": -1,
          "isDeleted": true
        },
        {
          "id": 3388061,
          "postDate": "2026-01-08T04:46:50.970Z",
          "rawMarkdown": "",
          "votes": -2,
          "isDeleted": true
        }
      ]
    },
    {
      "id": 3387648,
      "postDate": "2026-01-07T12:03:25.800Z",
      "content": "<p>Thanks for clarifying the 0.59 discrepancy, <a href=\"https://www.kaggle.com/giorgioangelotti\" target=\"_blank\">@giorgioangelotti</a> and <a href=\"https://www.kaggle.com/seanjohnsonsp\" target=\"_blank\">@seanjohnsonsp</a>! Nice to see that teams are already above the baseline, it would be a bummer if no one were able to have higher scores than your baseline work.\nOn the “creativity” discussion , I don’t really agree that this is a problem. nnU-Net approaches are already widely known in competitions, have been shared in public notebooks, and even the MIC-DKFZ team is competing 🙌.\nTiming can feel frustrating, and maybe sharing it earlier would have helped to push further towards the main goal. Still, I appreciate for sharing!</p>\n<p>Happy Kaggling to all</p>",
      "rawMarkdown": "Thanks for clarifying the 0.59 discrepancy, @giorgioangelotti and @seanjohnsonsp! Nice to see that teams are already above the baseline, it would be a bummer if no one were able to have higher scores than your baseline work.\nOn the “creativity” discussion , I don’t really agree that this is a problem. nnU-Net approaches are already widely known in competitions, have been shared in public notebooks, and even the MIC-DKFZ team is competing 🙌.\nTiming can feel frustrating, and maybe sharing it earlier would have helped to push further towards the main goal. Still, I appreciate for sharing!\n\nHappy Kaggling to all",
      "votes": 8
    },
    {
      "id": 3387597,
      "postDate": "2026-01-07T11:06:25.960Z",
      "content": "<p>We ran training using the fully preset nnUNetv2 model with a patch size of 128 and performed post-processing, achieving a score of 0.562. VRAM usage was approximately 9GB, and training took about 40,000 seconds on a 5090 GPU.</p>",
      "rawMarkdown": "We ran training using the fully preset nnUNetv2 model with a patch size of 128 and performed post-processing, achieving a score of 0.562. VRAM usage was approximately 9GB, and training took about 40,000 seconds on a 5090 GPU.",
      "votes": 7,
      "replies": [
        {
          "id": 3387859,
          "postDate": "2026-01-07T17:49:59.107Z",
          "content": "<p>Without nnunet, any luck with own custom pipeline? I was trying <a href=\"https://www.kaggle.com/code/jirkaborovec/surface-train-inference-3d-segm-gpu-augment\" target=\"_blank\">this</a>, but the local score seems not that good.</p>",
          "rawMarkdown": "Without nnunet, any luck with own custom pipeline? I was trying [this](https://www.kaggle.com/code/jirkaborovec/surface-train-inference-3d-segm-gpu-augment), but the local score seems not that good."
        },
        {
          "id": 3389863,
          "postDate": "2026-01-12T05:12:17.243Z",
          "content": "<p>what about the loss fn?</p>",
          "rawMarkdown": "what about the loss fn?",
          "votes": 1
        }
      ]
    },
    {
      "id": 3405060,
      "postDate": "2026-02-12T01:11:16.457Z",
      "content": "<p>Out of curiosity, what is the score with the updated test?</p>",
      "rawMarkdown": "Out of curiosity, what is the score with the updated test?",
      "votes": 2,
      "replies": [
        {
          "id": 3405179,
          "postDate": "2026-02-12T10:55:26.497Z",
          "content": "<p>0.562 from my result</p>",
          "rawMarkdown": "0.562 from my result",
          "votes": 1
        },
        {
          "id": 3405344,
          "postDate": "2026-02-12T19:38:20.847Z",
          "content": "<p>0.546 without post processing, 0.567 with post processing</p>",
          "rawMarkdown": "0.546 without post processing, 0.567 with post processing",
          "votes": 6
        }
      ]
    },
    {
      "id": 3387747,
      "postDate": "2026-01-07T15:22:35.913Z",
      "content": "<p>FYI. I won <strong>LB.543 with TransUNet</strong> (I won't go into details as the competition is nearing the end, about a month in). </p>\n<p>A quick internet survey also showed some papers showing that <strong>TransUnet</strong> is superior to <strong>nnUnet.</strong> Therefore, I don't think it's clear which architecture will ultimately win.\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3802145%2Fb1e7c7abf2cc26f66677c94416110f25%2F2026-01-08%20000050.png?generation=1767798662840702&amp;alt=media\" alt=\"\">\n<a href=\"https://arxiv.org/pdf/2310.07781\" target=\"_blank\">https://arxiv.org/pdf/2310.07781</a></p>",
      "rawMarkdown": "FYI. I won **LB.543 with TransUNet** (I won't go into details as the competition is nearing the end, about a month in). \n\nA quick internet survey also showed some papers showing that **TransUnet** is superior to **nnUnet.** Therefore, I don't think it's clear which architecture will ultimately win.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3802145%2Fb1e7c7abf2cc26f66677c94416110f25%2F2026-01-08%20000050.png?generation=1767798662840702&alt=media)\nhttps://arxiv.org/pdf/2310.07781",
      "votes": 3,
      "replies": [
        {
          "id": 3387751,
          "postDate": "2026-01-07T15:26:44.043Z",
          "content": "<p>Maybe if we try and use strides, convs, and all other possible minor components specially designed for this problem, like nnUNet does in TranUNet, we might get better results.</p>",
          "rawMarkdown": "Maybe if we try and use strides, convs, and all other possible minor components specially designed for this problem, like nnUNet does in TranUNet, we might get better results.",
          "votes": 1,
          "replies": [
            {
              "id": 3388099,
              "postDate": "2026-01-08T07:07:41.443Z",
              "content": "<p>One thing I always imagined could help, but I never tried, are <a href=\"https://arxiv.org/pdf/1703.06211\" target=\"_blank\">deformable convolutions</a></p>",
              "rawMarkdown": "One thing I always imagined could help, but I never tried, are [deformable convolutions](https://arxiv.org/pdf/1703.06211)",
              "votes": 1
            },
            {
              "id": 3388141,
              "postDate": "2026-01-08T09:30:12.840Z",
              "content": "<p>I was looking at deformable attention but could not find any existing 3D cuda ops.\nI imagine a SOTA model would be a ResUnet or TransUnet encoder + <a href=\"https://github.com/fundamentalvision/Deformable-DETR\" target=\"_blank\">Deformable DETR</a></p>",
              "rawMarkdown": "I was looking at deformable attention but could not find any existing 3D cuda ops.\nI imagine a SOTA model would be a ResUnet or TransUnet encoder + [Deformable DETR](https://github.com/fundamentalvision/Deformable-DETR)",
              "votes": 1
            },
            {
              "id": 3397160,
              "postDate": "2026-01-26T15:44:06.683Z",
              "content": "<p><a href=\"https://www.kaggle.com/giorgioangelotti\" target=\"_blank\">@giorgioangelotti</a> </p>\n<p>About deform-conv, here is one candidate model, <a href=\"https://github.com/MASILab/deform-uxnet\" target=\"_blank\">deform-uxnet</a>. (Though, citation is low. )</p>\n<p><img alt=\"Image\" src=\"https://github.com/user-attachments/assets/38027a38-8a73-4bfc-80eb-3aa79eed1674\"></p>",
              "rawMarkdown": "@giorgioangelotti \n\nAbout deform-conv, here is one candidate model, [deform-uxnet](https://github.com/MASILab/deform-uxnet). (Though, citation is low. )\n\n\n<img width=\"959\" height=\"781\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/38027a38-8a73-4bfc-80eb-3aa79eed1674\" />",
              "votes": 1
            }
          ]
        },
        {
          "id": 3387793,
          "postDate": "2026-01-07T16:20:59.043Z",
          "content": "<p>You won't know the results until the private dataset scores are released.</p>",
          "rawMarkdown": "You won't know the results until the private dataset scores are released.",
          "votes": 1
        },
        {
          "id": 3387854,
          "postDate": "2026-01-07T17:42:32.610Z",
          "content": "<p>Trust your local 5-fold validation, not the stories made up by others.</p>",
          "rawMarkdown": "Trust your local 5-fold validation, not the stories made up by others.",
          "votes": 3
        },
        {
          "id": 3388092,
          "postDate": "2026-01-08T06:51:08.720Z",
          "content": "<p>Confused about one thing (please correct me if im wrong) but isnt nnUnet a frame work?\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F21013672%2Fc47d4c0994fd8f43700fa5d0f26fe1f4%2FScreenshot%202026-01-08%20at%2012.09.52PM.png?generation=1767855043534828&amp;alt=media\" alt=\"\">\nwe can use transUnet as well within the nnUnet set up.</p>",
          "rawMarkdown": "Confused about one thing (please correct me if im wrong) but isnt nnUnet a frame work?\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F21013672%2Fc47d4c0994fd8f43700fa5d0f26fe1f4%2FScreenshot%202026-01-08%20at%2012.09.52PM.png?generation=1767855043534828&alt=media)\nwe can use transUnet as well within the nnUnet set up.",
          "votes": 1
        }
      ]
    },
    {
      "id": 3387610,
      "postDate": "2026-01-07T11:27:28.087Z",
      "content": "<p>Fun fact: the results we got with the vanilla nnU-Net v2 were also 0.562.</p>",
      "rawMarkdown": "Fun fact: the results we got with the vanilla nnU-Net v2 were also 0.562.",
      "votes": 4,
      "replies": [
        {
          "id": 3387613,
          "postDate": "2026-01-07T11:29:28.383Z",
          "content": "<p>Rigorous comparative experiments are paramount.</p>",
          "rawMarkdown": "Rigorous comparative experiments are paramount.\n"
        },
        {
          "id": 3387623,
          "postDate": "2026-01-07T11:36:31.073Z",
          "content": "<blockquote>\n  <p>Fun fact: the results we got with the vanilla nnU-Net v2 were also 0.562.</p>\n</blockquote>\n<p>After you added post-processing, the score was 0.562? 😄</p>",
          "rawMarkdown": "> Fun fact: the results we got with the vanilla nnU-Net v2 were also 0.562.\n\nAfter you added post-processing, the score was 0.562? 😄",
          "replies": [
            {
              "id": 3387624,
              "postDate": "2026-01-07T11:40:41.860Z",
              "content": "<p>You're very clever</p>",
              "rawMarkdown": "You're very clever"
            },
            {
              "id": 3387629,
              "postDate": "2026-01-07T11:41:53.057Z",
              "content": "<p>thk 🤭, a new challenge begins again</p>",
              "rawMarkdown": "thk 🤭, a new challenge begins again"
            },
            {
              "id": 3387632,
              "postDate": "2026-01-07T11:45:50.393Z",
              "content": "<p>Actually, someone has already shared this publicly.</p>",
              "rawMarkdown": "Actually, someone has already shared this publicly."
            }
          ]
        },
        {
          "id": 3400500,
          "postDate": "2026-02-01T16:42:41.223Z",
          "content": "<p>do you mind sharing how much time it took and on what gpu🥲</p>",
          "rawMarkdown": "do you mind sharing how much time it took and on what gpu🥲",
          "replies": [
            {
              "id": 3400510,
              "postDate": "2026-02-01T17:12:50.740Z",
              "content": "<p>for me, it is 300s / epoch on A4000, so 1000 epoch is 4 days</p>",
              "rawMarkdown": "for me, it is 300s / epoch on A4000, so 1000 epoch is 4 days"
            },
            {
              "id": 3400521,
              "postDate": "2026-02-01T17:28:57.983Z",
              "content": "<p>damn!, and you also are using 128 patch size </p>\n<p>then with the host params I don't think this is trainable  even in an A100/H100  unless there is a +10 hours access, this comp  feels like training LLMs</p>",
              "rawMarkdown": "damn!, and you also are using 128 patch size \n\nthen with the host params I don't think this is trainable  even in an A100/H100  unless there is a +10 hours access, this comp  feels like training LLMs"
            },
            {
              "id": 3400525,
              "postDate": "2026-02-01T17:34:02.800Z",
              "content": "<p>Yep, 12gb vram for patchsize 128</p>",
              "rawMarkdown": "Yep, 12gb vram for patchsize 128"
            }
          ]
        },
        {
          "id": 3400933,
          "postDate": "2026-02-02T16:16:42.950Z",
          "content": "<p>what loss  fn \ndid you use?</p>",
          "rawMarkdown": "what loss  fn \ndid you use?"
        }
      ]
    },
    {
      "id": 3396927,
      "postDate": "2026-01-26T06:18:16.200Z",
      "content": "<p>Is anyone else using GroupNorm for their 3D U-Nets?</p>\n<p>I'm training a ResEncUNet with scSE attention on 192x192x192 patches. Since the batch size is small (4), GroupNorm felt like the right choice theoretically, and I'm getting decent convergence (Val Dice ~0.46).</p>\n<p>Just wondering if the top teams are sticking to standard InstanceNorm or if GroupNorm is the secret sauce for these thin structures?</p>",
      "rawMarkdown": "Is anyone else using GroupNorm for their 3D U-Nets?\n\nI'm training a ResEncUNet with scSE attention on 192x192x192 patches. Since the batch size is small (4), GroupNorm felt like the right choice theoretically, and I'm getting decent convergence (Val Dice ~0.46).\n\nJust wondering if the top teams are sticking to standard InstanceNorm or if GroupNorm is the secret sauce for these thin structures?",
      "votes": 1,
      "replies": [
        {
          "id": 3396949,
          "postDate": "2026-01-26T07:14:21.013Z",
          "content": "<p>my solution is based on nnUNet ResEncUNet with default instance norm, patch size 128, batch size 2. But why do you think group norm is appropriate for this task</p>",
          "rawMarkdown": "my solution is based on nnUNet ResEncUNet with default instance norm, patch size 128, batch size 2. But why do you think group norm is appropriate for this task",
          "votes": 1,
          "replies": [
            {
              "id": 3396982,
              "postDate": "2026-01-26T08:35:18.377Z",
              "content": "<p>IN is definitely a strong baseline (and batch size isn’t really the issue since IN also doesn’t depend on batch stats). My thought with GN is more about behavior: IN normalizes each channel independently and can sometimes wash out subtle intensity cues, which might matter for these thin layers. GN keeps some cross-channel structure, so it might give cleaner boundaries </p>",
              "rawMarkdown": "IN is definitely a strong baseline (and batch size isn’t really the issue since IN also doesn’t depend on batch stats). My thought with GN is more about behavior: IN normalizes each channel independently and can sometimes wash out subtle intensity cues, which might matter for these thin layers. GN keeps some cross-channel structure, so it might give cleaner boundaries "
            }
          ]
        }
      ]
    },
    {
      "id": 3387642,
      "postDate": "2026-01-07T11:54:11.750Z",
      "content": "<p>If you have an H200, can I connect via SSH?</p>",
      "rawMarkdown": "If you have an H200, can I connect via SSH?",
      "votes": 3
    },
    {
      "id": 3387612,
      "postDate": "2026-01-07T11:28:22.313Z",
      "content": "<p>Did you train with Kaggle?  because if I try bigger size, OOM.</p>",
      "rawMarkdown": "Did you train with Kaggle?  because if I try bigger size, OOM.",
      "votes": 1,
      "replies": [
        {
          "id": 3387682,
          "postDate": "2026-01-07T13:13:54.553Z",
          "content": "<p>nnUNet automatically changes sizes according to gpu, on kaggle it becomes 128</p>",
          "rawMarkdown": "nnUNet automatically changes sizes according to gpu, on kaggle it becomes 128",
          "replies": [
            {
              "id": 3387739,
              "postDate": "2026-01-07T15:14:15.927Z",
              "content": "<p>I wonder if big size brings better performance? </p>",
              "rawMarkdown": "I wonder if big size brings better performance? "
            },
            {
              "id": 3387749,
              "postDate": "2026-01-07T15:23:19.357Z",
              "content": "<p>It does, but not worth trying hard to train larger resolutions at this point, I think a good strategy is to train smaller res models for testing at this stage, and then for final model train as large model as possible.</p>",
              "rawMarkdown": "It does, but not worth trying hard to train larger resolutions at this point, I think a good strategy is to train smaller res models for testing at this stage, and then for final model train as large model as possible.",
              "votes": 2
            }
          ]
        }
      ]
    },
    {
      "id": 3387900,
      "postDate": "2026-01-07T19:02:46.217Z",
      "content": "<p>Does the host plan to release the baseline [train + infer] code (although I really learned a lot from this discussion)?</p>",
      "rawMarkdown": "Does the host plan to release the baseline [train + infer] code (although I really learned a lot from this discussion)?",
      "votes": -8,
      "replies": [
        {
          "id": 3388058,
          "postDate": "2026-01-08T04:40:31.900Z",
          "content": "<p>There is a public notebook by <a href=\"https://www.kaggle.com/jirkaborovec\" target=\"_blank\">@jirkaborovec</a> which has nnUNet implementation for training and inference.</p>",
          "rawMarkdown": "There is a public notebook by @jirkaborovec which has nnUNet implementation for training and inference.",
          "votes": 1
        }
      ]
    },
    {
      "id": 3395351,
      "postDate": "2026-01-22T19:10:00.853Z",
      "content": "<p>Thanks for sharing. Could you please share the individual results (mean for each metric)? I'm curious regarding the TopoScore. I am not able to improve it further than 0.10, and I'm using a customized U-Net. I want to understand if those results are highly pushed by the SurfaceDice@τ, or if it is a balanced result. Perhaps your customized data augmentations and loss functions are pushing the results even further. Thanks!</p>",
      "rawMarkdown": "Thanks for sharing. Could you please share the individual results (mean for each metric)? I'm curious regarding the TopoScore. I am not able to improve it further than 0.10, and I'm using a customized U-Net. I want to understand if those results are highly pushed by the SurfaceDice@τ, or if it is a balanced result. Perhaps your customized data augmentations and loss functions are pushing the results even further. Thanks!"
    },
    {
      "id": 3390433,
      "postDate": "2026-01-13T06:19:31.990Z",
      "content": "<p>Is our baseline greatly based on three works by the MIC-DKFZ lab?</p>",
      "rawMarkdown": "Is our baseline greatly based on three works by the MIC-DKFZ lab?"
    },
    {
      "id": 3389824,
      "postDate": "2026-01-12T02:41:18.150Z",
      "rawMarkdown": "",
      "votes": -4,
      "isDeleted": true,
      "replies": [
        {
          "id": 3389846,
          "postDate": "2026-01-12T04:24:46.197Z",
          "content": "<p>Post-processing should be the only area where differences can arise.</p>",
          "rawMarkdown": "Post-processing should be the only area where differences can arise.",
          "votes": 3
        },
        {
          "id": 3389853,
          "postDate": "2026-01-12T04:50:47.497Z",
          "content": "<p>Do what you want, not what they say.</p>",
          "rawMarkdown": "Do what you want, not what they say."
        }
      ]
    },
    {
      "id": 3387572,
      "postDate": "2026-01-07T10:11:17.463Z",
      "rawMarkdown": "",
      "votes": -1,
      "isDeleted": true
    }
  ],
  "comments": [
    {
      "id": 3387614,
      "author_name": "Dieter",
      "author_url": "",
      "post_date": "2026-01-07T11:29:59.033000",
      "content": "<p>I find this post highly demotivating. Whats the point in having worked on this problem, when you (as host) share a recipe in the last third of the competition which achieves a Top10 LB. You are constraining creativity so much with this. </p>",
      "votes": 23,
      "replies": [
        {
          "id": 3387647,
          "author_name": "Giorgio Angelotti",
          "author_url": "",
          "post_date": "2026-01-07T12:00:07.837000",
          "content": "<p>Thanks for the feedback. I understand how a strong baseline shared mid‑competition can feel discouraging after you’ve invested a lot of effort.</p>\n<p>A couple clarifications: this isn’t meant as a “winning recipe,” it’s a reference point. It scores 0.543 / 0.562 on the public LB, and several teams (including yours) are already ahead of it; it may also rank very differently on the private evaluation.</p>\n<p>We intentionally didn’t pin a baseline at the start because we didn’t want everyone to default to nnU‑Net immediately. I am confident that the top solutions will be much more creative than that! Our implementation has been public in our repo, but we’re surfacing it now in one place for transparency and to give everyone a shared benchmark. Eventually, the goal (for us) is the strongest final solution, and a reproducible baseline helps people compare ideas and push beyond it, not replace the work already done or constrain creativity.</p>",
          "votes": 1,
          "replies": [
            {
              "id": 3387657,
              "author_name": "ForcewithMe",
              "author_url": "",
              "post_date": "2026-01-07T12:24:01.500000",
              "content": "<p>Hi <a href=\"https://www.kaggle.com/giorgioangelotti\" target=\"_blank\">@giorgioangelotti</a>, I really respect  all of your effort for hosting this competition. </p>\n<p>However, I think it's about fairness. It would be much better if you post all of the great baseiline/ideas at the early stages of the competition.The update of the dataset, along with all of the posts, makes the effort in the first 50 days meanless. </p>",
              "votes": 0,
              "replies": []
            }
          ]
        },
        {
          "id": 3387705,
          "author_name": "Manas Choudhary",
          "author_url": "",
          "post_date": "2026-01-07T14:09:23.967000",
          "content": "<p>Tbh it's not fair to publish a top 10 lb baseline mid competition, but for this case nnUNet performs well was already known and even public notebooks are available which were top 10.</p>",
          "votes": 10,
          "replies": []
        },
        {
          "id": 3387798,
          "author_name": "",
          "author_url": "",
          "post_date": "2026-01-07T16:26:34.833000",
          "content": "",
          "votes": -1,
          "replies": []
        },
        {
          "id": 3388061,
          "author_name": "",
          "author_url": "",
          "post_date": "2026-01-08T04:46:50.970000",
          "content": "",
          "votes": -2,
          "replies": []
        }
      ]
    },
    {
      "id": 3387648,
      "author_name": "Sergio Alvarez",
      "author_url": "",
      "post_date": "2026-01-07T12:03:25.800000",
      "content": "<p>Thanks for clarifying the 0.59 discrepancy, <a href=\"https://www.kaggle.com/giorgioangelotti\" target=\"_blank\">@giorgioangelotti</a> and <a href=\"https://www.kaggle.com/seanjohnsonsp\" target=\"_blank\">@seanjohnsonsp</a>! Nice to see that teams are already above the baseline, it would be a bummer if no one were able to have higher scores than your baseline work.\nOn the “creativity” discussion , I don’t really agree that this is a problem. nnU-Net approaches are already widely known in competitions, have been shared in public notebooks, and even the MIC-DKFZ team is competing 🙌.\nTiming can feel frustrating, and maybe sharing it earlier would have helped to push further towards the main goal. Still, I appreciate for sharing!</p>\n<p>Happy Kaggling to all</p>",
      "votes": 8,
      "replies": []
    },
    {
      "id": 3387597,
      "author_name": "GG Ayo (AyoGG)",
      "author_url": "",
      "post_date": "2026-01-07T11:06:25.960000",
      "content": "<p>We ran training using the fully preset nnUNetv2 model with a patch size of 128 and performed post-processing, achieving a score of 0.562. VRAM usage was approximately 9GB, and training took about 40,000 seconds on a 5090 GPU.</p>",
      "votes": 7,
      "replies": [
        {
          "id": 3387859,
          "author_name": "Simon Alerdic",
          "author_url": "",
          "post_date": "2026-01-07T17:49:59.107000",
          "content": "<p>Without nnunet, any luck with own custom pipeline? I was trying <a href=\"https://www.kaggle.com/code/jirkaborovec/surface-train-inference-3d-segm-gpu-augment\" target=\"_blank\">this</a>, but the local score seems not that good.</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 3389863,
          "author_name": "ArjunB",
          "author_url": "",
          "post_date": "2026-01-12T05:12:17.243000",
          "content": "<p>what about the loss fn?</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 3405060,
      "author_name": "Rob Freeman",
      "author_url": "",
      "post_date": "2026-02-12T01:11:16.457000",
      "content": "<p>Out of curiosity, what is the score with the updated test?</p>",
      "votes": 2,
      "replies": [
        {
          "id": 3405179,
          "author_name": "GG Ayo (AyoGG)",
          "author_url": "",
          "post_date": "2026-02-12T10:55:26.497000",
          "content": "<p>0.562 from my result</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 3405344,
          "author_name": "Giorgio Angelotti",
          "author_url": "",
          "post_date": "2026-02-12T19:38:20.847000",
          "content": "<p>0.546 without post processing, 0.567 with post processing</p>",
          "votes": 6,
          "replies": []
        }
      ]
    },
    {
      "id": 3387747,
      "author_name": "yukiZ",
      "author_url": "",
      "post_date": "2026-01-07T15:22:35.913000",
      "content": "<p>FYI. I won <strong>LB.543 with TransUNet</strong> (I won't go into details as the competition is nearing the end, about a month in). </p>\n<p>A quick internet survey also showed some papers showing that <strong>TransUnet</strong> is superior to <strong>nnUnet.</strong> Therefore, I don't think it's clear which architecture will ultimately win.\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3802145%2Fb1e7c7abf2cc26f66677c94416110f25%2F2026-01-08%20000050.png?generation=1767798662840702&amp;alt=media\" alt=\"\">\n<a href=\"https://arxiv.org/pdf/2310.07781\" target=\"_blank\">https://arxiv.org/pdf/2310.07781</a></p>",
      "votes": 3,
      "replies": [
        {
          "id": 3387751,
          "author_name": "Manas Choudhary",
          "author_url": "",
          "post_date": "2026-01-07T15:26:44.043000",
          "content": "<p>Maybe if we try and use strides, convs, and all other possible minor components specially designed for this problem, like nnUNet does in TranUNet, we might get better results.</p>",
          "votes": 1,
          "replies": [
            {
              "id": 3388099,
              "author_name": "Giorgio Angelotti",
              "author_url": "",
              "post_date": "2026-01-08T07:07:41.443000",
              "content": "<p>One thing I always imagined could help, but I never tried, are <a href=\"https://arxiv.org/pdf/1703.06211\" target=\"_blank\">deformable convolutions</a></p>",
              "votes": 1,
              "replies": []
            },
            {
              "id": 3388141,
              "author_name": "sroger",
              "author_url": "",
              "post_date": "2026-01-08T09:30:12.840000",
              "content": "<p>I was looking at deformable attention but could not find any existing 3D cuda ops.\nI imagine a SOTA model would be a ResUnet or TransUnet encoder + <a href=\"https://github.com/fundamentalvision/Deformable-DETR\" target=\"_blank\">Deformable DETR</a></p>",
              "votes": 1,
              "replies": []
            },
            {
              "id": 3397160,
              "author_name": "Innat",
              "author_url": "",
              "post_date": "2026-01-26T15:44:06.683000",
              "content": "<p><a href=\"https://www.kaggle.com/giorgioangelotti\" target=\"_blank\">@giorgioangelotti</a> </p>\n<p>About deform-conv, here is one candidate model, <a href=\"https://github.com/MASILab/deform-uxnet\" target=\"_blank\">deform-uxnet</a>. (Though, citation is low. )</p>\n<p><img alt=\"Image\" src=\"https://github.com/user-attachments/assets/38027a38-8a73-4bfc-80eb-3aa79eed1674\"></p>",
              "votes": 1,
              "replies": []
            }
          ]
        },
        {
          "id": 3387793,
          "author_name": "GG Ayo (AyoGG)",
          "author_url": "",
          "post_date": "2026-01-07T16:20:59.043000",
          "content": "<p>You won't know the results until the private dataset scores are released.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 3387854,
          "author_name": "tingyi",
          "author_url": "",
          "post_date": "2026-01-07T17:42:32.610000",
          "content": "<p>Trust your local 5-fold validation, not the stories made up by others.</p>",
          "votes": 3,
          "replies": []
        },
        {
          "id": 3388092,
          "author_name": "ArjunB",
          "author_url": "",
          "post_date": "2026-01-08T06:51:08.720000",
          "content": "<p>Confused about one thing (please correct me if im wrong) but isnt nnUnet a frame work?\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F21013672%2Fc47d4c0994fd8f43700fa5d0f26fe1f4%2FScreenshot%202026-01-08%20at%2012.09.52PM.png?generation=1767855043534828&amp;alt=media\" alt=\"\">\nwe can use transUnet as well within the nnUnet set up.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 3387610,
      "author_name": "tingyi",
      "author_url": "",
      "post_date": "2026-01-07T11:27:28.087000",
      "content": "<p>Fun fact: the results we got with the vanilla nnU-Net v2 were also 0.562.</p>",
      "votes": 4,
      "replies": [
        {
          "id": 3387613,
          "author_name": "tingyi",
          "author_url": "",
          "post_date": "2026-01-07T11:29:28.383000",
          "content": "<p>Rigorous comparative experiments are paramount.</p>",
          "votes": 0,
          "replies": []
        },
        {
          "id": 3387623,
          "author_name": "DECEM",
          "author_url": "",
          "post_date": "2026-01-07T11:36:31.073000",
          "content": "<blockquote>\n  <p>Fun fact: the results we got with the vanilla nnU-Net v2 were also 0.562.</p>\n</blockquote>\n<p>After you added post-processing, the score was 0.562? 😄</p>",
          "votes": 0,
          "replies": [
            {
              "id": 3387624,
              "author_name": "GG Ayo (AyoGG)",
              "author_url": "",
              "post_date": "2026-01-07T11:40:41.860000",
              "content": "<p>You're very clever</p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 3387629,
              "author_name": "DECEM",
              "author_url": "",
              "post_date": "2026-01-07T11:41:53.057000",
              "content": "<p>thk 🤭, a new challenge begins again</p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 3387632,
              "author_name": "tingyi",
              "author_url": "",
              "post_date": "2026-01-07T11:45:50.393000",
              "content": "<p>Actually, someone has already shared this publicly.</p>",
              "votes": 0,
              "replies": []
            }
          ]
        },
        {
          "id": 3400500,
          "author_name": "Taha_Alshatiri",
          "author_url": "",
          "post_date": "2026-02-01T16:42:41.223000",
          "content": "<p>do you mind sharing how much time it took and on what gpu🥲</p>",
          "votes": 0,
          "replies": [
            {
              "id": 3400510,
              "author_name": "Duong Nguyen",
              "author_url": "",
              "post_date": "2026-02-01T17:12:50.740000",
              "content": "<p>for me, it is 300s / epoch on A4000, so 1000 epoch is 4 days</p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 3400521,
              "author_name": "Taha_Alshatiri",
              "author_url": "",
              "post_date": "2026-02-01T17:28:57.983000",
              "content": "<p>damn!, and you also are using 128 patch size </p>\n<p>then with the host params I don't think this is trainable  even in an A100/H100  unless there is a +10 hours access, this comp  feels like training LLMs</p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 3400525,
              "author_name": "Duong Nguyen",
              "author_url": "",
              "post_date": "2026-02-01T17:34:02.800000",
              "content": "<p>Yep, 12gb vram for patchsize 128</p>",
              "votes": 0,
              "replies": []
            }
          ]
        },
        {
          "id": 3400933,
          "author_name": "Taha_Alshatiri",
          "author_url": "",
          "post_date": "2026-02-02T16:16:42.950000",
          "content": "<p>what loss  fn \ndid you use?</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 3396927,
      "author_name": "Manish Swami",
      "author_url": "",
      "post_date": "2026-01-26T06:18:16.200000",
      "content": "<p>Is anyone else using GroupNorm for their 3D U-Nets?</p>\n<p>I'm training a ResEncUNet with scSE attention on 192x192x192 patches. Since the batch size is small (4), GroupNorm felt like the right choice theoretically, and I'm getting decent convergence (Val Dice ~0.46).</p>\n<p>Just wondering if the top teams are sticking to standard InstanceNorm or if GroupNorm is the secret sauce for these thin structures?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3396949,
          "author_name": "Duong Nguyen",
          "author_url": "",
          "post_date": "2026-01-26T07:14:21.013000",
          "content": "<p>my solution is based on nnUNet ResEncUNet with default instance norm, patch size 128, batch size 2. But why do you think group norm is appropriate for this task</p>",
          "votes": 1,
          "replies": [
            {
              "id": 3396982,
              "author_name": "Manish Swami",
              "author_url": "",
              "post_date": "2026-01-26T08:35:18.377000",
              "content": "<p>IN is definitely a strong baseline (and batch size isn’t really the issue since IN also doesn’t depend on batch stats). My thought with GN is more about behavior: IN normalizes each channel independently and can sometimes wash out subtle intensity cues, which might matter for these thin layers. GN keeps some cross-channel structure, so it might give cleaner boundaries </p>",
              "votes": 0,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3387642,
      "author_name": "GG Ayo (AyoGG)",
      "author_url": "",
      "post_date": "2026-01-07T11:54:11.750000",
      "content": "<p>If you have an H200, can I connect via SSH?</p>",
      "votes": 3,
      "replies": []
    },
    {
      "id": 3387612,
      "author_name": "dragon zhang",
      "author_url": "",
      "post_date": "2026-01-07T11:28:22.313000",
      "content": "<p>Did you train with Kaggle?  because if I try bigger size, OOM.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3387682,
          "author_name": "Manas Choudhary",
          "author_url": "",
          "post_date": "2026-01-07T13:13:54.553000",
          "content": "<p>nnUNet automatically changes sizes according to gpu, on kaggle it becomes 128</p>",
          "votes": 0,
          "replies": [
            {
              "id": 3387739,
              "author_name": "dragon zhang",
              "author_url": "",
              "post_date": "2026-01-07T15:14:15.927000",
              "content": "<p>I wonder if big size brings better performance? </p>",
              "votes": 0,
              "replies": []
            },
            {
              "id": 3387749,
              "author_name": "Manas Choudhary",
              "author_url": "",
              "post_date": "2026-01-07T15:23:19.357000",
              "content": "<p>It does, but not worth trying hard to train larger resolutions at this point, I think a good strategy is to train smaller res models for testing at this stage, and then for final model train as large model as possible.</p>",
              "votes": 2,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3387900,
      "author_name": "yuanzhe zhou",
      "author_url": "",
      "post_date": "2026-01-07T19:02:46.217000",
      "content": "<p>Does the host plan to release the baseline [train + infer] code (although I really learned a lot from this discussion)?</p>",
      "votes": -8,
      "replies": [
        {
          "id": 3388058,
          "author_name": "Manas Choudhary",
          "author_url": "",
          "post_date": "2026-01-08T04:40:31.900000",
          "content": "<p>There is a public notebook by <a href=\"https://www.kaggle.com/jirkaborovec\" target=\"_blank\">@jirkaborovec</a> which has nnUNet implementation for training and inference.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 3395351,
      "author_name": "Andre Filipe Ferreira",
      "author_url": "",
      "post_date": "2026-01-22T19:10:00.853000",
      "content": "<p>Thanks for sharing. Could you please share the individual results (mean for each metric)? I'm curious regarding the TopoScore. I am not able to improve it further than 0.10, and I'm using a customized U-Net. I want to understand if those results are highly pushed by the SurfaceDice@τ, or if it is a balanced result. Perhaps your customized data augmentations and loss functions are pushing the results even further. Thanks!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3390433,
      "author_name": "Navneet",
      "author_url": "",
      "post_date": "2026-01-13T06:19:31.990000",
      "content": "<p>Is our baseline greatly based on three works by the MIC-DKFZ lab?</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3389824,
      "author_name": "",
      "author_url": "",
      "post_date": "2026-01-12T02:41:18.150000",
      "content": "",
      "votes": -4,
      "replies": [
        {
          "id": 3389846,
          "author_name": "GG Ayo (AyoGG)",
          "author_url": "",
          "post_date": "2026-01-12T04:24:46.197000",
          "content": "<p>Post-processing should be the only area where differences can arise.</p>",
          "votes": 3,
          "replies": []
        },
        {
          "id": 3389853,
          "author_name": "DECEM",
          "author_url": "",
          "post_date": "2026-01-12T04:50:47.497000",
          "content": "<p>Do what you want, not what they say.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 3387572,
      "author_name": "",
      "author_url": "",
      "post_date": "2026-01-07T10:11:17.463000",
      "content": "",
      "votes": -1,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "3387544": "We are already talked about our baseline in some comments across the Discussions. I imagine that at this point of the competition it would be better to condensate the knowledge in a pinned post.\n\nIn the past days we had anticipated that our baseline reached 0.59 LB, but actually the metrics script used was different than the one that's running on Kaggle, which is doing a chunked computation for resource optimization.\n\n**Our Kaggle sandbox submission with our baseline reaches 0.543 LB (Public LB)**\n\n**With some prediction post processing the score gets up to 0.562 LB (Public LB)**\n\nOur baseline is greatly based on three works by the [MIC-DKFZ](https://www.dkfz.de/en/medical-image-computing) lab, which at some point also independently submitted a solution on the old version of the dataset in this competition ( @fabianisensee ).\n\nThese three works are [nnUNetv2](https://arxiv.org/pdf/2404.09556), the [SkeletonRecall Loss](https://arxiv.org/pdf/2404.03010) and [batchgeneratorsv2](https://github.com/MIC-DKFZ/batchgeneratorsv2) .\n\nThe architecture of the baseline is a nnUNetv2, trained with this `3d_fullres` plan:\n```python\n        \"3d_fullres\": {\n            \"data_identifier\": \"nnUNetPlans_3d_fullres\",\n            \"preprocessor_name\": \"DefaultPreprocessor\",\n            \"batch_size\": 2,\n            \"patch_size\": [\n                192,\n                192,\n                192\n            ],\n            \"spacing\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"normalization_schemes\": [\n                \"ZScoreNormalization\"\n            ],\n            \"use_mask_for_norm\": [\n                false\n            ],\n            \"resampling_fn_data\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_seg\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_data_kwargs\": {\n                \"is_seg\": false,\n                \"order\": 3,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"resampling_fn_seg_kwargs\": {\n                \"is_seg\": true,\n                \"order\": 1,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"resampling_fn_probabilities\": \"resample_data_or_seg_to_shape\",\n            \"resampling_fn_probabilities_kwargs\": {\n                \"is_seg\": false,\n                \"order\": 1,\n                \"order_z\": 0,\n                \"force_separate_z\": null\n            },\n            \"architecture\": {\n                \"network_class_name\": \"dynamic_network_architectures.architectures.unet.ResidualEncoderUNet\",\n                \"arch_kwargs\": {\n                    \"n_stages\": 6,\n                    \"features_per_stage\": [\n                        32,\n                        64,\n                        128,\n                        256,\n                        320,\n                        320\n                    ],\n                    \"conv_op\": \"torch.nn.modules.conv.Conv3d\",\n                    \"kernel_sizes\": [\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ],\n                        [\n                            3,\n                            3,\n                            3\n                        ]\n                    ],\n                    \"strides\": [\n                        [\n                            1,\n                            1,\n                            1\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ],\n                        [\n                            2,\n                            2,\n                            2\n                        ]\n                    ],\n                    \"n_blocks_per_stage\": [\n                        1,\n                        3,\n                        4,\n                        6,\n                        6,\n                        6\n                    ],\n                    \"n_conv_per_stage_decoder\": [\n                        1,\n                        1,\n                        1,\n                        1,\n                        1\n                    ],\n                    \"conv_bias\": true,\n                    \"norm_op\": \"torch.nn.modules.instancenorm.InstanceNorm3d\",\n                    \"norm_op_kwargs\": {\n                        \"eps\": 1e-05,\n                        \"affine\": true\n                    },\n                    \"dropout_op\": null,\n                    \"dropout_op_kwargs\": null,\n                    \"nonlin\": \"torch.nn.LeakyReLU\",\n                    \"nonlin_kwargs\": {\n                        \"inplace\": true\n                    }\n                },\n                \"_kw_requires_import\": [\n                    \"conv_op\",\n                    \"norm_op\",\n                    \"dropout_op\",\n                    \"nonlin\"\n                ]\n            },\n            \"batch_dice\": false\n        }\n    }\n```\n\nAs a custom trainer/loss, we used the `MedialSurfaceRecall` trainer defined [in this repository](https://github.com/ScrollPrize/villa/blob/main/segmentation/models/arch/nnunet/nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerSkeletonRecall.py), which is a modified version of the `SkeletonRecall trainer`. Our version, instead of computing a 3D tree-like skeleton, tries to approximate (with some impurities) the medial surface of the labels by just aggregating per-slice 2D skeletonizations across the 3 different axes. This loss helps fighting the creation of holes in the predictions, making the output look more sheet-like, at the expenses of having some more mergers, especially in more \"packed\" regions.\n\nDuring training, some custom augmentation were introduced [in this edited version](https://github.com/ScrollPrize/villa/tree/main/segmentation/models/batchgeneratorsv2) of `batchgeneratorsv2`.\n\nThe model was trained for about `1200 epochs` with a `starting learning rate of 0.01 `.\n\nAs an additional post-processing step, which boosted the Public LB from 0.543 LB to 0.562 LB, we thresholded the softmax output at `0.75`, and run on it a modified Frangi filter that enhances **surfaceness** rather than **vesselness** (it's basically the same, but with a different handling of the eigenvalues in the formula).\n\nWe know that many of you already developed some solutions which fare better than this, and we hope that our knowledge can help you develop even more performing solutions (we didn't want to share it at the beginning of the challenge to avoid constraining your creativity on a particular road, rather than have you trying more exotic solutions 😃 . I am very curious to see the results of what @hengck23 and @tom99763 are doing to be honest ahah 👀)\n\nFor more details, @seanjohnsonsp (who took care of the development of the baseline), will be happy to answer your questions!",
    "3387614": "I find this post highly demotivating. Whats the point in having worked on this problem, when you (as host) share a recipe in the last third of the competition which achieves a Top10 LB. You are constraining creativity so much with this. ",
    "3387648": "Thanks for clarifying the 0.59 discrepancy, @giorgioangelotti and @seanjohnsonsp! Nice to see that teams are already above the baseline, it would be a bummer if no one were able to have higher scores than your baseline work.\nOn the “creativity” discussion , I don’t really agree that this is a problem. nnU-Net approaches are already widely known in competitions, have been shared in public notebooks, and even the MIC-DKFZ team is competing 🙌.\nTiming can feel frustrating, and maybe sharing it earlier would have helped to push further towards the main goal. Still, I appreciate for sharing!\n\nHappy Kaggling to all",
    "3387597": "We ran training using the fully preset nnUNetv2 model with a patch size of 128 and performed post-processing, achieving a score of 0.562. VRAM usage was approximately 9GB, and training took about 40,000 seconds on a 5090 GPU.",
    "3405060": "Out of curiosity, what is the score with the updated test?",
    "3387747": "FYI. I won **LB.543 with TransUNet** (I won't go into details as the competition is nearing the end, about a month in). \n\nA quick internet survey also showed some papers showing that **TransUnet** is superior to **nnUnet.** Therefore, I don't think it's clear which architecture will ultimately win.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3802145%2Fb1e7c7abf2cc26f66677c94416110f25%2F2026-01-08%20000050.png?generation=1767798662840702&alt=media)\nhttps://arxiv.org/pdf/2310.07781",
    "3387610": "Fun fact: the results we got with the vanilla nnU-Net v2 were also 0.562.",
    "3396927": "Is anyone else using GroupNorm for their 3D U-Nets?\n\nI'm training a ResEncUNet with scSE attention on 192x192x192 patches. Since the batch size is small (4), GroupNorm felt like the right choice theoretically, and I'm getting decent convergence (Val Dice ~0.46).\n\nJust wondering if the top teams are sticking to standard InstanceNorm or if GroupNorm is the secret sauce for these thin structures?",
    "3387642": "If you have an H200, can I connect via SSH?",
    "3387612": "Did you train with Kaggle?  because if I try bigger size, OOM.",
    "3387900": "Does the host plan to release the baseline [train + infer] code (although I really learned a lot from this discussion)?",
    "3395351": "Thanks for sharing. Could you please share the individual results (mean for each metric)? I'm curious regarding the TopoScore. I am not able to improve it further than 0.10, and I'm using a customized U-Net. I want to understand if those results are highly pushed by the SurfaceDice@τ, or if it is a balanced result. Perhaps your customized data augmentations and loss functions are pushing the results even further. Thanks!",
    "3390433": "Is our baseline greatly based on three works by the MIC-DKFZ lab?",
    "3389824": "",
    "3387572": ""
  }
}