我现在在做 RankSEG 与 Hugging Face Transformers 的集成设计,目标不是继续维护一个 forked transformers,而是优先在 rankseg 侧实现对 Hugging Face segmentation model outputs 的兼容函数。
背景:
1. 我之前已经在一个本地 transformers 分支里做过一版集成,改的是 `src/transformers/pipelines/image_segmentation.py`,核心思路是在 pipeline 的 semantic segmentation postprocess 阶段加入 RankSEG。
2. 那版实现里最关键的 helper 是:根据不同模型的
3. 现在不想要求用户安装我 fork 的 transformers。更希望最终用户只需要安装官方 transformers 和 rankseg,就能用 rankseg 的 Hugging Face 兼容能力。
已确认的技术判断:
1. 不优先走
2. 不建议给
3. 更稳的方案是:在 rankseg 里提供 helper
4. RankSEG 真正依赖的不是 pipeline,而是“如何把不同 transformers model outputs 统一成 semantic segmentation probability map”。
请先理解这些 transformers 相关概念:
1.
是直接加载“任务模型”,不是 pipeline。
2.
是加载与模型配套的图像前处理器。
3. 用户一般会这样手动推理:
-
-
- 然后自己做 resize / argmax / 后处理
4. 我想插入 RankSEG 的位置,就是在
已探索到的 transformers 输出形态差异:
1. 标准 semantic segmentation 模型:
-
- 对应
- 示例:SegFormer
2. query-based universal segmentation 模型:
-
-
- 示例:Mask2Former / OneFormer
3. DETR segmentation 模型:
-
-
4. 还有一些
已经看过的本地 transformers 参考位置:
-
-
-
-
-
-
rankseg 侧的历史参考:
1. 我之前做过
2. 这个经验说明:在 rankseg 侧做 Hugging Face outputs 兼容 helper 是合理的。
当前开发目标:
请在
建议的第一版 API:
-
-
第一版范围只支持:
1.
2.
3.
设计要求:
1. 保持线性逻辑,避免复杂抽象。
2. 不要先搞通用 CV toolbox。
3. 不要给 outputs 动态挂方法。
4. 不要先做 transformers pipeline patch。
5. 如果某些 output 类型不支持,明确报错即可。
6. 如果需要 resize 到 target size,请参考 transformers 自己 image processor/postprocess 的做法。
7. 如果需要从 query-based outputs 还原 semantic class scores,请参考 transformers 现有 post_process_semantic_segmentation 的实现思路。
如果当前线程有本地两个 repo:
- transformers:
- rankseg:
请直接在 rankseg 里开发,并可把 transformers 当参考代码读取。
如果
工作方式要求:
- 请始终称呼我为 Jasen。
- 默认用中文回复。
- 内部思考和工具使用可用英文。
- 先阅读 rankseg 当前包结构,再决定新增文件位置。
- 优先做最小实现和一个 smoke test/示例,不要额外重构。
背景:
1. 我之前已经在一个本地 transformers 分支里做过一版集成,改的是 `src/transformers/pipelines/image_segmentation.py`,核心思路是在 pipeline 的 semantic segmentation postprocess 阶段加入 RankSEG。
2. 那版实现里最关键的 helper 是:根据不同模型的
outputs 结构,把它们统一还原成 semantic segmentation 的概率图 `(B, C, H, W)`,然后再交给 `RankSEG.predict(...)`。3. 现在不想要求用户安装我 fork 的 transformers。更希望最终用户只需要安装官方 transformers 和 rankseg,就能用 rankseg 的 Hugging Face 兼容能力。
已确认的技术判断:
1. 不优先走
transformers.pipeline(...) patch 方案,至少第一步不这么做。2. 不建议给
outputs 对象动态挂方法,比如 outputs.rankseg()`,因为 outputs 类型不统一,很多模型还可能 `trust_remote_code=True 返回 tuple 或自定义对象。3. 更稳的方案是:在 rankseg 里提供 helper
4. RankSEG 真正依赖的不是 pipeline,而是“如何把不同 transformers model outputs 统一成 semantic segmentation probability map”。
请先理解这些 transformers 相关概念:
1.
AutoModelForSemanticSegmentation.from_pretrained(...)是直接加载“任务模型”,不是 pipeline。
2.
processor = SegformerImageProcessor.from_pretrained(...)是加载与模型配套的图像前处理器。
3. 用户一般会这样手动推理:
-
inputs = processor(images=image, return_tensors="pt")-
outputs = model(**inputs)- 然后自己做 resize / argmax / 后处理
4. 我想插入 RankSEG 的位置,就是在
outputs 之后、argmax 之前。已探索到的 transformers 输出形态差异:
1. 标准 semantic segmentation 模型:
-
outputs.logits- 对应
SemanticSegmenterOutput- 示例:SegFormer
2. query-based universal segmentation 模型:
-
outputs.class_queries_logits-
outputs.masks_queries_logits- 示例:Mask2Former / OneFormer
3. DETR segmentation 模型:
-
outputs.logits-
outputs.pred_masks4. 还有一些
trust_remote_code=True 的模型可能不遵循标准 ModelOutput`,例如有人直接示例里写 `model(input_images)[-1]已经看过的本地 transformers 参考位置:
-
/Users/lev1s/Documents/GitHub/transformers/src/transformers/pipelines/image_segmentation.py-
/Users/lev1s/Documents/GitHub/transformers/src/transformers/modeling_outputs.py-
/Users/lev1s/Documents/GitHub/transformers/src/transformers/models/segformer/image_processing_segformer.py-
/Users/lev1s/Documents/GitHub/transformers/src/transformers/models/mask2former/image_processing_mask2former.py-
/Users/lev1s/Documents/GitHub/transformers/src/transformers/models/detr/modeling_detr.py-
/Users/lev1s/Documents/GitHub/transformers/src/transformers/models/oneformer/modeling_oneformer.pyrankseg 侧的历史参考:
1. 我之前做过
rankseg/paddleseg 兼容层,思路是 rankseg 自己提供兼容 facade,而不是修改 PaddleSeg 上游。2. 这个经验说明:在 rankseg 侧做 Hugging Face outputs 兼容 helper 是合理的。
当前开发目标:
请在
rankseg 仓库里设计并实现第一版 Hugging Face outputs 兼容函数,优先做最小可用版本,不要过度设计,不要做大而全封装,不要先做 pipeline monkey patch。建议的第一版 API:
-
semantic_probs_from_outputs(outputs, model=None, image_processor=None, target_sizes=None)-
predict_semantic_segmentation(outputs, model=None, image_processor=None, target_sizes=None, rankseg_kwargs=None)第一版范围只支持:
1.
outputs.logits2.
outputs.class_queries_logits + outputs.masks_queries_logits3.
outputs.logits + outputs.pred_masks设计要求:
1. 保持线性逻辑,避免复杂抽象。
2. 不要先搞通用 CV toolbox。
3. 不要给 outputs 动态挂方法。
4. 不要先做 transformers pipeline patch。
5. 如果某些 output 类型不支持,明确报错即可。
6. 如果需要 resize 到 target size,请参考 transformers 自己 image processor/postprocess 的做法。
7. 如果需要从 query-based outputs 还原 semantic class scores,请参考 transformers 现有 post_process_semantic_segmentation 的实现思路。
如果当前线程有本地两个 repo:
- transformers:
/Users/lev1s/Documents/GitHub/transformers- rankseg:
/Users/lev1s/Documents/GitHub/rankseg请直接在 rankseg 里开发,并可把 transformers 当参考代码读取。
如果
rankseg repo 还没在本地,先确认路径或 clone 后再继续。工作方式要求:
- 请始终称呼我为 Jasen。
- 默认用中文回复。
- 内部思考和工具使用可用英文。
- 先阅读 rankseg 当前包结构,再决定新增文件位置。
- 优先做最小实现和一个 smoke test/示例,不要额外重构。