{
  "id": 651550,
  "title": "Has anyone tried warpping loss (in topo-pitfalls project and paper)? ",
  "url": "/competitions/vesuvius-challenge-surface-detection/discussion/651550",
  "author_name": "",
  "post_date": "2025-12-04T05:25:12.969642100Z",
  "votes": 7,
  "comment_count": 11,
  "views": 0,
  "content": "<p>code：<a href=\"https://github.com/HuXiaoling/Warping\" target=\"_blank\">https://github.com/HuXiaoling/Warping</a>\npaper：<a href=\"https://arxiv.org/abs/2112.07812\" target=\"_blank\">https://arxiv.org/abs/2112.07812</a>\nI tried to transfer code from HuXiaoling/Warping to topo-pitfalls to support 3D, but result is not better than DiceLoss. The critical points number seems a lot when debugging, not as the paper.\nMaybe BettiMatch and ClDice is the correct way？</p>",
  "messages": [
    {
      "id": "3362032",
      "postDate": "12/04/2025 05:25:12",
      "content": "<p>code：<a href=\"https://github.com/HuXiaoling/Warping\" target=\"_blank\">https://github.com/HuXiaoling/Warping</a>\npaper：<a href=\"https://arxiv.org/abs/2112.07812\" target=\"_blank\">https://arxiv.org/abs/2112.07812</a>\nI tried to transfer code from HuXiaoling/Warping to topo-pitfalls to support 3D, but result is not better than DiceLoss. The critical points number seems a lot when debugging, not as the paper.\nMaybe BettiMatch and ClDice is the correct way？</p>",
      "rawMarkdown": "code：https://github.com/HuXiaoling/Warping\npaper：https://arxiv.org/abs/2112.07812\nI tried to transfer code from HuXiaoling/Warping to topo-pitfalls to support 3D, but result is not better than DiceLoss. The critical points number seems a lot when debugging, not as the paper.\nMaybe BettiMatch and ClDice is the correct way？",
      "votes": null
    },
    {
      "id": "3362038",
      "postDate": "12/04/2025 05:35:04",
      "content": "<p>Moreover, it does not appear in the reference papers of the competition.</p>",
      "rawMarkdown": "Moreover, it does not appear in the reference papers of the competition.",
      "votes": null
    },
    {
      "id": "3362324",
      "postDate": "12/04/2025 13:56:22",
      "content": "<p>I don't think we tried it. Did we, <a href=\"https://www.kaggle.com/seanjohnsonsp\" target=\"_blank\">@seanjohnsonsp</a> ?</p>",
      "rawMarkdown": "I don't think we tried it. Did we, @seanjohnsonsp ?",
      "votes": null
    },
    {
      "id": "3362395",
      "postDate": "12/04/2025 16:29:13",
      "content": "<p>I did not use this one unfortunately, it looks interesting though! </p>",
      "rawMarkdown": "I did not use this one unfortunately, it looks interesting though!",
      "votes": null
    },
    {
      "id": "3362573",
      "postDate": "12/04/2025 23:55:54",
      "content": "<p><a href=\"https://www.kaggle.com/clwwlc\" target=\"_blank\">@clwwlc</a> basically my approach does similar thing.</p>",
      "rawMarkdown": "clwwlc basically my approach does similar thing.",
      "votes": null
    },
    {
      "id": "3362926",
      "postDate": "12/05/2025 15:21:42",
      "content": "<p>just a suggestion:</p>\n<ul>\n<li>i remember in early cell instance segmentation kaggle competition, the top solution detected the touching border pixel between cells.\n(so there are three class, bg,fg, touching)</li>\n<li>hence instead of using update_simple_point() to weight the pixel loss, detect the critical point as an additional class.</li>\n<li>use them as post processing later?</li>\n</ul>\n<p>Use you ground truth to intersect your prediction. Those not intersected are fp bridges, etc. see if you can treat this a a new class. basically it is a iterative relabel process (for each detection, label fp and fn. that guarantees good betti numbers)</p>",
      "rawMarkdown": "just a suggestion:\n- i remember in early cell instance segmentation kaggle competition, the top solution detected the touching border pixel between cells.\n(so there are three class, bg,fg, touching)\n- hence instead of using update_simple_point() to weight the pixel loss, detect the critical point as an additional class.\n- use them as post processing later?\n\nUse you ground truth to intersect your prediction. Those not intersected are fp bridges, etc. see if you can treat this a a new class. basically it is a iterative relabel process (for each detection, label fp and fn. that guarantees good betti numbers)",
      "votes": null
    },
    {
      "id": "3370435",
      "postDate": "12/10/2025 19:35:22",
      "content": "<p>Skeleton Recall Loss seems interesting (mentioned in the overview page). Maybe MIC-DKFZ team used it and got 0.549 in one shot. -)</p>\n<p><a href=\"https://github.com/MIC-DKFZ/Skeleton-Recall\" target=\"_blank\">https://github.com/MIC-DKFZ/Skeleton-Recall</a></p>\n<p>To use it, one need to run tubed skeletonization on gt from dataloader. Or, how about gt are precomputed beforehand, same as the original gt.</p>",
      "rawMarkdown": "Skeleton Recall Loss seems interesting (mentioned in the overview page). Maybe MIC-DKFZ team used it and got 0.549 in one shot. -)\n\nhttps://github.com/MIC-DKFZ/Skeleton-Recall\n\nTo use it, one need to run tubed skeletonization on gt from dataloader. Or, how about gt are precomputed beforehand, same as the original gt.",
      "votes": null
    },
    {
      "id": "3370442",
      "postDate": "12/10/2025 19:43:56",
      "content": "<p>Great idea! The Vesuvius Challenge team tried to use in the past <a href=\"https://github.com/ScrollPrize/villa/blob/e85da047518542ea04b59d62ae7cbbd7691c838d/segmentation/models/arch/nnunet/nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerSkeletonRecall.py#L513\" target=\"_blank\">a modified version of this</a>, which instead of doing a skeletonization in XY slices, does an aggregate skeletonization in all dimensions. This is a sort of approximation of the Medial Surface. It's definetely working quite well, but I don't think that alone will be enough to win the competition :)</p>",
      "rawMarkdown": "Great idea! The Vesuvius Challenge team tried to use in the past [a modified version of this](https://github.com/ScrollPrize/villa/blob/e85da047518542ea04b59d62ae7cbbd7691c838d/segmentation/models/arch/nnunet/nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerSkeletonRecall.py#L513), which instead of doing a skeletonization in XY slices, does an aggregate skeletonization in all dimensions. This is a sort of approximation of the Medial Surface. It's definetely working quite well, but I don't think that alone will be enough to win the competition :)",
      "votes": null
    },
    {
      "id": "3370551",
      "postDate": "12/10/2025 22:57:26",
      "content": "<p><a href=\"https://www.kaggle.com/ipythonx\" target=\"_blank\">@ipythonx</a>  for us, skeleton recall give negative effect, here are the extracted skeleton in 2d view.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F4310004%2Fcde64c55cfc6d0ffe00dd91424e15149%2Fimage.png?generation=1765407430983923&amp;alt=media\" alt=\"\"></p>",
      "rawMarkdown": "ipythonx  for us, skeleton recall give negative effect, here are the extracted skeleton in 2d view.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F4310004%2Fcde64c55cfc6d0ffe00dd91424e15149%2Fimage.png?generation=1765407430983923&alt=media)",
      "votes": null
    },
    {
      "id": "3370566",
      "postDate": "12/10/2025 23:40:52",
      "content": "<p>why do you allow skeletion artifacts (junctions and small looping branches) in your ground truth?</p>",
      "rawMarkdown": "why do you allow skeletion artifacts (junctions and small looping branches) in your ground truth?",
      "votes": null
    },
    {
      "id": "3370567",
      "postDate": "12/10/2025 23:43:15",
      "content": "<p>maybe helpful for VOI loss if you do it instance wise (instance as class) for ground truth?</p>",
      "rawMarkdown": "maybe helpful for VOI loss if you do it instance wise (instance as class) for ground truth?",
      "votes": null
    },
    {
      "id": "3385111",
      "postDate": "01/02/2026 14:56:01",
      "content": "<p>I tried it, but it didn’t help.</p>",
      "rawMarkdown": "I tried it, but it didn’t help.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 3362038,
      "author_name": "clwwlc",
      "author_url": "",
      "post_date": "12/04/2025 05:35:04",
      "content": "<p>Moreover, it does not appear in the reference papers of the competition.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3362324,
      "author_name": "giorgioangelotti",
      "author_url": "",
      "post_date": "12/04/2025 13:56:22",
      "content": "<p>I don't think we tried it. Did we, <a href=\"https://www.kaggle.com/seanjohnsonsp\" target=\"_blank\">@seanjohnsonsp</a> ?</p>",
      "votes": null,
      "replies": [
        {
          "id": 3362395,
          "author_name": "seanjohnsonsp",
          "author_url": "",
          "post_date": "12/04/2025 16:29:13",
          "content": "<p>I did not use this one unfortunately, it looks interesting though! </p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 3362573,
      "author_name": "tom99763",
      "author_url": "",
      "post_date": "12/04/2025 23:55:54",
      "content": "<p><a href=\"https://www.kaggle.com/clwwlc\" target=\"_blank\">@clwwlc</a> basically my approach does similar thing.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3362926,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "12/05/2025 15:21:42",
      "content": "<p>just a suggestion:</p>\n<ul>\n<li>i remember in early cell instance segmentation kaggle competition, the top solution detected the touching border pixel between cells.\n(so there are three class, bg,fg, touching)</li>\n<li>hence instead of using update_simple_point() to weight the pixel loss, detect the critical point as an additional class.</li>\n<li>use them as post processing later?</li>\n</ul>\n<p>Use you ground truth to intersect your prediction. Those not intersected are fp bridges, etc. see if you can treat this a a new class. basically it is a iterative relabel process (for each detection, label fp and fn. that guarantees good betti numbers)</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3370435,
      "author_name": "ipythonx",
      "author_url": "",
      "post_date": "12/10/2025 19:35:22",
      "content": "<p>Skeleton Recall Loss seems interesting (mentioned in the overview page). Maybe MIC-DKFZ team used it and got 0.549 in one shot. -)</p>\n<p><a href=\"https://github.com/MIC-DKFZ/Skeleton-Recall\" target=\"_blank\">https://github.com/MIC-DKFZ/Skeleton-Recall</a></p>\n<p>To use it, one need to run tubed skeletonization on gt from dataloader. Or, how about gt are precomputed beforehand, same as the original gt.</p>",
      "votes": null,
      "replies": [
        {
          "id": 3370442,
          "author_name": "giorgioangelotti",
          "author_url": "",
          "post_date": "12/10/2025 19:43:56",
          "content": "<p>Great idea! The Vesuvius Challenge team tried to use in the past <a href=\"https://github.com/ScrollPrize/villa/blob/e85da047518542ea04b59d62ae7cbbd7691c838d/segmentation/models/arch/nnunet/nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerSkeletonRecall.py#L513\" target=\"_blank\">a modified version of this</a>, which instead of doing a skeletonization in XY slices, does an aggregate skeletonization in all dimensions. This is a sort of approximation of the Medial Surface. It's definetely working quite well, but I don't think that alone will be enough to win the competition :)</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 3370551,
          "author_name": "tom99763",
          "author_url": "",
          "post_date": "12/10/2025 22:57:26",
          "content": "<p><a href=\"https://www.kaggle.com/ipythonx\" target=\"_blank\">@ipythonx</a>  for us, skeleton recall give negative effect, here are the extracted skeleton in 2d view.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F4310004%2Fcde64c55cfc6d0ffe00dd91424e15149%2Fimage.png?generation=1765407430983923&amp;alt=media\" alt=\"\"></p>",
          "votes": null,
          "replies": [
            {
              "id": 3370566,
              "author_name": "hengck23",
              "author_url": "",
              "post_date": "12/10/2025 23:40:52",
              "content": "<p>why do you allow skeletion artifacts (junctions and small looping branches) in your ground truth?</p>",
              "votes": null,
              "replies": []
            }
          ]
        },
        {
          "id": 3370567,
          "author_name": "hengck23",
          "author_url": "",
          "post_date": "12/10/2025 23:43:15",
          "content": "<p>maybe helpful for VOI loss if you do it instance wise (instance as class) for ground truth?</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 3385111,
      "author_name": "shigengtian",
      "author_url": "",
      "post_date": "01/02/2026 14:56:01",
      "content": "<p>I tried it, but it didn’t help.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "3362032": "code：https://github.com/HuXiaoling/Warping\npaper：https://arxiv.org/abs/2112.07812\nI tried to transfer code from HuXiaoling/Warping to topo-pitfalls to support 3D, but result is not better than DiceLoss. The critical points number seems a lot when debugging, not as the paper.\nMaybe BettiMatch and ClDice is the correct way？",
    "3362038": "Moreover, it does not appear in the reference papers of the competition.",
    "3362324": "I don't think we tried it. Did we, @seanjohnsonsp ?",
    "3362395": "I did not use this one unfortunately, it looks interesting though!",
    "3362573": "clwwlc basically my approach does similar thing.",
    "3362926": "just a suggestion:\n- i remember in early cell instance segmentation kaggle competition, the top solution detected the touching border pixel between cells.\n(so there are three class, bg,fg, touching)\n- hence instead of using update_simple_point() to weight the pixel loss, detect the critical point as an additional class.\n- use them as post processing later?\n\nUse you ground truth to intersect your prediction. Those not intersected are fp bridges, etc. see if you can treat this a a new class. basically it is a iterative relabel process (for each detection, label fp and fn. that guarantees good betti numbers)",
    "3370435": "Skeleton Recall Loss seems interesting (mentioned in the overview page). Maybe MIC-DKFZ team used it and got 0.549 in one shot. -)\n\nhttps://github.com/MIC-DKFZ/Skeleton-Recall\n\nTo use it, one need to run tubed skeletonization on gt from dataloader. Or, how about gt are precomputed beforehand, same as the original gt.",
    "3370442": "Great idea! The Vesuvius Challenge team tried to use in the past [a modified version of this](https://github.com/ScrollPrize/villa/blob/e85da047518542ea04b59d62ae7cbbd7691c838d/segmentation/models/arch/nnunet/nnunetv2/training/nnUNetTrainer/variants/loss/nnUNetTrainerSkeletonRecall.py#L513), which instead of doing a skeletonization in XY slices, does an aggregate skeletonization in all dimensions. This is a sort of approximation of the Medial Surface. It's definetely working quite well, but I don't think that alone will be enough to win the competition :)",
    "3370551": "ipythonx  for us, skeleton recall give negative effect, here are the extracted skeleton in 2d view.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F4310004%2Fcde64c55cfc6d0ffe00dd91424e15149%2Fimage.png?generation=1765407430983923&alt=media)",
    "3370566": "why do you allow skeletion artifacts (junctions and small looping branches) in your ground truth?",
    "3370567": "maybe helpful for VOI loss if you do it instance wise (instance as class) for ground truth?",
    "3385111": "I tried it, but it didn’t help."
  },
  "source": "meta"
}