开头:
做多模态AGI的人迟早会撞上一个问题:一个物体被别人挡住两秒钟,再出现时,系统还认不认得它是同一个东西?如果只是视频里丢一帧,目标框就重新分配,所有下游的叙述、记忆、决策都会跟着错乱。这个问题的学术名字叫“客体连续性”(Object Continuity),在认知科学里对应皮亚杰讲的“客体永久性”,类似9到17个月大的婴儿开始明白“玩具被毯子盖住不等于消失”的那个认知窗口期。放到AGI基础理论里,它就不是一个可有可无的视觉小技巧,而是世界模型能否成立的先决条件。
这篇内容我会从概念本身讲起,拆解为什么客体连续性是AGI绕不开的底层能力,然后给出一套从检测追踪到多模态绑定的落地思路,最后整理我在实际项目中踩过的问题和排查方法。适合正在做多模态模型、具身智能、视频理解或者状态追踪的工程师和研究者参考,哪怕你之前没接触过跟踪类任务,也能从这套思路上摸到抓手。
1. 客体连续性:AGI世界模型里的那张无人认领的地基
1.1 先把这个概念掰开揉碎
“客体连续性”不是一个新词。发展心理学里,皮亚杰拿它当儿童认知发展的里程碑:孩子刚出生那几个月,眼前的东西被挡住就认为它不存在了;到大约9到17个月,开始理解物体在遮挡后依然持续存在,这就是客体永久性。成年人的世界模型早把这件事固化成直觉,但对机器来说,这个“直觉”恰恰是最难补的一课。
我理解AGI语境下的客体连续性,核心是三个能力:一是身份保持,即同一个实体在时间变化、视角变化、甚至模态变化后,仍然是它自己;二是存在推定,即对象暂时不可观测(被遮挡、出画、传感器丢帧),系统必须假设它还在某个位置,而不是把它当成“消失了”;三是生命周期管理,对象什么时候出现、什么时候真正消失,什么时候两个观测其实指向同一个体,系统要能自动判断。
这三个能力听起来简单,但落到工程里全是坑。比如说你做一个视频AI助手,让用户指着画面里的杯子说“帮我盯住这个杯子”,下一秒杯子滑到桌子底下,再掏出来时已经换了个角度。如果系统无法保持对这个杯子的连续身份,所有后续对话都会变成“哪个杯子?”——这种体验离AGI差了十万八千里。
1.2 没有客体连续性,AGI会得什么病
很多从业者对“客体连续性”不以为然,觉得跟踪任务已经有太多SOTA,怎么还被抬成基础理论了?问题在于,传统跟踪任务是在一个封闭约束里解决问题:给定初始框,追下去。但AGI不是这样,它要在开放世界里同时处理感知、语言、记忆和行动。一旦没有客体连续性这层地基,上层会连锁出问题。
我先举一个最常见的现象:ID Switch。做过多目标跟踪的人都知道,两个人交错过后,算法经常把A的ID换到B身上。表面上看只是一个指标掉了零点几个点,但在AGI系统里,这个切换意味着整个叙事断裂——“刚才还在说小明,系统已经把小明当成了路人甲”。类似的问题在聊天机器人长期记忆里同样存在:今天你告诉它你是编辑,明天它如果无法把“你”这个身份连续绑定到昨天的对话记录上,记忆就是一堆碎片。
多模态场景更明显。视觉上同一个物体、语音里同一个指代词、文本里同一个实体描述,如果在底层表征空间对不上,硬靠后加工糊在一起,一旦目标被遮挡或环境变化,绑定关系就崩。我曾经把一个CLIP文本嵌入和视频物体框做相似度计算,看着准确率还可以,结果一换上“换个说法、换个光照”的测试集,立刻打回原形。这不只是模型容量问题,是系统里压根没有“这个物体依然是那个物体”的显式机制。
1.3 为什么说它是基础理论,而不是锦上添花
一张关系数据库的表格如果没有主键,外键关联就无从谈起。一个世界模型如果不知道对象之间的同一性,因果关系、空间关系、时间关系全都是空中楼阁。对象是谓词的主体,没有稳定的主体,任何“A推倒B”这样的结构化描述都无法落地。
做具身智能的朋友应该体会最深。机器人要抓取目标物体,目标被自己的机械臂挡住是常态。如果系统把被挡住的物体当成“新对象”,抓取规划就得反复重来,甚至出现把手伸向不存在目标的情况。基于世界模型做规划的方法,比如Dreamer系列、TD-MPC那一路,都会在隐空间里维护对对象的持续估计,本质上就是在给机器人补“客体永久性”这一课。
所以我的观点是:客体连续性不是视觉任务里的锦上添花,而是通往通用智能的一道硬门槛。凡是需要在时间维度上理解世界的系统,都绕不开它。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从认知科学到机器实现:关键环节与设计取舍
2.1 拆解出四个可工程化的子能力
要把“客体连续性”这种听起来像哲学的词落地,首先得拆成工程上可定义、可实现、可评估的子模块。我习惯分成四块。
身份保持是最核心的一块,对应“知道是同一个东西”。工程上通常会做目标重识别(ReID),靠外观特征去匹配不同帧里同一个目标。难点在于外观会变:人换个衣服、光照变暗、视角旋转,特征漂移非常大,纯靠外观不可靠,所以往往要叠加运动轨迹预测和空间位置约束。
遮挡推理解决的是“看不见时怎么办”。最简单的方法是保留轨迹缓存,在目标被遮挡后继续用运动模型外推位置,等目标再次出现时再关联上。复杂一点的做法是用生成模型在脑子里“想象”被遮挡的部分,比如视频补帧、inpainting统一到同一个对象表里。
跨模态绑定是多模态AGI特有的要求。语音说“红色杯子”,视觉里那个红色杯子,文本描述里同一只杯子,必须在某层表征上指向同一个对象槽位。传统方法靠属性匹配,现代方法靠多模态对比学习把不同模态嵌入到共享空间。
生命周期管理则负责对象动态性。对象会进入场景、离开场景,会分裂(人群里的个体拆分)会合并(点云分割里的聚类归一)。这部分容易被忽视,但它决定了系统能不能稳定运行在真实世界。
2.2 三类主流实现路线,以及各自的坑
业界和学术界目前大致有三条技术路线在解决客体连续性问题。
第一条是隐式记忆路线。用Transformer的自注意力或者RNN的隐状态,让模型在时序上隐式地“记住”对象。这类方法最大优点是可以端到端训练,不用人为设计对象槽位。但问题也很明显:长程遮挡时信息会被稀释,特别是序列很长的时候,注意力机制很难保证稳定的身份归属,经常出现“追着追着就忘了刚才那个人”。
第二条是显式槽位路线。Slot Attention就是典型代表,通过迭代竞争机制把视觉特征分解成若干个对象槽位,每个槽位对应一个独立对象。这类模型在做场景分解时效果惊艳,每个slot在遮挡下依然能保持目标表征。缺点在于槽位数量和动态分配很难处理,比如画面里瞬间出现20个新物体时,槽位不够用就会互相抢占。
第三条是世界模型预测路线。模型维护一个隐状态,不断预测下一帧,并用预测结果来维持对象表征。DeepMind的Dreamer、特斯拉占用网络那一类思路就是如此。这条路最大的优势是主动感知——它不只是被动接收视觉输入,还会主动“脑补”被遮挡的部分。但代价是误差累积,预测一长,隐状态开始漂移,最后模型脑补出来的世界跟现实脱节。
我实际观察到的落地策略是:不要只赌一条路线。小场景用显式槽位保证可解释性,大场景靠隐式记忆降低运算代价,再叠加运动模型兜底,这样整体最稳。
2.3 选型时的判断逻辑,给新手的建议
如果你刚开始接触这个问题,我的建议是先别急着上最重的模型。先拿传统方法把全链路打通,比如检测器加上卡尔曼滤波,再配合ReID特征,你就理解了ID Switch最大的痛点出在哪个环节。很多问题其实是数据预处理和匹配逻辑的问题,不是模型不够强。
选技术路线时,要看你的实际任务形态。如果是视频理解、叙事生成,要求对长序列里的实体保持稳定引用,那应该优先保障身份一致性,显式槽位或基于场景图的方案更合适。如果是具身操作,要求实时感知和动作闭环,那么世界模型预测加卡尔曼滤波会更稳定。如果做多模态问答,跨模态对齐和属性绑定比跟踪更重要。
不要被“AGI基础理论”这个词吓住。落到工程上,它就是“一个对象从出现到消失,系统始终知道它是它”的工程问题,可以分解、可以建模、也可以迭代优化。
3. 实操过程:把“一个物体”从出现到消失完整串起来
3.1 任务定义,以及怎么准备数据
我先给一个最小可复现的任务:给定一段室内监控视频,从某一帧开始框选一个人,要求持续输出这个人在后续每一帧里的位置,即使中途被墙壁、柜子遮挡超过5秒,也要在再次出现时识别出同一人并保持原ID。
这是标准的单目标跟踪加遮挡恢复任务。数据集方面,最简单的是用MOT Challenge的子集或者自己录一段办公室视频,标注首帧目标框,然后跑跟踪。想快速验证的,直接用OpenMMLab的MMTracking工具箱,它集成了SiamRPN++、STARK、MixFormer这些现成算法,而且自带MOT和SOT的评估脚本。
如果你要用自己的数据做多模态扩展,我建议准备三类标注:每一帧的目标框或掩码、跨帧的同一性标注(同一个ID)、以及至少一条文本描述(比如“穿蓝衣服的人”“桌子左边的杯子”)。这三类标注缺一不可,因为你要同时验证视觉跟踪、身份保持、跨模态对齐三件事。
3.2 最小系统复现流程,带参数和逻辑解释
我用一套典型的流程来演示,技术栈是Python加上PyTorch,模型部分用现成的检测器和ReID模型,不重新训练。
第一步,加载视频并用检测器提取初始目标。用YOLOv8这种轻量检测器,先精确定位第一帧的目标框。YOLO的默认置信度阈值是0.25,但在跟踪任务里建议调高到0.5以上,减少误检造成的ID污染。实际项目里我习惯再设置一个NMS IoU阈值0.45,保证重叠框不要太多。
第二步,用ReID模型提取目标外观特征。我常用的是FastReID训练好的模型,输出一个512维特征向量。所有目标框对应的特征都存在一个对象表里,每条记录包括ID、特征向量、时间戳、位置、速度。这里有个小技巧:特征不是存最开始的那一版,而是存一个“历史最佳”或者“加权平均”版本,否则目标转身之后,旧特征可能根本匹配不上。
第三步,卡尔曼滤波负责运动预测。卡尔曼滤波有两个关键参数:过程噪声协方差Q和测量噪声协方差R。Q小意味着系统更信任运动模型,Q大则更信任测量值。我在室内人员跟踪任务里,一般把位置的过程噪声标准差设为0.1(像素级),速度设为0.5;测量噪声标准差设为2个像素。实际操作中,如果发现目标框在静止时抖得厉害,那就是Q太小或R太大,反过来调节就行。
第四步,做数据关联。用匈牙利算法把本帧检测框和已有的轨迹预测框做匹配,代价矩阵使用外观余弦距离(1减去余弦相似度)和位置IoU距离的加权和。权重方面,外观距离0.6,位置距离0.4,可以靠小实验调节。匹配完成之后,给每个轨迹维护一个“丢失计数”:连续多少帧没匹配上,就认为目标可能被遮挡了。在这段时间里,继续用卡尔曼滤波预测位置,但停止更新外观特征。
第五步,遮挡恢复。当目标重新出现且外观特征相似度超过阈值时,把轨迹ID接回去。阈值一般取0.7,太低容易引入错误ID,太高又会漏检。要记住,这个阈值需要看你的ReID模型的特征分布来调,不能盲目套默认值。
下面是一段伪代码,方便你了解整个流程的关键逻辑:
python复制# 视频层级跟踪主循环(简化)
tracker = ObjectTracker(reid_model, kalman_config)
for frame in video_frames:
detections = detector(frame, conf_threshold=0.5)
tracker.predict_all() # 卡尔曼滤波预测所有已有轨迹
matches, unmatched_dets = tracker.match(detections)
for track_id, det_idx in matches:
tracker.update_track(track_id, detections[det_idx])
for new_det in unmatched_dets:
tracker.create_track(new_det) # 新ID
tracker.handle_lost_tracks() # 丢失计数+保留轨迹缓存
注意,伪代码里没有直接处理“目标消失再出现”的事件。实际工程里你还需要一个“轨迹恢复”模块,它把未匹配的检测框和丢失的轨迹做二次匹配,一般用外观特征去匹配,匹配时要额外加一个空间范围约束,要求目标重新出现的位置不能偏离最后预测位置太远,否则很可能是另一个长得像的人。
3.3 多模态扩展:让文本描述也能指认同一个物体
视觉跟踪跑通之后,再往AGI方向迈一步:用一句自然语言去指定要连续跟踪的对象。这一步是多模态客体连续性的最小实现。
做法是引入一个跨模态嵌入空间。把视觉目标框内的图像特征和文本描述分别编码到同一个空间,然后计算相似度。我常用CLIP作为这个背后的编码器。比如用户说“穿红色外套的人”,文本编码成一个向量,每个检测框的图像特征也编码成一个向量,取余弦相似度最高且超过阈值的那个框,作为初始目标。
但CLIP特征有个隐患:它擅长区分“类别差异大”的对象,但对“同一类里不同个体”的区分很差。比如两个人都穿红外套,CLIP文本特征和两个框的图像特征相似度都差不多,这时候就不能光靠CLIP。我的做法是叠一个局部特征模型,比如用OpenCV的ORB或者一个小的关键点模型,提取目标框内的局部描述子,再用这些描述子做精细匹配。
多模态绑定的后续跟踪阶段,不需要每个帧都跑一次文本匹配。先由文本定位到初始目标,然后用前面讲的视觉跟踪链路持续追踪。文本描述只负责“激活一个ID”,不负责“每帧都找目标”。这样既控制了计算开销,又能在长时遮挡后恢复ID时利用文本信息重新确认。这就是我在实践中比较推荐的分段式设计:跨模态对齐负责初始化和恢复,视觉跟踪负责连续性维持。
3.4 评估指标:别被MOTA骗了
做跟踪任务,很多人直接看MOTA,但MOTA这个指标对ID Switch的惩罚不够敏感。你辛辛苦苦把ID保持工作做得好,MOTA可能只涨0.2个点,看起来微不足道;IDF1(身份F1分数)和HOTA(高阶跟踪准确度)才是反映身份连续性的关键。特别是HOTA,它把检测、关联、定位综合到同一尺度下,更接近人对“是否跟踪正确”的直觉判断。
我在自己的项目里,会给三个指标分别设底线:MOTA不低于60%,IDF1不低于75%,HOTA不低于55%。如果IDF1掉得厉害,说明身份连续性出问题;如果MOTA掉但IDF1稳,那大概率是检测漏检问题而不是跟踪问题。评估的时候别只报一个数,三个指标一起看,才能定位到底坏在哪个环节。
4. 常见问题与排查技巧实录
4.1 目标被挡住再出现后,ID被判定成新目标
这是客体连续性任务里最经典的故障。现象是目标从柱子后面绕出来,系统重新分配了一个ID,导致前后同一人变成了两个人。
我一般的排查顺序是这样:先看检测器在目标重新出现时有没有正常输出框。如果漏检,那问题在检测器,不在跟踪逻辑;如果检测框正常,但ID还是丢了,再去看匹配矩阵。打印出目标重新出现时的外观特征和旧轨迹特征的余弦相似度,大概率会发现相似度低于阈值。
原因通常是两个:一是ReID模型对遮挡前的特征和遮挡后的外观变化不够鲁棒,二是在遮挡期间没有持续更新轨迹的状态。对策分两层:第一层,把遮挡容忍帧数调大,比如从默认的30帧调成100帧;第二层,给外观特征库维护多帧快照,用最近几帧的最佳外观特征参与匹配,而不是只用第一次出现时的特征。如果还是不行,就要考虑用局部特征或结构特征做补充,不能完全依赖全局外观。
4.2 两目标交错后,ID互换
多目标跟踪里,两个人迎面走过然后互换ID,这是最恶心的问题。原因是数据关联时,外观特征相似度和运动预测打个平手,匈牙利算法容易选错配对。
排查时,我会单独看这两个人的特征相似度矩阵。如果他们本来长得就像,那么单靠外观是分不开的,要加大运动模型权重。另一个技巧是做“外观冻结”:目标在互相交错时,暂时停止更新它们的外观特征,避免互相污染。交错结束后,再恢复更新。这在DeepSORT的进阶实现里叫“camera motion compensation”加“appearance freezing”,效果立竿见影。
还有一个更硬的方案:引入方向预测。人走路有航向,即使是双向交错,运动方向差异通常也能提供额外线索。在卡尔曼滤波状态里增加朝向维度,或者在匹配时计算位移方向的余弦距离,都可以降低交错时的ID互换概率。
4.3 多模态对齐失效:说“红杯子”却指向了塑料瓶
当我把跟踪链路和多模态匹配加在一起时,遇到最多的就是这种跨模态错位。文本说的是“红杯子”,模型相似度最高的检测框却是旁边那个红色塑料瓶。
第一反应别改模型,先看数据。确认文本描述和视觉框在语义上是否真的可区分。如果场景里同时存在红杯子和红塑料瓶,那么“红色”这个属性不足以区分对象,需要增加属性约束,比如“深红色陶瓷杯”。如果描述本身是模糊的,任何模型都白搭。
第二反应要看CLIP这类跨模态编码器的局限性。拿它做粗粒度匹配没问题,细粒度个体鉴别不够。我的办法是在绑定时叠加一个属性分类器,专门输出颜色、材质、形状等离散属性,用属性过滤候选框,再做特征相似度排序。把离散属性和连续特征结合,多模态指代准确率会有非常明显的提升。
4.4 长时跟踪后,特征漂移导致同一个ID连续丢失
跟踪时间一长,目标的外观特征会因为光照、角度、遮挡变化慢慢漂移。如果特征模板始终不更新,迟早匹配不上;如果更新太快,又会因为一次误检污染整个特征模板。
这里要掌握“软更新”策略:每帧匹配成功后,新的特征按一个比例混合进历史特征模板,更新率建议在0.1到0.3之间。匹配失败时不要更新。连续匹配失败超过阈值后再重新采集特征,但要校验当前帧的特征和旧模板的相似度不能太低,否则说明目标可能已经变化太大,需要人工确认。
另外,特征库要定期清理。长期不匹配的轨迹,可以放进“休眠状态”,而不是彻底删除。一旦目标重新出现还能回来,这样既省内存,又保留了长时身份记忆。
4.5 评估指标和实际观感不符
有时候指标很好看,实际可视化却很乱:目标框反复跳、ID乱飘。原因是某些指标对检测质量极其敏感,只要框准了,不管ID飘不飘都会给高分。所以我现在养成了一个习惯:除了看数值指标,每周都做一次人工可视化扫描。把跟踪结果渲染成视频,抽查几段遮挡和交错的场景,观察ID是否稳定。这个环节看起来“不科学”,但在实际落地中比任何指标都可靠。
5. 这个方向后续可以怎么扩展
5.1 从图像级到三维空间
目前的客体连续性大多在二维图像上做,但真要做AGI,不能只满足于像素级身份保持,必须到三维空间做“实体级连续性”。也就是说,一个对象在三维世界里的位置、形状、姿态,应该有一个统一的三维表示,不管摄像头从哪个角度观测,都能通过姿态变换映射回同一个三维实体。
现在NeRF和3D Gaussian Splatting这类方法已经能同时维护场景几何和外观,如果把它们和对象槽位结合起来,就能得到一个三维版的“对象永久性”。我最近在实验的一个方向是,用3DGS把场景里的物体建模成独立的子空间,每个物体有自己的三维高斯基元集合,当视线被遮挡时,直接通过已有基元渲染出被遮挡部位的预测,这就比二维inpainting有更强的几何约束,也更接近婴儿在大脑中构建的“物体隐藏后依然存在”的模型。
这条路线的难点在于计算量。3DGS的实时渲染虽然快,但要维护长期动态场景里的对象级分组,还要处理物体新增、移除和合并,目前还没有一个特别成熟的工程框架。但这恰恰是早期搞AGI基础理论的人最值得投入的地方。
5.2 和强化学习结合:让智能体主动找答案
客体连续性还有一个被低估的方向:主动感知。婴儿之所以能建立起客体永久性,不只是被动看,还会动手翻毯子、找玩具。机器如果只会被动跟踪,当目标被遮挡后就只能猜。但如果智能体能主动控制摄像头或者机械臂去“确认”目标的位置,那么对象存在的置信度就会重新上升。
具体实现上,可以把“确认目标位置”当作一个强化学习动作,奖励函数设置为“重识别成功后节约的时间”或“下游任务成功率”。我现在看到的一些具身智能项目已经在往这个方向走,机器人发现目标被挡住后,会主动调整视角,而不是傻傻地站在原地预测。这才是真正意义上把客体连续性从感知层升级到了认知层。
5.3 当世界模型里充满“对象”时
再往后想,一个具备完整客体连续性能力的系统,它维护的不再是一堆特征向量,而是一张动态对象图。每个节点是对象,边是关系(空间关系、因果链条、拥有关系等),节点属性随时间更新。当用户说“帮我拿刚才那个蓝色盒子”,系统能沿着这张图直接定位到对应的对象槽位,即使这个盒子已经不在视野里了。
可以说,客体连续性做扎实了,AGI的“记忆”“推理”“交流”都多了个稳定锚点。这个方向听起来很偏基础理论,但实际应用面非常广:从视频剪辑的素材追踪,到仓储机器人的物品持续定位,再到AI助手的长期记忆,都是它的变体。
我自己做这一圈下来最大的感受是:如果一个系统连“同一个物体”都认不出来,那它上面加再多花哨的交互逻辑都是白搭。先把地基打好,别急着堆上层建筑。你如果也在折腾多模态或者具身智能,建议从一个小型视频跟踪任务开始,把特征匹配、遮挡恢复、ID保持这一整套逻辑跑通,再回来感受一下“客体连续性”这个理论名词到底在说什么。
