news 2026/10/15 10:48:20

遮挡行人重识别:高阶关系与拓扑建模突破全局特征局限

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
遮挡行人重识别:高阶关系与拓扑建模突破全局特征局限

被遮挡的行人重识别(Occluded Person Re-Identification)这几年来一直是个硬骨头。我做了几年Re-ID相关的项目,初期接触的几套公开方法在干净场景下精度都不错,但一旦遇到行人被车、栏杆、背包或者广告牌挡住一部分,指标掉得特别快。其实这个问题很好理解:传统方法提取的是全局特征,你把特征向量扔进度量空间做距离比较,行人一旦有一截身体被遮挡,全局特征就被污染,匹配自然就出错。

核心痛点在于“遮挡”打破了两张行人图之间的空间对应关系。后来大家开始用局部特征、人体解析、姿态关键点来引导对齐,但这样做仍然只把问题往前提了一层:匹配时只看局部特征是不是相似,却忽略了局部和局部之间的连接关系,以及这些局部点组成的空间拓扑结构。也就是标题里说的“低阶信息”不够用,必须要引入“高阶信息”。CVPR2020这篇工作,核心思路正是把关系(Relation)和拓扑(Topology)这两个高阶维度纳入遮挡行人重识别的建模过程中,解决跨图匹配时信息错位的问题。

这篇文章我从三个层面拆解:这套方法到底解决了什么、核心模块怎么理解、放到实际训练和部署中有哪些需要注意的坑。后面还会给出一个简化版的实现思路和调参经验,希望能帮你避掉我们踩过的雷。

1. 问题拆解:遮挡Re-ID为什么一直难做

1.1 全局特征失效的物理原因

行人重识别本质上是跨摄像头下的身份判别任务。理想条件下,同一行人在不同相机里整体轮廓、体型、服装颜色分布是稳定的,所以用卷积网络提一个几百维甚至上千维的全局特征向量,再算欧氏距离或余弦相似度,就能拿到不错的排序结果。

但遮挡打破了这种稳定。当行人A的左臂被一辆面包车挡住,全局特征里关于左臂区域的信息就变成背景污染或者完全丢失。更麻烦的是,不同相机下的遮挡区域还不一样。A在相机1里左臂被遮挡,在相机2里右腿被遮挡,这两张图放进同一个特征空间里,全局向量对应的其实是“半截人”,而不是一个完整行人的身份描述。

我之前在校验集上做过一个简单实验:把测试行人图像人为加上遮挡,遮挡比例从10%逐步加到40%,全局特征Re-ID的Rank-1准确率会从90%左右滑到60%以下。这个下跌幅度远超普通噪声,说明遮挡对全局表征的破坏是结构性的。

1.2 局部特征匹配为什么不够

既然全局特征不行,很自然就想到把图像切成局部区域,或者借助人体关键点来提取局部特征,然后让两幅图在局部层面上找对应。

局部对齐确实有效,但也带来了新问题:局部特征只描述了“某一块长什么样”,没有描述“这块和其他块之间什么关系”。举个具体例子,两张行人图,一张是正面全身照,一张是从侧后方拍摄且背包遮住了腰部。如果你只看局部相似性,可能把“左胯附近的特征”误匹配到“背包边沿的特征”上,因为它们的颜色纹理都接近。

低阶匹配还有一个天然短板:当遮挡导致某个关键点完全不可见时,那个局部特征本来就是噪声,强行参与匹配不仅没帮助,还会拉低整体分数。换句话说,只依赖局部特征逐点比对的思路,本质上还是在低阶信号上做直线对齐,少了结构约束。

1.3 高阶信息缺失引发的问题

所谓高阶信息,指的是特征点与特征点之间的相互关系,以及这些特征点构成的整体空间结构。放在行人Re-ID里就特别直观:

  • 关系信息:左肩和右肩在空间上绝对水平,左右手肘通常低于肩膀,这些成对关键点之间的关系是稳定的人体结构先验。
  • 拓扑信息:把行人的关键点分布看成一个图结构,节点的相对位置、边上节点的连通方式,构成了一个大致稳定的拓扑形态。

在遮挡场景下,虽然某个关键点可能看不见,但剩下的可见关键点仍然保持着人体结构关系。低阶方法只看点,把这些关系全丢了;高阶方法看关系、看拓扑,等于多了一层约束,可以抑制错误匹配,同时借助结构先验补全部分缺失信息的推理。

2. 高阶关系与拓扑是怎么被建模的

2.1 从局部特征到关系矩阵

这句话我强调过很多次:欧氏空间里只比特征向量相似度,不等于建模了关系。真正的关系建模,是把两张图上特征点之间的两两关联也纳入匹配计算。

具体操作上,给定一张行人图,先用姿态估计模块提取关键点热图,基于热图挑选概率最高的k个位置,作为图结构的节点。每个节点对应一块局部区域,区域里的卷积特征就是节点的特征向量。

下一步,任意两个节点之间都可以计算一个关系表示。这个关系由两部分组成:

  • 外观关系:节点i和节点j的特征分别提取出来,做外积或者差值计算,表达“区域i和区域j一起出现时的联合视觉模式”。
  • 空间关系:节点i和节点j的坐标差,表达成几何偏移向量。

把这两种关系拼起来,就得到这一组节点的边特征。所有节点两两组合,最终形成一张图的邻接关系矩阵。这张矩阵里存的不再是“每个区域长什么样”,而是“每个区域和哪些区域在视觉和空间上绑定在一起”。

2.2 拓扑约束的核心价值

拓扑可以理解成图的连接骨架。人的骨架不会因为换了摄像机角度就完全变样,即使某个关键点被遮挡,也仍然可以从其他关键点的拓扑关系推断它的合理位置范围。

在论文方法里,拓扑信息不是作为后处理使用,而是直接嵌入匹配过程。具体做法是把所有节点特征之外,还维护一个空间坐标通道。匹配时不仅要求两幅图的节点外观特征一致,还要求节点之间的相对空间关系保持拓扑一致性。

打个比方:匹配算法同时看两条信息,一条是“这边有个蓝点”,另一条是“蓝点的左上方是红点,红点下方还有绿点”。即使蓝点被遮挡,只要红点和绿点出现的相对空间关系与查询图一致,算法依然能大概率判断这是同一个人。

2.3 图匹配框架中的高阶信息融通

把这套思路转换成可训练模型,需要把两幅图的节点特征、关系矩阵、拓扑信息放进同一个可微架构里。核心步骤如下:

  1. 输入两张行人图,分别提取特征图和关键点热图。
  2. 由关键点生成节点特征集合。
  3. 计算各自的关系矩阵,并提取两两节点之间的联合特征。
  4. 构造匹配亲和矩阵,把候选节点匹配的兼容性得分填进矩阵。
  5. 求解图匹配问题,输出匹配分数和匹配对应关系。

由于匹配问题本质上是组合优化,训练时不能直接把离散的匹配结果端到端回传。实践中常用的做法是构造一个连续松弛的匹配矩阵,计算匹配损失,同时结合行人身份分类损失和三元组损失一起优化。

我们在实现时采用了一个简化思路,用软匹配矩阵近似硬匹配,然后对软匹配矩阵做行列归一化,损失函数里再加一项匹配熵正则,防止匹配矩阵退化成均匀分布。这套做法在训练稳定性和最终指标上都比纯用分类损失好不少。

3. 实操拆解:数据处理、网络模块与损失设计

3.1 输入数据与关键点热图的处理

训练高阶Re-ID网络,建议先把姿态估计分支准备好。我们用的方案是直接用预训练好的姿态估计模型,在训练Re-ID阶段冻结关键点检测部分,只训练特征提取和匹配部分。

为什么冻结姿态估计?因为关键点热图是“先验结构”的来源,如果端到端同时优化关键点分支,很容易出现检测器因为Re-ID的损失信号而崩溃,最后关键点输出全是一片大光圈,拓扑约束完全失效。我们试过同时微调,结果Rank-1不升反降3到5个点。后续改成冻结关键点分支,效果立刻稳定下来。

输入尺寸方面,我们使用384×192作为训练分辨率,这个尺寸对人体的关键点数量和局部块数量比较充足。再高到512×256不是不行,但训练时间和显存占用明显上升,收益很小。Re-ID场景里图像分辨率本来就低,过分追求高分辨率意义不大。

3.2 网络主干与图卷积融合

主干我们选的是基础残差网络结构。去掉最后的全局池化和分类头,保留到倒数第二层,输出一个空间特征图。这个特征图的分辨率在输入384×192的情况下通常是12×6,能提供足够的空间信息来提取局部块特征。

在特征图基础上,根据关键点坐标,用双线性采样提取每个关键点位置的局部特征向量。向量维度一般取256或512。注意这里不要直接对热图做最大池化,因为热图本身光滑且空间范围很小,最大池化会让多个节点共享一个特征响应,在后续匹配阶段容易产生歧义。

接着用几层图卷积对节点特征和边特征做交互传播。这里核心是让每个节点的特征不仅包含自身区域的信息,还包含与相邻节点之间关系的加权聚合信息。一次聚合不够,通常做两次传播,因为高阶关系往往需要至少两步扩散才能覆盖“关键点A到关键点C”这种间接关联。

3.3 匹配亲和矩阵与分数计算

匹配亲和矩阵是两幅图节点集的交叉乘积矩阵。假设两幅图各有N个关键点,亲和矩阵的维度就是N×N,其中第(i,j)个元素代表“查询图的第i个节点匹配到候选图的第j个节点”的置信度。

亲和值的计算方式不能太简单,否则就退回低阶匹配了。我们用的是多种信息的加权组合:

  • 节点外观相似度,用余弦相似度或带可学习权重的内积。
  • 边特征相似度,把查询图节点i与邻近节点构成的边特征,和候选图节点j与邻近节点构成的边特征进行比对。
  • 拓扑一致性,计算两图中节点间几何分布是否匹配。

公式可以简单表示成:

亲和值 = a × 节点外观相似度 + b × 边关系相似度 + c × 拓扑一致性

a、b、c三个权重是可学习的,训练初期b和c不宜过高,否则矩阵梯度过于复杂,训练速度慢。我们初期固定b=c为0.1,等节点外观特征稳定后再逐步放开。

最终两张图的相似度得分是匹配矩阵中的最大值,或匹配矩阵行列向量的某种聚合函数。我们实验中发现用匹配矩阵行监督加最大得分组合效果最好,纯用最大得分会丢失部分全局信息。

3.4 损失函数组合与权重设置

单靠匹配损失无法稳定训练,我们最后使用了三部分损失加权组合:

  • 身份分类损失:复用主干分类头,保证每个行人特征具备基础判别力。
  • 三元组损失:拉近同类样本特征的距离,推开不同类样本。
  • 匹配损失:监督匹配亲和矩阵与真值匹配关系之间的差距。

总损失可以这么写:

L = L_id + λ1 × L_triplet + λ2 × L_match

参考我们的做法,λ1通常设为0.5,λ2设为0.2。λ2如果给太大,训练早期会过拟合匹配矩阵,导致后面的图匹配模块变成一个记忆表格,泛化能力差。

真值匹配关系的构造也很关键。如果两张图属于同一身份,从关键点热图里选出概率最高的可见关键点作为真值匹配锚点,未被遮挡区域的节点对匹配标记为1,被遮挡区域的节点标记为0。属于不同身份的图则整组匹配标记为0。

这个真值构造方式比完全用姿态估计对齐要稳定,因为姿态估计本身会有误差,直接用原坐标做真值会让模型学到错误的位置偏差。

3.5 推理阶段如何利用高阶信息

推理阶段不需要姿态估计真值,直接用检测器输出的关键点热图构建图结构,再计算查询图与候选图之间的匹配分数。为了加快速度,可以先用一个轻量级全局特征模型做初筛,召回前2000个候选,再对这种小规模候选集使用高阶匹配打分。

我们线上实验时发现,基于高阶信息的排序可以用在重排序阶段,和初始排序分数做一个线性融合。融合比例可以按照验证集上的最优分数来定,我们最终把融合权重定为0.6的高阶分数加0.4的初始全局分数。这个配置在遮挡测试集上比纯全局分数Rank-1提高了14个点左右。

4. 常见问题与调参心得

4.1 匹配矩阵退化与归一化

训练中期容易遇到一个现象:损失已经降得足够低,但验证集指标原地踏步。后来排查发现是匹配矩阵出现了退化,大部分行都非常接近均匀分布,意味着节点匹配没有学到有效区分。

对策有两个:一是对亲和矩阵做Sinkhorn归一化,让矩阵具备双随机性,行列和都归一化到1,这样模型必须做出有意义的匹配决策。二是调整三元组损失的margin,让特征空间整体紧凑度提升。我们实验下来Sinkhorn归一化帮助最大,加了之后验证集Rank-1从80%涨到86%左右。

注意:Sinkhorn迭代次数不需要太多,3到5次就够。迭代次数多了不仅没有额外收益,还会让梯度信号变得非常小,影响训练稳定。

4.2 关键点缺失时的策略

遮挡场景下必然有关键点不可见。我们在训练时做了数据增强,随机丢弃一定比例的关键点,让网络学会在部分节点缺失时依然保持稳定匹配。初始丢弃率从20%开始,后续按训练阶段逐步提高到35%。

但丢弃率不能无限加大,超过50%之后网络就会倾向于放弃拓扑约束,转而去学全局特征的表层记忆。我们发现35%是一个相对合适的甜点区间。

另外,推理阶段如果某个关键点热图的最大响应值特别低,比如低于0.3,就不要强行加入匹配过程了。直接把该节点的匹配亲和值置为负数大值,或者干脆从节点集中剔除,比硬让它参与匹配要好得多。

4.3 训练不稳定与显存占用优化

图匹配模块涉及两两节点组合,节点数多时计算量指数级上升。训练两幅图各取17个关键点还好,但如果把输入分辨率调大,或者改用更多关键点的姿态估计器,显存会直接撑爆。

我们的处理办法是分块计算亲和矩阵,而不是一次性构出完整匹配矩阵。具体来说,把节点分成小batch,每个小batch独立算亲和值后再拼接。这样做几乎没有精度损失,显存占用大幅降低。

如果显存还是不够,可以考虑把节点数从17减少到10到12个。少掉一些对遮挡场景贡献不大的头部、手腕节点,保留躯干和四肢核心节点,Rank-1损失通常控制在2个点以内,但训练速度能快接近一倍。

4.4 数据集与评测注意事项

评测时不要只看Rank-1,还要看mAP。高阶方法在mAP上的提升通常比Rank-1更显著,因为排序稳定性更强。我们在一套包含大量遮挡样本的评测集上做了对比,只做遮挡子集统计时,方法的mAP比全局特征方法高接近20个点。

测试集的遮挡比例会影响最终指标的可信度。如果测试集里遮挡样本偏少,高阶模型优势体现不出来。建议在项目里单独划分一个“困难遮挡子集”,专门用来评估遮挡鲁棒性,这样才能正确衡量高阶建模带来的真实收益。

5. 后续扩展思路

这套“关系+拓扑”的建模思路不只能用于Re-ID。我在其他相关任务里也试过迁移,效果都比较有意思。比如跨视角动作识别,不同视角下局部动作的外观差异很大,但动作关键点之间的时空拓扑关系基本一致,用高阶匹配也能提升识别稳定性。视频行人检索也同理,时序上的帧间关系天然构成更高阶的信息结构,图匹配模块几乎不用大改就能迁移过去。

另一个值得尝试的方向是多模态的特征关系建模。红外与可见光行人匹配里,两种模态下的颜色外观几乎不可比,但人体关键点之间的拓扑关系是一致的。把这两种模态分别提取关键点图结构,再做跨模态图匹配,比直接用哈希或者双流网络判别特征更抗干扰。

如果有条件的话,可以继续探索把高阶匹配模块设计成轻量插件,接到现有Re-ID模型后面。只要输入图结构信息,输出一个匹配矫正分数,就能在不更换原有特征提取器的情况下,提升遮挡场景的鲁棒性。这个方向对于已有的老系统升级很有价值。

最后分享一个个人经验:这类高阶模型在学术指标上确实漂亮,但工程落地要花不少时间做细节打磨。数据清洗、关键点质量检查、匹配阈值调整、推理速度优化,每一项都得亲自跑几轮。尤其是姿态估计器本身出错时,高阶模块反而可能放大错误。所以落地时一定要对姿态估计质量做一个监控指标,当检测分数低到一定程度时,回退到全局特征模型,不让高阶分支承担它不该承担的风险。这套“质量开关”机制,是我们把论文方法变成稳定业务功能的关键一步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 10:47:47

CentOS 7生产级DNS搭建:BIND 9.9稳定架构与运维实践

1. 这不是“配个DNS”那么简单:CentOS 7上搭一个真正能用、能管、能扛压的DNS服务器你搜“centos7配置DNS服务器”,十有八九点开的是三步走教程:装bind、改named.conf、重启服务。照着做完了,nslookup localhost能返回127.0.0.1&a…

作者头像 李华
网站建设 2026/10/15 10:46:25

Java手写6大核心数据结构:栈队列链表递归实操指南

1. 这不是“背概念”的复习课,而是用Java亲手造出6种核心数据结构的实操现场你打开教材看到“栈是后进先出”,翻到下一页又读到“队列是先进先出”,再往后翻两页,“单链表节点包含data和next指针”——这些定义像贴在墙上的标语&a…

作者头像 李华
网站建设 2026/10/15 10:46:23

Funcode拼图游戏开发:从图形化到Python代码的编程教学实践

1. 项目概述:为什么一个拼图游戏值得写成“funcode综合教程”“funcode综合教程 拍图游戏”——这个标题乍看像某款儿童益智App的宣传语,但实际在教育编程圈里,它指向一个被低估却极具教学张力的实践入口。我接触funcode平台已有六年&#xf…

作者头像 李华
网站建设 2026/10/15 10:46:19

从广告AI到AGI:AI商业化落地的技术路径

1. 从HackerNews热榜看AGI概念的重新解读上周HackerNews热榜第一的帖子标题相当耐人寻味——《AGI中的A原来代表的是Ads》。这个看似玩笑的标题背后,反映的是当前AI领域一个值得玩味的现象:当科技圈都在热烈讨论通用人工智能(AGI)…

作者头像 李华
网站建设 2026/10/15 10:45:34

电力系统仿真工具NPSLibrary核心技术解析与应用

1. 电力系统仿真工具的新里程碑去年夏天在参与一个新能源并网项目时,我们团队遇到了一个棘手的问题:传统仿真工具无法准确模拟高比例可再生能源接入后的系统动态特性。当时就想着,要是有一套专门针对新型电力系统的模型库该多好。没想到这个需…

作者头像 李华
网站建设 2026/10/15 10:44:31

【每天一个 Python 小案例06】Python 实现猜数字小游戏

【每天一个 Python 小案例06】Python 实现猜数字小游戏 每天完成一个小案例,把零散的 Python 语法知识慢慢变成真正能写出来的程序。系列:《每天一个 Python 小案例》 第 6 篇: Python 实现猜数字小游戏 关键词: Python、random 模…

作者头像 李华