☰
可迁移的互动性知识:HOI检测中先问‘有没有交互‘再答‘是什么交互‘
2026/10/15 23:55:50 网站建设 项目流程

这篇论文笔记的主角,是一篇关于人-物交互检测(HOI Detection)的工作。标题里最抓我的不是"Detection",而是"Transferable Interactiveness Knowledge"——可迁移的互动性知识。说实话,我第一次看到这个短语时愣了一下:什么叫互动性知识?为什么它可以迁移?带着这两个问题把论文反复读了几遍,我决定把完整的阅读思路整理下来。这篇笔记适合正在入门HOI检测、对关系建模感兴趣、或者想了解"怎么把抽象先验做成可验证实验"的同学阅读,读完你大概率会和我一样,对"人-物交互检测"这件事的看法发生一点小变化。

1. 在"谁和谁发生了什么"背后,还藏着一层容易被忽略的先验

1.1 HOI检测任务到底是什么

人-物交互检测,英文 Human-Object Interaction Detection,核心任务可以用一个三元组概括:给定一张图,输出<人, 物体, 交互动作>。比如<人, 马, 骑马>、<人, 杯子, 拿起>、<人, 手机, 看>。它和目标检测的区别在于,不仅要框出人和物体,还要判断人和物体之间"发生了什么关系"。

这个任务真正难在哪里?我经常和身边同学说,难点其实是"组合爆炸"。假设检测器能稳定给出80类物体框,再加上可能出现的上百个动作动词,理论上可组成几千上万种HOI组合。但现实中,一张图里人和物体大多是不交互的。站在路边的人和路灯不交互,电梯间里两个人和同一个按钮也不一定有交互。真正的交互样本在整个图像空间里非常稀疏。

传统做法通常会把人、物体分别检测出来,然后把所有人和所有物体两两配对,送进一个分类器判断动作。问题是:一个画面里如果有5个人、8个物体,那就是40个pair;里面真正发生交互的可能只有两三个。模型要在海量负样本里找出正样本,还要在极长的类别尾巴上做动作分类,效果自然容易被拖垮。

在这个背景下,这篇论文给了我一个很不一样的思路:与其直接让模型回答"具体是什么交互",不如先让它回答"这两个东西之间,到底有没有发生交互"。

1.2 互动性知识与可迁移性的提出动机

"互动性"在这里是一个二分类概念:一个human-object pair要么是互动的(interactive),要么不是(non-interactive)。论文把它叫做 interactiveness,也就是中文语境里的"互动性"或"交互性"。

我理解的论文核心动机是这样的:判断"有没有交互"这件事,比判断"具体是什么交互"要通用得多。比如我见过"人骑马"的图片,能判断出人和马之间存在互动;那么当看到一张"人骑摩托车"的图片时,即使我从没见过"骑摩托车"这个动作标注,也能很自然地猜到人和摩托车之间存在某种互动。因为"人与大型可骑乘物体之间产生接触、姿态配合"这个模式是跨类别共享的。

这就是标题里"可迁移"的含义。细粒度的动词分类器一旦遇到没见过的动词,输出空间里根本没有这个类别,模型只能束手无策。但互动性二分类器不一样,它依赖的不是"某个动词长什么样",而是"人和物体在空间、姿态、上下文上是否构成一种动态关系"。这种知识可以在不同动词、甚至不同HOI类别之间迁移。

读到这里时我想起一个生活里的类比:一个人能看出"这两个人在聊天"还是"只是碰巧站在同一部电梯里",靠的是一种关系层面的直觉;而如果要你说出"他们具体在聊什么话题",那就需要更多背景信息。前者更容易跨场景泛化,后者则高度依赖领域数据。这篇论文想抓住的,正是前者的本质。

2. 两步走的设计:先问"有没有交互",再答"是什么交互"

2.1 框架总览与交互性网络的位置

整篇论文的模型骨架,如果让我用一句话概括,就是:在现有检测结果之上加了一个"互动性门控",再把通过门控的pair送去做细粒度动作分类。

更具体地说,框架大致分为三层:

  • 最底层是视觉特征提取器和一个人/物检测器,负责从图像中拿出所有候选的人和物体框;
  • 中间层是交互性网络(Interactiveness Network),对每个(human, object)候选对输出一个0到1的互动性得分;
  • 顶层是交互分类分支,只在互动性得分足够高的候选对上进行动词预测。

我第一次读到这里时有一个疑问:为什么不直接训练一个端到端的HOI分类器,非要额外插一个二分类分支?论文给出的理由其实很实在:HOI分类器的输出空间巨大且长尾严重,而互动性二分类的输出空间只有两个值。与其让模型从几千类里硬选,不如让它在第一步先做一个简单的判断题——"这两者有没有关系"——如果判断为没有,就直接把该候选过滤掉或降权。

在实际推理中,论文的思路通常可以这样理解:对每一个候选pair,先算互动性概率,再用这个概率去乘动作分类器的得分,最终输出带权重的HOI预测。这样做等于让互动性得分当了"门控"和"权重"的双重角色。

2.2 训练阶段的损失拆解

如果把训练流程拆成伪代码,大概长这样。这部分是我根据论文思路和常见实现做的合理还原,细节以原文为准:

# 伪代码:交互性网络 + 交互分类器的训练流程 def train_step(image, detections, hois): features = backbone(image) pairs = generate_human_object_pairs(detections) # 所有人和物的候选对 # 第一步:互动性二分类 inter_logits = interactiveness_net(features, pairs) inter_loss = binary_cross_entropy( inter_logits, hois.interactiveness_label # 1表示交互,0表示不交互 ) # 第二步:仅对交互正样本做动作分类 interactive_pairs = pairs[hois.interactiveness_label == 1] action_logits = action_net(features, interactive_pairs) action_loss = cross_entropy( action_logits, hois.action_label # 具体动词 ) loss = inter_loss + action_loss loss.backward()

这里最关键的细节是:交互性网络必须看到所有pair,而不只是正样本。我一开始也觉得,动作分类只对正样本训练很自然,但交互性网络如果不在大量负样本上做过充分训练,推理时它会分不清"有接触但没动作"和"没接触也没动作"之间的边界。

论文这一步拆解最大的好处是:交互性网络承担了大部分负样本过滤工作,动作分类器则可以在一个相对干净的输入空间里做细粒度识别。两个子任务的难度都被降低了,整体效果反而更容易做上去。

2.3 为什么这种拆法能保住迁移能力

关于"迁移",我一直提醒自己不要把它理解成一个玄学词汇。论文里的迁移是有明确载体的,载体就是互动性网络本身。因为互动性网络不依赖具体动词标签,它只学习"人和物体之间的互动模式"。

举个例子,训练数据里有"骑马",但没有"骑摩托"。常规动作分类器根本不会输出"骑摩托"这个概率;但互动性网络在见过足够多"人骑在物体上、身体姿态前倾、手部与物体接触"的训练样本之后,遇到"人骑摩托"的候选对,会给出一个较高的互动性得分。这个得分本身虽然没有解决"具体动作是什么"的问题,但至少把正确的人和物体从大量无关配对中捞了出来。

这其实是一种很巧妙的"任务降维":不对未知类别做直接预测,而是先用一个通用关系判断器框定搜索范围。论文后面设计的实验,也基本是围绕这个点展开的。

3. 不谈实验的论文笔记都是耍流氓:unseen类别怎么测

3.1 评测协议:把部分动词从训练中摘出去

这篇论文里让我印象最深的设置,是它设计了一个"动词不可见"的评测协议。传统HOI实验是随机划分训练集和测试集,所有HOI类别在训练里都至少出现过。但在这种设置下,模型只是记住了"见过哪些类别",并不代表它学会了迁移。

论文的做法大致是:把动作动词集合切分成两部分,一部分作为可见动词保留在训练里,另一部分作为不可见动词,从训练样本中彻底摘除。比如训练时只给"骑马、看书、拿杯子",测试时却要求模型检测出"骑摩托、看电视、拖地"这类它从没见过的交互。这样一来,模型在测试阶段面对不可见动词时,无法从"见过这个类别"中获得帮助,唯一能依靠的泛化信号,就是互动性知识。

我第一次看到这个设置时觉得有点反常:常规分类器遇到这种任务,输出空间里根本没有不可见动词的节点,怎么算分数?但论文要验证的正是:即使最终动作名称猜不准,模型能不能靠着互动性知识,先把"这里可能存在交互"的人和物找出来?如果这一步成立,迁移就是有效的。

3.2 数据集、指标与公开结果的整体印象

这篇论文的实验主要在公开的HOI基准上做,包括 HICO-DET 和 V-COCO。前者规模较大,后者更偏向真实动作场景。评估指标沿用HOI领域通用的mAP,也就是对检测框、类别、动作同时做匹配后计算平均精度。

由于我没有把论文里每一张表的原始数字背下来,这里不打算一句一句报数。但如果用表格概括论文呈现的效果,大概是这样的:

评测设置不引入互动性知识的基线引入互动性知识的方法
全量类别训练动作分类器直接硬扛,长尾类别容易丢互动性门控先过滤负样本,常见类别和长尾类别都有改善
不可见动词训练很难对未见过动词做出有效输出依靠互动性得分仍能召回大量正确的人和物,再配合已知动作映射

这种情况下,数字层面的直接对比并不是最重要的。真正让我觉得有价值的是"变化趋势":每当把不可见动词的难度拉高,论文方法相对基线的优势就越明显。这说明互动性知识真正发挥作用的地方,恰恰是常规监督信号失效的场景。

3.3 我如何看待这个结果

很多人看论文只看mAP涨了多少点,我更喜欢看"涨在哪里"。这篇论文的增益不是来自把网络加深,也不是来自某种花哨的特征融合,而是来自任务重定义。它把"从一堆类别里挑一个"改成了"先判断有没有关系,再判断什么关系"。

这一点对工程实践有直接启发。实际业务里,我们经常遇到"标注数据不足但类别很多"的情况。与其逼着模型记住几百个类别,不如先训练一个稳健的关系判断器,把它放在前面当漏斗,后面再挂具体分类器。这样即使后续新增类别,前序模型也不必全部重训,只需要更换或扩充后端的动作分类部分即可。

4. 复现这份工作需要注意的三个"暗坑"

论文读起来顺畅,真正动手复现就是另一回事了。我在复现这类HOI方法时踩过几个坑,写下来供准备跑实验的同学参考。

4.1 候选对生成质量决定交互性网络的天花板

这是我最想强调的一点。交互性网络再准,也只在"检测器给出的候选框"内做判断。如果目标检测器漏掉了画面里的某个人,或者把关键物体框偏了一半,那后面的交互性判断根本无从谈起。

我的建议是:在复现初期不要用太强的检测器过滤策略。宁可让模型多输出一些低置信度的框,把召回率拉高,再让交互性网络去决定哪些pair值得保留。很多复现效果差,问题往往不是出在HOI模型本身,而是出在候选框的召回率上。检测器的召回率,直接决定了这个方法的天花板。

4.2 交互性网络的正负样本比例非常失衡

HOI数据里,真实的interactive pair占比通常很低。如果直接用原始比例训练交互性网络,模型很容易学到"躺平":把所有pair都预测成非交互,损失也不高,因为负样本占多数。

我实测下来比较有效的做法有两个:一是对交互性分支使用focal loss或OHEM一类的困难样本挖掘,让模型别被海量简单负样本带偏;二是训练结束后单独在验证集上搜索交互性阈值,不要默认取0.5,有些场景0.3甚至0.2的阈值反而更合适。这个阈值选择看似微小,但对最终mAP的影响有时候比换一个更大的backbone还明显。

4.3 显存与速度:避免逐pair重复过网络

HOI候选对的数量很容易膨胀。一张图塞进5个检测框,配对组合可能就是几十对;如果检测结果再多一点,逐pair提取特征再分类的写法会让显存瞬间吃紧。

工程上比较聪明的做法是共享特征:先为整张图提取一次特征图,然后对每个pair做RoI特征抽取或特征对齐,不要再让每个pair单独过一遍backbone。推理时也要提前做NMS和置信度过滤,把候选pair数量控制在合理范围。很多复现版本跑不动,不是显卡太小,而是特征重算太浪费。

5. 读完这篇论文,我对HOI研究的三点新理解

5.1 关系建模可以拆成"关系存在性"和"关系语义"两层

以前我总把HOI检测看成一个大号的细粒度分类问题。这篇论文让我意识到,人和物体之间的关系其实包含两个层面:第一层是"有没有关系",第二层是"是什么关系"。前者更基础、更通用,也更适合做迁移;后者更精细、更依赖数据。把两层拆开建模,既降低了训练难度,也给了模型一条在未知类别上依然有效的推理路径。

这种拆解思路并不只适用于HOI检测。我后来在看一些视频动作识别、场景图生成的工作时,也会下意识地问一句:这个任务里有没有一个类似"互动性"的底层先验?答案是很多任务都有,只不过很少有人愿意把它单独拎出来作为一个可训练的模块。

5.2 零样本HOI研究的起点可以追溯到这种"不可见类别"评测

这篇论文提出的不可见动词评测思路,在后续很多HOI研究中反复出现。零样本HOI检测、少样本HOI检测,追根溯源都离不开这样一个设定:训练阶段故意隐藏某些类别,测试阶段再看模型能泛化多少。对刚接触这个方向的读者,我建议把这篇论文当作理解后续一系列工作的地基。

需要注意的是,不可见类别设置本身也有多种变体:有的藏动词,有的藏物体,有的藏整个HOI组合。不同隐藏粒度对应不同的难度,也对应不同的迁移信号来源。读后续论文时,先搞清楚它用的是哪种协议,再对比方法,思路会清晰很多。

5.3 这篇论文的"写法"也值得学习

如果抛开技术本身,这篇论文在表达上有一个很聪明的做法:它把一个抽象概念(可迁移的互动性知识)和一组具体实验设置(不可见动词评测)绑定在一起。概念因为有了可测量的实验协议而变得实在;实验因为有了明确的概念牵引而显得有深度。

我写论文笔记时也学了这个习惯:先问"你这个核心概念到底在解决哪个测量指标?",再问"如果公平地验证它,需要设计什么样的实验?"。想清楚这两点,论文的框架基本就立住了。

我个人读完最大的体会是:很多人做HOI检测只盯着"动作分类准不准",但这篇论文提醒我,判断"人和物有没有关系"本身就是一个有价值、可迁移、甚至比动作分类更本质的能力。回到开头那个问题——什么叫可迁移的互动性知识?简单说,就是让模型先学会"识别互动关系"这个通用技能,再靠这个技能去应对那些从没见过的具体交互。如果以后再遇到类似任务,我也打算先问一句:能不能先做一个"关系存在性"的判断器,把问题拆细一点再打?这个思路,比任何具体网络结构都更值得带走。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询