可迁移交互性知识:人体-物体交互检测的关键解读

发布时间:2026/10/15 10:03:00
可迁移交互性知识:人体-物体交互检测的关键解读
最近在啃人体-物体交互检测Human-Object Interaction Detection简称HOI Detection方向的论文里面有一篇标题很吸引我Transferable Interactiveness Knowledge for Human-Object Interaction Detection。简单说就是“可迁移的交互性知识”。这个切入点很妙因为HOI检测的难点自古就在“人和物体之间的动作关系”而不是单纯的人或物检测。但这篇论文没有直接去卷动作分类而是先把一个更底层的“交互性”问题拎出来一个人和一个物体到底有没有在交互这个问题看着简单做起来却能给整个检测流程省掉大量误检而且这个“交互性”知识还能跨场景、跨数据集迁移。这篇文章我就把它掰开揉碎讲清楚包括设计思路、实现细节、复现踩坑给同样在做HOI检测或者准备入坑的朋友一份能落地的参考。1. 先搞清楚这篇论文在解决什么问题1.1 人体-物体交互检测的任务边界HOI检测的全称是Human-Object Interaction Detection输入一张图片输出的是三元组humanobjectaction。比如“一个人骑着一辆自行车”“一个人拿着一个杯子”模型不仅要找出人和物各自的边界框还要判断这个动作类别。它和普通目标检测最大的区别就是引入了“关系”和“动作”的语义信息本质上是一个结构化预测任务。这个任务难在几个地方动作组合空间非常大。假设检测器能输出20个人、30个物体那么候选的人-物对就有600个动作类别假设有100种就是6万种组合。而大部分组合在实际图片中根本不存在或者没有交互。如果对每个候选对都做一次多分类计算量大不说样本极度不平衡模型很容易被大量负样本带偏。更麻烦的是大多数HOI数据集的动作标注依赖具体物体比如“骑马”“骑自行车”是两个不同动作但“骑”这个语义在两者之间其实是共享的。模型如果只见过人骑自行车遇到人骑摩托车就会很懵因为没见过这个组合。表面上看是动作类别泛化问题本质上其实是模型把“物体外观”和“动作语义”耦合得太紧没有抽取到更通用、更抽象的关系线索。1.2 Interactiveness Knowledge是什么为什么重要这篇论文提出的Interactiveness Knowledge简单说就是“某个人与某个物体之间是否存在交互”的二值知识。它不关心具体动作是“骑”还是“拿”只关心“有没有在交互”。这个二值标签在数据层面很容易构造只要一个人和一个物体之间存在至少一个动作标注这个pair就是正样本否则就是负样本。为什么这个知识重要因为存在交互这件事要比“具体发生什么动作”稳定得多也更模式化。判断两个人是否在握手我们不需要知道他们握的是左手还是右手只需要看到两只手靠近、相触、姿势相对判断一个人是否在骑车也不一定需要知道品牌型号只需要看到人坐在车座上、手握车把、腿部有蹬踏趋势。这些线索跟具体物体类别关系不大反而跟空间关系、身体姿势、接触点高度相关。所以交互性可以作为一种先验知识先筛掉那些明显没有交互的候选对再对留下来的正交互对做细粒度动作分类。这样就把一个高维度的分类问题拆成了“是不是交互”和“交互是什么”两个阶梯后者的难度和计算量都会大幅下降。1.3 可迁移性——这篇论文最核心的卖点如果把“交互性”看作普通二分类那没什么稀奇的。关键在于“可迁移”Transferable。论文想表达的迁移能力有两层意思。第一层是跨数据集迁移。不同HOI数据集的动作类别体系往往是错开的某一个数据集有“骑”和“拿”另一个数据集有“抱”和“看”但它们都一定标了“这对人-物是否交互”。换句话说“是否有交互”这个二值标签在所有HOI数据集中是统一存在的利用这一点可以把多个数据集的标注整合起来共同训练交互性模型学到更通用的交互模式然后再用于某个具体数据集的动作分类。第二层是跨物体类别迁移。训练集里从来没有出现过“人-滑板”这类组合但模型如果学会了判断“人的脚踩在一个物体的表面上”是一种交互就有机会在测试时把这种能力迁移到滑板上。从本质上看论文是把“分类”任务转化为“匹配”任务判断人的动作线索和物体的被交互线索是否匹配这种匹配关系跟物体类别解耦因此具备更强的泛化能力。2. 模型整体设计思路拆解2.1 从粗到精的两阶段架构论文的整体架构走的是“先粗后精”的路线先用标准的目标检测器找出人和物体的候选框然后枚举所有人物体对但不对所有对直接做动作分类而是先用一个交互性判断分支给每个对打一个0到1之间的分数。这个分数用来表征“这对人-物有没有交互”的置信度。只有分数超过一定阈值的候选对才会进入后面的动作分类器而大部分的负样本对在早期就被过滤掉了。这个过程可以用一个形象的类比来理解面试的时候HR先做简历初筛看学历、经历是否符合硬性条件交互性符合的人才进入业务主管的技术面考察具体能力动作类别。如果一开始就让主管面试所有投简历的人效率会非常低而且主管的关注点会被大量不合适的人分散。在模型实现上交互性分支和动作分类分支共享目标检测器提取的视觉特征但各自有独立的分类头。这种两阶段设计的好处是任务边界清晰梯度隔离训练起来比单阶段直接分类要稳定得多。2.2 交互性知识的表示与提取论文的交互性知识不是一个单独的向量或者词嵌入而是通过一个可学习的模块从人和物体的视觉特征、空间位置关系中抽取出来的。具体来说对于每个人-物对模型通常会利用三部分信息人类外观特征。来自人的检测框RoIAlign后的特征编码了人的姿态、手部位置、身体朝向等。物体外观特征。来自物体的检测框特征编码了物体类别、体积、形态等信息。空间关系特征。包括人和物体框的相对中心距离、重叠面积、尺寸比例、相对角度等。这三类特征经过融合后输入到交互性分类器。论文的亮点在于它没有把这三类特征简单地concat一下就完事而是设计了一个带有记忆机制或原型向量的模块。可以理解为模型内部存储了一批“交互模式模板”比如“存手部接触”“存身体靠近”“存工具使用时的姿态”等每个候选对被送去和这些模板做相似度匹配得分高就倾向于交互得分低就倾向于不交互。由于这些模板是从大量包含不同物体的交互图片中学出来的因此表达的是交互本身的共性而不是某个物体类别的特性。2.3 多任务训练与迁移策略在训练阶段模型承担两个任务交互性二分类和具体动作多分类。总的损失函数可以写成交叉熵的加权和L L_interactiveness λ · L_action其中L_interactiveness是二分类的损失L_action是对正交互样本的动作分类损失。注意动作分类分支的训练样本并不是所有候选对而是只有交互性标签为正的那些对。这种“条件式监督”是整篇文章的关键。如果一对人-物根本没有交互模型压根不需要预测动作也不会有动作loss贡献这样就避免了让动作分类器学习“无动作”这一类而把精力集中在有交互的类别上。迁移策略上论文可以支持两种模式的训练。一种是联合训练拿到多个HOI数据集合并它们的交互性标签甚至只在某些数据集上更新动作分类头交互性分支在所有数据集上共享。另一种是两阶段迁移先在源数据集上把交互性分支训好然后固定住交互性分支在目标数据集上微调动作分类分支。因为动作分类分支只在正交互样本上工作而正交互样本已经被交互性分支筛过一次所以即使目标数据集动作类别很少也能相对容易地学会正确动作预测。2.4 和“直接动作分类”路径的差异可能有人会问既然最终要预测动作为什么不直接在人物体对上面做一个包含“无交互”在内的多分类实践下来直接做的效果往往不够好。原因在于多分类器需要同时区分“没有交互”和几十上百个动作类别而不交互的样本占了绝大多数模型天然会更倾向于把所有难以判断的样本都丢到“无交互”这一大类里导致动作类别召回率低。而引入独立的交互性分支相当于把“无交互”这一个类别从超大规模分类里剥离出来单独用一个二分类器去建模。二分类器面对的问题简单得多容易学得准。当交互性分支认为一个对是交互时动作分类器只需在少数候选正样本上进行多分类这个分类空间内负类的影响就大大减弱。从实验结果看这样做不仅提升了mAP还让推理时所需计算的候选对大幅缩减速度更快。3. 关键细节与工程化要点3.1 交互性标签的定义与构造复现这篇论文时第一步是构造交互性标签。常用的HOI数据集比如HICO-DET和V-COCO里的标注格式大同小异都是标注了一组边界的列表每一条会包含human box、object box和action类别。所以对每张图片我们可以先枚举所有人和所有物体只要标注中出现了某个人框和某个物体框的配对关系那么这个pair就标记为“交互正样本”相反没有配对关系的pair默认是“交互负样本”。但这里有个细节需要非常小心标注中出现的配对关系和实际存在的交互关系并不完全一致。由于标注成本高、动作类别多数据集中可能存在“实际上有交互但没有被标注出来”的pair。如果我们简单地把所有这些漏标的pair当作负样本会引入大量噪声。论文和常见工作通常采用一种保守策略只把那些“人和物体空间上明显分得开、没有接触、并且距离很远”的pair视为可靠的负样本而把那些有重叠但未标注的pair从负样本中剔除或者忽略不计。这个策略能显著降低假负样本带来的干扰。3.2 负样本采样难负样本才是关键很多人第一次复现时直接把所有未标注的pair全部丢进交互性分类器训练。跑完发现准确率看着很高但正样本的召回率很低尤其在测试时有交互的pair总被漏掉。原因是大部分负样本太“简单”了模型只要学会“物体框离人框很远就是负样本”就能把loss降到很低根本不需要去学习“人和物体空间重叠但没交互”这种难区分的场景。解决方法是难负样本挖掘。具体做法是在每个训练batch内对所有负样本pair按照当前模型的交互性得分排序选择得分最高的那部分也就是模型最容易被误导的负样本参与梯度计算同时限制负样本总数不超过正样本的3到4倍。另一个更省事的选择是使用Focal Loss它对被正确分类的样本自动降低权重把训练重心压在难样本上。我在实际复现中对比过保持同样参数把普通交叉熵换成Focal Loss后交互性分支的F1值能提高2到3个百分点这个提升放到最终mAP上是肉眼可见的。3.3 空间特征与外观特征的融合交互性判断对空间关系非常敏感。构造空间特征时建议至少包含以下几个维度人和物体的中心点坐标差异归一化后物体中心相对于人的相对方位角或偏移人和物体框的重叠面积占人框面积的比例物体框面积与人框面积的比值两个框的IoU这些特征尽管简单却非常有效。一个常见误区是只把box坐标原始值放进网络没有做归一化和相对化。这样模型学到的可能是绝对坐标分布换到另一批图片尺度就失效直接影响可迁移性。正确的做法是先对图像尺寸归一化然后计算相对位置再拼接到一个独立的MLP里。如果条件允许还可以把人和物体的outer union区域重新做一次RoIAlign输入一个小型卷积网络得到联合视觉特征。但要注意这个联合特征分支不要做得太深否则容易过拟合训练集的背景纹理导致在陌生场景下泛化崩掉。3.4 推理阶段如何用交互性分数筛选候选对推理时检测器对每张图片输出若干人和物框全部pair起来可能有几千个。如果每个pair都过动作分类器计算量完全不可接受。论文的交互性分支在这里起到了“路由”的作用先把所有pair输入交互性分类器得到分数然后按分数从高到低排序保留前K个pair或者保留分数大于阈值的pair再送进动作分类器。阈值的选择很影响效果。阈值太高漏掉真正的交互pair阈值太低筛选失去意义。实践中更推荐使用“Top-K保留”而不是固定阈值。比如每张图保留前50或前100个交互性分数最高的pair这个数量既能保证正样本召回率又让动作分类只处理一小部分候选。另外动作分类器输出的分数和交互性分数可以做一次乘积融合作为最终对某个动作的置信度。这个乘积操作在多个工作中被验证有效因为它相当于用交互性概率对动作预测重新加权进一步压低那些交互性极低但动作分类器误判的样本。4. 复现实操从数据集到训练调参4.1 数据集准备与预处理这里以两个最常用的HOI数据集为例HICO-DET和V-COCO。HICO-DET的标注文件通常是MATLAB格式需要先用脚本解析出每张图的人框、物框、动作类别、以及pair关联关系。V-COCO则提供了JSON格式的标注但要额外注意它分为“行为类别”和“角色类别”两种评估方式。处理流程大致是将所有图片缩放到固定尺寸比如短边800像素长边不超过1333像素。使用预训练的目标检测权重对图片做前向推理生成候选框。或者直接使用数据集的伪GT框不行测试时要覆盖新场景所以训练时最好用真实GT框或者高质量检测框但检测器要单独训练。整理出每个pair的索引、两个框的坐标、动作标签、交互性标签。按8:1:1切分训练集、验证集和测试集切分时要保证同一个视频帧不跨集合否则会信息泄露。4.2 模型搭建与关键代码骨架由于关系网络结构差异不大可以整理一个简化的伪代码核心思想是检测主干给出特征pair分支分别处理人、物、空间特征再输出交互性和动作logits。class HOIModel(nn.Module): def __init__(self, num_actions): super().__init__() # 这里假定已经从目标检测器获得了RoI特征 self.human_fc nn.Linear(2048, 512) self.object_fc nn.Linear(2048, 512) self.spatial_fc nn.Linear(8, 256) self.interact_fc nn.Sequential( nn.Linear(512 512 256, 256), nn.ReLU(), nn.Linear(256, 1) ) self.action_fc nn.Linear(512 512 256, num_actions) def forward(self, human_feat, object_feat, spatial_feat): h torch.relu(self.human_fc(human_feat)) o torch.relu(self.object_fc(object_feat)) s torch.relu(self.spatial_fc(spatial_feat)) pair torch.cat([h, o, s], dim-1) interact_score torch.sigmoid(self.interact_fc(pair)) action_logits self.action_fc(pair) return interact_score, action_logits当然真正的复现会比这个复杂不少尤其要考虑RoIAlign怎么对齐检测框、如何构造空间特征张量、是否需要加入注意力模块但这些核心逻辑是一致的。4.3 训练参数与阶段安排训练时建议分三个阶段走阶段一冻结检测主干只训练交互性二分类分支。这时候的loss就是BCEWithLogitsLoss正负样本按照1:3的比例采样。阶段一一般训练15到20个epoch学习率设成1e-3。阶段二固定交互性分支训练动作分类分支。此时只使用交互性正样本优化器学习率降到1e-4。阶段三联合微调。两个分支一起训练检测主干的backbone用更小的学习率比如1e-5其余分支用1e-4。这一阶段要加早停观察验证集mAP一般再训练10个epoch就够。batch size在显存允许的情况下尽量调大至少16张图。我试过batch size 8和32最终mAP能差1.5个点左右原因是批次越大负样本采样越多样难负样本挖掘的效果越好。4.4 评估流程与mAP计算细节HOI检测的mAP和普通目标检测的mAP很相似但匹配条件更严格一个预测三元组h_box, o_box, action要与GT三元组匹配需要同时满足人框IoU 0.5、物框IoU 0.5、动作类别一致。这意味着哪怕两个物体框稍微偏了一点都有可能被判为FP所以在推理时不要对物体框做太激进的NMS建议阈值设低一点比如0.3保留更多重叠框让后续匹配有更多机会。评估时的动作类别置信度建议采用交互性分数乘以动作分类概率而不是直接使用动作分类softmax后的分数。这一步对低置信度候选的抑制非常有效。我试过直接softmaxmAP会掉1个点上下改用乘积后模型对“交互性很弱但动作概率高”的错误预测有了更好的压制。5. 常见问题与避坑实录5.1 交互性分类器过拟合场景怎么办一个很典型的现象是训练集交互性精度到95%验证集只有80%。这说明模型把“蓝色背景下的人-自行车”这种场景特征学进去了而不是学“人坐在车上、手扶把手”这些通用交互线索。解决这个问题的套路有三个第一增加图片级数据增强比如随机翻转、随机缩放、颜色抖动让模型对背景纹理不敏感。第二降低空间特征全连接层的维度从512降到128或256减少模型对绝对位置的记忆。第三在交互性分支中加Dropout概率设0.3左右。我发现Dropout对这个任务特别有效因为交互性分类本身是一个强正则任务特征表达很容易被少量样本主导。5.2 迁移到新数据集后性能下滑如果训练好的交互性分支放到另一个数据集上发现判断明显变差首先检查两个数据集的领域差异。比如一个数据集以室内生活场景为主另一个以室外运动场景为主外观分布差很多。这时不要急着修改网络结构可以尝试用目标数据集的少量标注数据对交互性分支做微调只更新最后两层全连接效果通常立竿见影。如果目标数据集完全没有交互性标注那就只能利用预训练模型直接推理。为了提升鲁棒性可以在推理时做多尺度测试把同一图片不同尺度的交互性分数平均。我踩过的一个坑是在源数据集上把交互性分支训练得太依赖物体类别结果目标数据集中出现新物体时交互性分数几乎全部预测为0。后来在特征层面做了一次L2归一化情况有所缓解但根本解决还是需要引入对抗式域适应或者自监督对比学习。5.3 正负样本不平衡的处理HOI数据集中一张图可能有几十个detected物体人也有好几个pair数量动辄上百而真正交互的往往不到10个。如果不做处理交互性分支会被负样本淹没具体表现是loss一直在下降但precision奇高、recall极低。常用的处理办法有在线难负样本挖掘OHEM和Focal Loss。我的建议是两种结合OHEM负责从每个batch里选出模型当前得分最高的若干负样本Focal Loss负责给这些难负样本内部再动态降权。还有一个更细的技巧对同一物体的多个负样本对做“去冗余”只保留与该物体IoU最大的几个负样本避免同一个物体会被重复当作负样本导致模型对该物体过度惩罚。5.4 训练震荡与收敛困难两阶段联合训练时最容易出现的情况是检测器Loss弹跳、交互性Loss正常下降但总mAP不升反降。一个主要原因是在阶段三同时更新检测主干时检测器的学习率没有调低导致特征分布被破坏上游一抖下游全崩。我的做法是阶段三把backbone学习率设为其他分支的十分之一乃至二十分之一并且分三个子阶段逐步解锁先解锁ResNet最后一个stage然后解锁中间stage最后一两个epoch才解锁全部backbone。这个方法有点类似于分层冻结训练能显著减少震荡。还有一种冷启动现象阶段二动作分类分支开始时loss很高因为随机初始化的动作分类器收到了大量交互正样本类别极少数被反复预测。这时候不要急着调大学习率反而应该降低学习率让分类器多跑几个epoch先学会高频类别再慢慢扩展。5.5 推理性能优化交互性分支虽然已经筛掉了大量负样本但如果图片中人特别多、物体特别多候选pair仍然可能上万。优化的办法是在进入交互性分支之前做一次快速的空间预筛如果两个框的中心距离大于阈值且IoU为0可以跳过。这个启发式规则几乎不损失召回率但能砍掉60%以上的pair。另外可以把交互性分支替换成轻量结构比如只保留两个线性层不做复杂注意力推理速度会快很多。动作分类分支只对TopK候选计算同样能显著降低延迟。实测下来加上这些优化后单张图片的推理时间能压到原来的四分之一而mAP只会损失0.1到0.2个点对工程落地非常划算。最后分享一个我自己在复现之外的小实验把交互性分数当作一种软注意力用它去重新加权视觉特征后再做动作分类而不是只用它做硬筛选。具体做法是令加权特征等于原始特征乘上交互性分数再与原始特征相加类似于残差连接。这个小改动在不增加参数的情况下让我在验证集上的mAP又提升了0.3个点左右。这说明交互性知识不光可以作为路由还能作为一种有效的特征调制信号值得大家再挖一挖。