在计算机视觉里,人体解析(Human Parsing)是虚拟试衣、动作识别这类应用的前置技术。但一碰到多人重叠、遮挡或者远距离小目标,传统的语义分割方案就经常出问题:边界模糊、部位错配,甚至把多个人当成一个整体。
这就是 M2FP(Mask2Former-Parsing)模型被用起来的原因。它基于 Mask2Former,专门针对多人复杂场景做了改进,比较关键的是两层注意力机制和实例感知解码器,能对多人区域实现更准的定位和语义解耦。
但真正让 M2FP 能落地的,是背后那套工程化设计——尤其是可视化拼图算法。很多开发者在部署类似模型时会发现,模型能输出 mask,结果却没法直观展示,多个 mask 叠加在一起颜色乱成一团。这本质上是后处理没跟上。M2FP 的服务把拼图逻辑直接内置了,打通了'推理 → 输出 → 可视化'的最后一环。
M2FP 的模型设计:为什么它更擅长多人场景?
M2FP 的起点是 Mask2Former,这个框架用一组可学习的掩码查询(mask queries)来动态生成分割结果。它比传统的 FCN 或 U-Net 更能抓住上下文,分辨率也保持得更好。
但原版 Mask2Former 的所有 mask query 共享全局语义,多人场景下容易搞混身份。M2FP 加了两项改进:
- 实例感知的查询初始化:每个 mask query 一开始就绑定一个人体候选框(来自预训练的人体检测器),强迫每个查询只关注特定个体。
- 层级注意力模块(HAM):在 Transformer 解码器里,先做跨人区分(inter-person attention),再做部位细分(intra-part attention),缓解遮挡问题。
# 简化版 HAM 注意力模块示意(实际实现位于 mmseg/models/decode_heads)
class HierarchicalAttention(nn.Module):
def __init__(self, embed_dim):
super().__init__()
self.inter_attn = MultiheadAttention(embed_dim, num_heads=8)
self.intra_attn = MultiheadAttention(embed_dim, num_heads=8)
def forward(self, x, pos_emb, person_masks):
# Step 1: 跨人注意力,分离不同个体特征
x_inter = self.inter_attn(x, key=x, value=x, attn_mask=person_masks)
# Step 2: 部位内注意力,细化各身体区域
x_intra = self.intra_attn(x_inter + pos_emb)
return x_intra
骨干网络方面,M2FP 选了 ResNet-101,没跟风用 Swin Transformer。这里有个权衡:
| 维度 | ResNet-101 | Swin-T |
|---|---|---|
| 推理速度 (CPU) | 快 35% | 慢 |
| 显存占用 | 低 | 高 |
| 小目标检测 |

