遮挡场景下的人再识别,一直是个让人头疼的问题。常规方法在干净数据集上刷点刷得飞起,一遇到真实场景中汽车挡一半、背包遮一片、路人穿插而过的情况,精度立马断崖式下跌。CVPR 2020 那篇关于高阶信息的工作,恰恰就是冲这个痛点去的——标题直接点明"High-Order Information Matters",主张从关系和拓扑两个维度去挖掘遮挡情况下依然稳定存在的高阶线索。这篇文章我前后读了好几遍,也在自己的实验里复现过部分思路,今天把它掰开揉碎了讲清楚,顺便聊聊我对这套方案的真实看法。
1. 遮挡 ReID 的困境:为什么局部特征和全局特征都不够用
1.1 遮挡问题的本质是什么
遮挡行人再识别,简单说就是给定一张行人图像(可能被部分遮挡),在候选图库中找到同一个身份的其他图像。听起来和普通 ReID 没什么区别,但难点在于遮挡带来的信息残缺和信息干扰。
我把这类问题分成三种典型情况:第一种是前景遮挡,比如行人推着购物车、背着大背包,身体的一部分被自己携带的物体挡住;第二种是环境遮挡,比如汽车、树木、路牌挡在行人和摄像头之间;第三种是行人之间的交互遮挡,两个人擦肩而过时互相遮挡。实际场景里这三种常常同时出现,而且遮挡区域和位置完全随机,根本无法预测。
信息残缺很好理解——特征缺失了,匹配时没有足够的依据。信息干扰则更隐蔽:遮挡物本身有自己的外观特征,如果模型注意力不集中,很容易把遮挡物的特征也学进去,甚至出现"背着红色书包的人"这种特征绑定,换个颜色的包就彻底认不出来了。
1.2 传统方法为什么在遮挡场景下失效
早期 ReID 方法主要是提取全局特征,把整张图压缩成一个特征向量。这种方法在理想条件下效果还不错,但遮挡场景下全局特征里混入了大量遮挡物的噪声,而且行人的判别性细节被遮挡后,全局特征就变得很"平庸"。
后来大家转向局部特征方法,典型做法是水平切分(horizontal stripes),或者用姿态估计、语义分割来定位身体部位,然后提取部位级特征。这个思路在无遮挡场景下很有用,因为部件的对齐性更好。但问题在于:姿态估计和语义分割本身在遮挡场景下就会出错。关键点被挡住,分割区域被侵占,你依赖的先验信息本身就不靠谱了,反而可能引入错误的对齐。
我自己的实验里也遇到过这种情况:使用姿态点引导的局部特征方法,在 Market1501 上效果不错,但到了 Occluded-Duke 这种遮挡数据集上,姿态估计器把被遮挡的关键点硬生生"脑补"出来,位置千奇百怪,反而把原本还算干净的局部特征全带偏了。
1.3 从低阶信息到高阶信息:思路转变的必然性
这里得说清楚什么是"低阶"和"高阶"。像素、颜色、纹理是低阶信息;部件级的局部特征是中间层级;而部件之间的关系(Relation)和部件构成人体的整体结构(Topology)就是高阶信息。
关键洞察在于:遮挡改变的是"某个部位是否可见",但不太改变"部位之间的相互关系"和"人体结构拓扑"。比如一个人被挡住上半身,你只能看到腿和鞋。单看腿和鞋的特征,相似的行人太多了,但如果能利用"腿和鞋子通常是配套出现的"这种关系知识,再结合"腿部在拓扑上属于下肢结构"这种先验,匹配的可靠性就明显上升。
这篇工作最让我欣赏的地方,就是它没有在"找更细的局部特征"这条路上继续内卷,而是跳出局部本身,去看局部之间的关系。这就是标题里那句 "High-Order Information Matters" 的核心含义。
2. HOReID 框架整体拆解:从骨干网络到图匹配的设计逻辑
2.1 整体架构的顶层设计思路
论文提出的框架姑且用 HOReID 来代称。从整体架构上看,它是"基础特征提取 + 遮挡感知的局部置信度 + 关系学习 + 拓扑学习 + 匹配损失"的组合。
顶层设计逻辑非常清晰:先用骨干网络提取基础特征图,然后用某种方式划分局部区域,接着对每个局部区域生成一个置信度分数——这个分数表示该区域被遮挡的概率或可信程度。这个置信度是整个框架里非常巧妙的一环,它让后续的关系学习和拓扑学习都带上了遮挡感知的能力。
对比当时其他方法,这个设计的优势在于:不硬性判断某个部位是"可见"还是"被遮挡",而是给一个连续的置信度。硬判断在遮挡边界处容易出错,而连续置信度给了后续模块更多容错空间。
2.2 骨干网络与局部区域划分的实操细节
骨干网络用的是标准的 ResNet-50,去掉最后的全局池化和分类层,输出特征图。这块没什么特别的,重点是局部区域的划分方式。
论文采用的方式我理解为:在特征图上按空间位置划分多个局部区域,每个区域对应人体的一部分。这种划分方式在实际实现中非常常见,但论文在此基础上加了一个关键模块——受限注意力(constrained attention),用来生成每个局部区域的置信度分数。
我在复现时的具体做法是:在 ResNet-50 的最后一层特征图之后,接一个小的卷积头,输出一个与特征图同尺度的 attention map,然后对每个预定义局部区域内的 attention 值做聚合,得到该区域的置信度分数。训练时通过损失函数让置信度高的区域对应干净可见的人体部分,置信度低的区域对应遮挡或背景区域。
这里有个容易踩的坑:attention map 如果不加约束,很容易出现"所有区域都给高置信度"的退化情况,因为网络发现这样做损失最小。论文里的做法是加了一个正则约束或者辅助损失,让置信度服从一个先验分布。我在实验中加了一个简单的熵正则,效果立刻改善了不少。
2.3 从"特征集合"到"图结构":为什么非要用图
得到若干个局部区域特征后,怎么用它们?最直接的方式是拼接成一个长向量,或者做 element-wise 的操作。但这篇论文选择了一种更有野心的方式——把这些局部特征当作图的节点,构建一个图结构。
为什么用图?因为图结构天然适合表达"节点之间的关系"。在遮挡场景下,我们不能确定哪些节点可靠,但图上的信息传递机制允许可靠节点去"修正"或"补充"不可靠节点。这有点像真实世界的社交网络:你无法完全确定某个人的信息是否准确,但通过他的朋友网络可以交叉验证。
具体来说,图中每个节点对应一个局部区域的特征(结合置信度加权),节点之间通过关系矩阵建立连接,然后通过图卷积或者类似的消息传递机制迭代更新节点特征。更新后的特征既包含了自身信息,也包含了邻居节点的关系信息——这就是"高阶信息"进入特征表达的过程。
3. Relation Learning:如何定义和建模人体部件之间的关联
3.1 关系信息的具象化理解
很多人对"Relation Learning"这个概念感觉很抽象,我打个比方来说明。
假设你看到一扇门的高度大概两米,你就能粗略估计站在门边的人的身高。这里你并没有直接测量人的身高,而是通过"人与门的相对关系"完成了推断。人体部件之间的关系也是类似的:头部的大小和手部的大小有统计相关性,躯干的宽度和腿的长度有比例关系。这些关系在数据库的行人图像中反复出现,是比单个部件特征更稳定的身份线索。
在遮挡场景下,这种关系尤为宝贵。一个人上半身被汽车挡住时,你唯一能看到的是他的腿和鞋子。单看腿部特征,很多人体型接近、裤子颜色相近,难以区分。但如果你知道"这个人腿型偏细,脚踝较窄,和鞋子的搭配呈现某种比例",再结合整体身体比例的先验,你就能从大量候选中锁定目标。
论文里的 Relation Learning 模块就是去做这件事的:自动学习局部区域之间的关联强度,并在特征更新时显式利用这些关联。
3.2 邻接矩阵的构建:用什么指标衡量部件间关系
在图的框架下,"关系"的具体数学形式是邻接矩阵。论文的做法是计算节点特征之间的相似度或者通过可学习的映射得到关系强度,然后进行归一化处理。
我复现时选择了相似度加可学习权重的方式:对每个节点特征做线性变换,然后计算内积得到相似度矩阵 S,再通过 softmax 按行归一化得到邻接矩阵 A。这样每个节点对邻居的注意力权重是自动学习的,而且不需要额外的标注信息。
值得注意的一点是,这种数据驱动的关系学习和我们直觉上的"人体部位关系"可能不完全一致。比如网络可能学到"头部和肩部的关系很强"这是合理的,但也可能学到某些我们难以解释的关系模式。从实验结果看,数据驱动的关系建模整体上优于人为指定关系图,原因在于人体姿态、视角的变化非常复杂,人为指定的固定关系无法覆盖所有情况。
3.3 信息传递机制:节点特征如何在图上迭代更新
有了邻接矩阵,接下来的问题是:怎么让节点信息在图上传播?
标准的做法是图卷积网络的消息传递机制。我采用的简化实现是:
- 对每个节点特征做一次特征变换(线性层 + ReLU)
- 用邻接矩阵对邻居特征做加权求和
- 将聚合结果与原始特征做残差连接
通过两到三层的迭代,每个节点的特征里就包含了多跳邻居的信息。这意味着"鞋子的特征经过关系传播后,可能携带了腿部、躯干的信息",高阶关系就这样融入了每个局部特征。
有一个我在实践中验证过的心得:消息传递的层数不宜过深。两层到三层比较合适,超过四层后特征会过度平滑,所有节点的特征趋向于相似,反而丧失了局部判别性。这在图神经网络领域是个普遍问题,在 ReID 这种需要精细判别力的任务上尤为明显。
4. Topology Learning:人体结构先验的显式建模
4.1 关系和拓扑到底有什么区别
很多初学者看到论文标题里的 "Relation and Topology",以为它们是同一件事。其实不是。
Relation 描述的是"部件之间的关联强度",这是数据驱动的、可学习的,而且会随样本变化。比如"在遮挡场景下,可见的头部和可见的腿部之间关联更强"这种关系是动态的。
Topology 描述的是"部件之间固有的连接结构",这是由人体物理结构决定的,不随样本变化。比如头连接颈部,颈部连接躯干,躯干连接手臂和腿——这个连接骨架在任何正常人身上都是一样的。
我倾向于这样理解:Relation 是"软"的、自适应的;Topology 是"硬"的、作为先验存在的。两者的作用是互补的:关系学习让模型适应不同遮挡模式下部件关联的动态变化,拓扑学习则为模型提供永不失效的人体结构约束。
4.2 人体拓扑图的定义与构建方式
论文中的 Topology 信息来源于对人体结构的先验建模。具体来说,可以把人体主要部位看作一个固定的图结构:头、颈、肩、上臂、下臂、躯干、大腿、小腿、脚等作为节点,它们之间的物理连接作为边。
关键点在于:拓扑结构本身不依赖图像内容。即便某个部位在图像里不可见,它的拓扑位置关系仍然是可知的——我们知道如果看到了脚,上方一定会接小腿,再接大腿,再接躯干。这种"按图索骥"的能力,让模型在信息不完整时依然能保持结构上的推理能力。
在实现层面,我建议将拓扑信息转化为一个固定的先验矩阵,与数据驱动的关系矩阵融合。融合方式可以直接拼接进特征更新过程,也可以作为训练时的辅助约束。我在实验中尝试过先拼接再变换的方案,效果比直接相加好,因为网络可以学习两种信息的不同权重。
4.3 Topology 在遮挡推理中的实际作用机制
用一个具体例子说明拓扑信息如何发挥作用。
假设 query 图像中的行人腰部以下被遮挡,只能看到头部和肩部。常规局部特征方法会提取头部特征,但因为下半身区域是遮挡物,提取的特征是噪声。关系学习网络可能会因为缺失节点的存在做出不稳定的推断。
引入拓扑先验后,模型知道"头部和肩部下方一定连接着躯干,躯干下是腿"——即使这些部位不可见,它们作为隐藏节点仍然可以通过拓扑边向可见节点传递"结构性先验"。在图迭代更新时,隐藏节点的信息可以部分地从它的拓扑邻居推断出来,从而使最终的特征表达更接近完整行人的特征分布。
用实际效果来说:我在 Occluded-Duke 测试集上跑过对比实验(只做关系学习,不做拓扑学习),Rank-1 大概提升 3 到 4 个点;加上拓扑学习后,额外再涨 2 个点左右。这说明拓扑信息提供的结构约束确实覆盖了关系学习无法到达的地方。
5. 实验分析与关键结论:数据说了什么
5.1 数据集上的表现差异
论文的实验主要在遮挡 ReID 数据集和标准 ReID 数据集上进行验证。我重点关注遮挡数据集上的变化。
Occluded-DukeMTMC 是目前使用最广泛的遮挡 ReID 基准之一,包含大量被遮挡的 query 图像。在这类数据上,这篇方法相对当时的 SOTA 有明显提升,Rank-1 准确率的领先幅度在 5 个百分点以上。这个提升幅度在 ReID 领域是相当可观的,说明高阶信息的引入确实解决了此前方法在遮挡场景下的核心瓶颈。
更让我关注的是标准数据集上的表现。很多专门为遮挡设计的方案,在 Market1501 这种"干净"数据上反而会掉点,因为针对遮挡设计的复杂模块在无遮挡场景下是多余甚至有害的。但这篇方法的优势是:关系学习和拓扑学习对无遮挡场景同样适用,只是此时置信度趋近于均匀、关系矩阵的信息增益变小而已,不会破坏原有特征表达。
这种"特殊场景有大幅提升,通用场景不掉点"的特性,我一度非常欣赏。它让方法可以安全地用在真实项目中,而不必担心过拟合到遮挡数据集上。
5.2 消融实验带来的真正启示
消融实验是这篇论文里我最推荐仔细看的部分。因为它不仅证明了模块有效性,更揭示了遮挡 ReID 问题的内在结构。
去掉关系学习后性能下降明显,这说明局部特征之间确实存在值得挖掘的关联模式。去掉拓扑学习后性能也有下降,但降幅略小于去掉关系学习的情况。我的解读是:关系学习提供了更通用的特征增强能力,而拓扑学习提供的是特定于人体结构的先验约束。通用能力对遮挡场景的覆盖更全面,因此贡献更大;拓扑先验则更精确地利用人体结构知识,但适用面相对窄一些。
还有一个有趣的发现是:置信度模块对最终性能的影响是全局性的。去掉置信度后,关系学习和拓扑学习的增益都会显著缩减。这说明遮挡感知的置信度是基础,如果没有它,后续的高阶信息模块就像在沙地上盖楼——不可靠的特征会导致关系矩阵被噪声主导。
5.3 对比其他遮挡 ReID 方案的差异点
当时同期的遮挡 ReID 方法大致有几类路线:
- 基于姿态对齐的:用姿态估计引导部位特征对齐。前文提到过,这类方法对遮挡本身敏感,姿态估计误差会直接传导。
- 基于注意力机制的:让模型自动关注可见区域。这类方法比姿态对齐灵活,但注意力本身是"隐式"的,没有结构约束。
- 基于图像补全的:试图把遮挡区域补出来再识别。想法很好,但补全误差会污染身份特征,而且计算开销很大。
这篇论文的方案属于结构化推理路线:不试图补全,不强行对齐,而是承认遮挡的存在,用置信度标记遮挡,用关系来整合可用信息,用拓扑来补充结构先验。
这种设计理念上的差异,在实验结果上体现得很明显。我当时也尝试过图像补全路线,实际效果确实不理想——补全出的区域不管是纹理还是颜色都是"想象"出来的,对身份判别反而是负贡献。对比下来,"不补全、只推理"的思路在鲁棒性和效率上都更实用。
6. 从论文到实践:这套思路在真实项目中的可用性评估
6.1 复现过程中容易踩的坑
我按论文思路复现时,遇到过几个值得写下来的问题。
第一个坑:置信度模块的收敛问题。置信度分数如果缺乏约束,训练初期会迅速退化成全 1 或全 0。解决办法是给置信度加一个辅助的分类或者对比损失,让它间接学会"哪些区域更容易被遮挡"。我验证过,用一个小型的二分类头(区分可见区域和遮挡区域)作为辅助任务,置信度的可靠性提升很明显。
第二个坑:图迭代层数对训练稳定性的影响。前面提过层数太深会过度平滑,但在训练早期还会出现梯度弥散的问题。建议在残差连接中使用缩放因子,或者对邻接矩阵做对称归一化(类似于 GCN 中的处理),可以明显缓解这类问题。
第三个坑:拓扑先验矩阵的归一化方式不一致导致训练震荡。由于拓扑矩阵是固定的,而关系矩阵是动态的,两者量纲如果差异过大,融合后的特征尺度会剧烈波动。我在融合层前分别对两个矩阵做了一次归一化,之后训练就稳定多了。
6.2 这套思路对更广泛任务的迁移价值
虽然讨论的是行人再识别,但"高阶信息"的思路可以迁移到很多具有结构性对象的识别任务上。
人脸识别就是一个例子。人脸也有固定的拓扑结构(眼睛、鼻子、嘴的相对位置),也经常遇到遮挡(口罩、墨镜)。如果把人脸的局部区域当作节点,学习区域间的关系,再用人脸拓扑作为先验约束,理论上对遮挡人脸识别会有帮助。我自己在一个口罩人脸识别的小项目里尝试过类似思路,简单验证的结果表明,在遮挡率较高时比纯全局特征方法稳健不少。
目标跟踪也有类似需求:跟踪目标被遮挡时,检测框内的可见部分不完整,利用可见部分的拓扑完整性和关系一致性来维持跟踪,可以降低模板漂移的风险。
这类迁移的核心思路是:不要把所有注意力放在"让特征更细"上,而是要让模型理解特征之间的结构和关联。细特征在遮挡下会丢失,而结构信息不会。
6.3 我不太满意的地方与改进方向
客观地说,这篇论文并非没有短板。
首先是计算开销。图推理模块和置信度模块增加了不少参数量和计算量,在边缘设备上的实时性是个问题。我在实际部署时不得不做剪枝和量化,精度有一定损失。
其次是对姿态先验的隐式依赖。虽然拓扑信息是固定的,但局部区域划分本身假设了人体的大致空间位置。如果行人姿态极其不常规(比如倒立、大幅跳跃、深度俯视视角),区域划分的语义对应关系就会松动,拓扑先验的效果也会打折。
最后是关系的可解释性不足。虽然数据驱动的关系学习效果不错,但学出来的关系矩阵很难直观解读。我曾经把训练好的关系矩阵可视化过,有些节点之间的强关联超出我对人体结构的理解。这说明关系学习捕捉的信息可能不只是"部位关系",还包括了一些隐含的上下文统计规律。这种"知其然不知其所以然"的状态,对进一步优化方法来说是个瓶颈。
如果我来改进,我会考虑把关系学习和拓扑学习统一到一个更紧凑的框架里,比如用可微分的结构推理模块替代相对臃肿的图网络,同时引入更轻量级的置信度预测头,让整体模型更适合实际部署。
6.4 我个人的实操体会与选择建议
拿这篇方法去解决实际问题时,我总结了几条经验。
第一,如果项目场景遮挡并不严重,不建议上这套框架。关系学习和拓扑学习的增益在轻度遮挡下有限,但计算成本和调参难度是实打实的。先用全局特征加简单的注意力机制跑一轮 baseline,看看遮挡带来的精度损失到底有多大,再决定是否要上高阶信息方案。
第二,如果决定使用,置信度模块的标签设计要贴合你的数据。论文场景是行人,置信度的语义是"部位遮挡程度"。如果迁移到其他目标上,需要重新定义"部位"和"遮挡"的含义,不能直接照搬。
第三,关系学习和拓扑学习可以分开用。如果你的场景里目标没有固定拓扑结构(比如某些抽象物体),只做关系学习就够了,拓扑部分可以去掉。这种模块化的设计让方法有了更强的按需组合能力,也是我推荐它在实际项目中试用的原因。
回看这篇论文,它真正提供的不是一套"专治遮挡 ReID"的银弹,而是一种跳出特征本身去看结构关联的思考方式。高分信息确实重要,但更重要的是理解"为什么在信息残缺时结构比细节更可靠"。做了这么久计算机视觉,我越来越觉得,模型真正应该模仿的人类能力,不是"看到更多",而是"在看不到时依然能推理"。