Skip to main content

老师,我看 PR #46163 的实现发现一个设计卡点

  1. 老师,我看 PR #46163 的实现发现一个设计卡点。十六个模型的 post_process_semantic_segmentation 函数,在 return_segmentation_scores 为 True 的路径下都是先无条件执行 argmax,再把硬分类图塞进 segmentation 字段,把 per-class logits 塞进 segmentation_scores 字段。每个 model 都在自己的 post processor 内部把 argmax 做完了才往外吐。

    具体代码可以看 image_processing_beit.py 第 230 行附近,或者 image_processing_detr.py 第 910 行附近,十六个模型都是同一个 pattern,先算 seg_maps = logits.argmax(dim=1),再构造 SemanticSegmentationPostProcessorOutput(segmentation=seg_maps[i], segmentation_scores=logits[i])。

    我的看法是 post_process_semantic_segmentation 这个函数的语义定位应该再往前退一步,止于 probability 或者 logits 这一层。argmax 是下游的解码决策,不应该由 model family 这一层强加。现在这个函数名虽然叫 post_process,但做的事情其实是 decode,把 argmax 这一步嵌死在 image processor 内部,等于 model 这一层把解码策略替所有下游选好了,下游消费者想跳过 argmax 直接拿概率图去解码,没有任何 API 路径可以选。

    还有一个相关位置是 pipelines/image_segmentation.py 第 207 行那个 semantic 分支,目前它直接消费 self.image_processor.post_process_semantic_segmentation 的返回值做 outputs.numpy(),这一行也说明 pipeline 现在的设计是把 image processor 的输出当作硬 mask 来用,等于默认接受 argmax 嵌死的现状。

    我想讨论的方向是 post_process_semantic_segmentation 函数的职责边界,应该是把 logits 或者 probability 暴露给下游,至于要不要 argmax、用什么 metric-aware 解码,应该交给 pipeline 或者消费者来决定。这样语义更干净,也不会让每一个 model 都在自己的 post processor 内部重复 argmax 这一步。

    这个改动对短期 RankSEG 集成没有阻塞,消费 segmentation_scores 字段就够,但长期方向值得在 PR 下面定下来,避免 argmax 嵌死在 image processor 里成为技术债。

    老师您觉得这个方向值得直接发 comment,还是开 follow-up issue 更稳。同学也可以去看一下这两个位置再讨论。

🌐 CDN Trace Information

Loading...