最近 AI 圈聊 agent 、workflow 、MCP 聊得很热,我最近反而回头看了一个很土的地方:image segmentation 最后那一步,到底是不是应该那么理所当然地 argmax。
如果你做过这类任务,流程基本都差不多:模型吐出 per-pixel logits 或 probability map ,插值回原图尺寸,然后 argmax 或 threshold 出 mask 。SegFormer 、DeepLab 、UPerNet 这类语义分割模型是这样,很多把 SAM 或别的视觉 backbone 接到语义分割结果上的链路,最后也还是这一步。写久了之后,很容易把它当成一个收尾动作,而不是一个值得单独优化的决策规则。
但 image segmentation 偏偏不是一个只看局部对错的任务。线上或者论文里真正看的,通常是 mIoU / mDice 这类整体 overlap 指标,而 argmax / threshold 更像是逐像素做贪心决策。每个 pixel 单独看都没问题,不代表整张 mask 的全局指标最优,尤其是小物体、边界、遮挡和一些碎区域,常常就是在最后这一步开始丢。
我最近在参与 RankSEG 这条线,做的事情其实很朴素:不改训练,不碰模型权重,只重写“怎么把概率图变成最终 mask”这一步。换句话说,就是把 pipeline 里默认的 probs.argmax(dim=1) 换成一个更贴 segmentation 指标的后处理。对已经有现成推理链路的人来说,改动点非常明确,不是另起一套系统。
这个项目我觉得值得发出来,也主要是因为它有点工程杠杆。现在 PyTorch native 的概率图流程可以接,Transformers 那种 processor -> model -> outputs -> postprocess 的链路也可以接。理论线也不是空口白话:原始工作是 JMLR 2023 ,RMA 加速版见 arXiv 2510.15362,仓库材料把它标成了 NeurIPS 2025 。公开材料里,VOC 上 SegFormer 相对 argmax 有 +1.02 mIoU,ADE20K 上 UPerNet 有 +0.98 mIoU,医疗分割里 LiTS / KiTS 还更明显。重点不在于“又多一篇分割论文”,而在于你不用重训,只是把最后一步重做一遍,就可能把已经训练好的模型再榨一点出来。
我把仓库、文档和可直接跑的入口放下面了。如果你正好做 segmentation ,可以很快试一下;如果你不做这个方向,我其实也更想聊另一个问题:你们自己的模型链路或者规则系统里,有没有这种“前面很复杂,最后一步却长期默认处理”的地方?
仓库:https://github.com/rankseg/rankseg
文档:https://rankseg.readthedocs.io/en/latest/
Hugging Face Space:https://huggingface.co/spaces/statmlben/rankseg
如果想先看效果,大概是这种感觉:
