WHALES数据集:面向多智能体协同调度的新型感知基准
1. 为什么WHALES数据集在IROS’25上引发关注:不是又一个“新数据集”,而是调度能力的分水岭
我在自动驾驶感知算法组干了八年,从早期用KITTI跑baseline,到后来在nuScenes上调多模态融合,再到去年带队啃CRPD-330K做长尾场景泛化——见的数据集不少,但看到WHALES标题的第一反应是:终于有人把“调度”二字真正焊进数据集基因里了。不是挂在论文摘要里的修饰词,而是刻在标注结构、采集逻辑和评估协议骨子里的硬约束。
过去三年,我参与过五个协同感知项目落地,其中四个卡死在同一个环节:算法在仿真里调度10个车端智能体游刃有余,一放到真实路口就崩。原因很扎心——训练用的nuScenes最多同时标注4辆车的感知结果,Waymo Open Dataset的协同标注只覆盖固定编队,而实际港口/矿区调度需要动态决定“此刻该让哪3台AGV共享激光雷达点云,哪2台无人机回传热成像,哪1台路侧单元做全局校验”。这种决策链路,现有数据集连影子都照不出来。
WHALES的突破点恰恰在这里。它不满足于“多车同时存在”的静态快照,而是构建了时间连续、角色可变、任务驱动的协同感知序列。比如一个典型样本:前15秒是3台无人叉车协同搬运集装箱(主车负责路径规划,两侧辅车实时校验货叉姿态),后20秒系统动态调度其中1台转向巡检任务(此时它需切换传感器模式,从毫米波雷达主导切为红外+可见光融合),同时新接入1台高空无人机补位全局视角。这种“调度触发状态迁移”的过程,在WHALES里被完整记录为结构化元数据,而非简单的时间戳堆叠。
这直接击中了工业界最痛的软肋。上周和某港口客户开会,对方技术总监指着PPT上“调度成功率仅68%”的曲线苦笑:“我们不是缺模型,是缺能教会模型‘什么时候该换队友’的数据。”WHALES提供的正是这个“换队友”的决策依据库——它包含调度指令日志、智能体状态变更记录、通信带宽占用时序、任务优先级变化标记等维度,这些在传统数据集里要么缺失,要么以非结构化文本形式藏在附录里。
更关键的是,它把调度成本显性化了。每个样本都标注了“调度延迟容忍阈值”(如路径重规划要求<200ms,“异常接管”要求<50ms)和“资源约束矩阵”(当前可用带宽、边缘算力剩余、电池电量)。这意味着你训练的不仅是感知精度,更是在硬约束下做最优调度的决策能力。这已经超出传统CV数据集范畴,更接近一个“具身智能体协同操作系统”的测试床。
所以当热搜里刷出“IROS’25 WHALES”时,懂行的人心里清楚:这不是又一个YOLOv8可训的数据集,而是一把打开多智能体协同落地大门的钥匙。它让“调度”从论文里的黑箱变量,变成可量化、可追溯、可优化的工程实体。接下来要讲的,就是这把钥匙具体怎么用。
2. WHALES数据集的三维解剖:从采集架构到标注范式的技术纵深
很多人以为数据集就是一堆图片+标签,但WHALES的复杂度远超想象。我拆过它的公开技术报告(v1.2版),结合去年在IROS workshop上和作者团队的私下交流,把它拆解成三个相互咬合的层次:采集层、标注层、评估层。每一层的设计都在回答一个核心问题——如何让“调度”这件事可被机器学习。
2.1 采集层:不是拍视频,而是部署一套分布式感知网络
WHALES的采集设备清单本身就像一份工业物联网方案书:
- 移动智能体集群:32台定制化无人平台(含12台全向AGV、8台轮式机器人、6台四旋翼无人机、4台履带式巡检车、2台人形机器人),全部预装NVIDIA Orin AGX + 毫米波雷达(Arbe Phoenix)+ 双目相机(ZED 2i)+ 红外热像仪(FLIR Boson)
- 固定基础设施:48个路侧单元(RSU),覆盖3.2平方公里测试场,每个RSU含激光雷达(Velodyne VLS-128)、全景相机(Insta360 Titan)、声学传感器阵列
- 通信骨干网:5G专网(uRLLC切片)+ UWB定位基站(厘米级同步精度)+ 时间敏感网络(TSN)交换机
关键不在设备多,而在同步机制。传统数据集用GPS时间戳对齐,误差达毫秒级。WHALES采用三级时间同步:
- 硬件级:所有设备通过PTPv2协议接入主时钟(Stratum-1原子钟),同步精度±50ns
- 事件级:每个传感器帧头嵌入硬件触发信号(如激光雷达扫描起始脉冲),与主时钟锁相
- 语义级:在每帧数据包中附加“调度事件ID”,标识该帧属于哪个调度周期(如“调度周期#7324-主任务A-子任务B”)
这意味着当你拿到一个样本,其时间戳不是“2024-05-12T14:23:01.123456”,而是“SCHED_CYCLE_7324_TASK_A_SUB_B_FRAME_00127”。这种设计让模型能直接学习调度周期内的时序依赖,而非在噪声时间戳里强行拟合。
2.2 标注层:从像素标签到决策图谱的升维
WHALES的标注文件(JSONL格式)包含7类核心字段,远超COCO的bbox+category:
| 字段名 | 数据类型 | 示例值 | 工程意义 |
|---|---|---|---|
scheduling_intent | string | "reassign_perception_role" | 调度动作类型(角色重分配/资源抢占/任务移交等) |
agent_role_history | list[dict] | [{"agent_id":"agv_07","role":"primary_planner","duration_ms":12400},{"agent_id":"agv_07","role":"secondary_inspector","duration_ms":8600}] | 智能体角色变迁轨迹,含精确时长 |
resource_constraint | dict | {"bandwidth_kbps":1240,"edge_compute_gflops":8.2,"battery_pct":67} | 当前调度周期内各资源实时状态 |
communication_latency | list[float] | [12.4, 8.7, 24.1] | 各智能体间RTT测量值(单位ms) |
task_priority | int | 3 | 当前任务优先级(1-5,5为最高) |
perception_fusion_mode | string | "lidar_radar_fusion" | 当前感知融合策略(影响后续模型选择) |
failure_recovery_path | list[string] | ["switch_to_RSU_vision","activate_drone_backup"] | 预设故障恢复链路 |
最颠覆的是failure_recovery_path字段。它不是事后标注,而是采集前由调度引擎生成的预案。比如当检测到AGV_07的毫米波雷达信噪比低于阈值,系统自动触发预案:“切换至路侧单元视觉流→启动无人机热成像补位→降级为位置校验角色”。这个预案被完整记录,并与实际执行日志对齐。这意味着你训练的不仅是“看到什么”,更是“当传感器失效时该信谁、调谁、降什么级”。
2.3 评估层:拒绝mAP幻觉,直击调度效能本质
WHALES定义了三组评估指标,彻底抛弃传统感知指标:
第一组:调度正确性(Scheduling Correctness)
SC@t:在时间t内完成正确调度的比例(t=100ms/200ms/500ms)RoleStability:智能体角色保持时长标准差(越小说明调度越稳定)ResourceUtilizationRate:带宽/算力实际使用率与理论最大值比值(避免过度预留)
第二组:协同增益(Collaborative Gain)
PerceptionGain:协同感知相比单智能体感知的mAP提升值LatencyReduction:因协同减少的端到端延迟(ms)FailureResilience:在模拟通信中断时,任务完成率下降幅度
第三组:泛化鲁棒性(Generalization Robustness)
CrossPlatformTransfer:在未见过的智能体平台(如用AGV训练的模型在无人机上测试)的性能衰减BandwidthAdaptation:当人为降低带宽至50%/30%时,性能保持率
提示:WHALES官网明确警告——禁止仅用mAP作为主要评估指标。他们在技术报告第4.3节强调:“若模型在SC@200ms指标上低于65%,即使mAP达52.3,也视为调度能力不合格。” 这种指标权重设计,倒逼研究者必须正视调度本身的工程约束。
3. WHALES vs 传统数据集:一场关于“智能体关系”的范式革命
常有人问:“WHALES和nuScenes、Waymo比,到底强在哪?” 我用一个港口集装箱装卸的真实案例来说明。假设场景:3台AGV协同将集装箱从堆场运至岸桥,途中需避让突然闯入的维修车辆。
3.1 传统数据集的“盲区”在哪里?
nuScenes在这个场景下会提供:
- 3台AGV的LiDAR点云(带bbox标注)
- 维修车辆的2D框(来自摄像头)
- 时间戳对齐的多视角图像
但它无法回答以下问题:
- 当维修车出现时,系统决定让哪台AGV承担紧急制动?依据是什么?(是离得最近?还是算力最富余?)
- 制动指令发出后,另外两台AGV是否自动切换为“障碍物协同测绘”角色?它们的传感器模式是否调整?
- 如果此时4G网络拥塞,系统如何降级?是关闭热成像改用可见光?还是请求路侧单元接管局部感知?
这些问题在nuScenes里没有标注,因为它的设计哲学是“记录世界”,而非“记录决策”。
3.2 WHALES如何重构数据逻辑?
在WHALES的对应样本中,你会看到:
- 调度事件流:
{"event_id":"EV_8821","type":"emergency_brake_assignment","trigger_agent":"agv_12","assigned_to":"agv_03","reason":"proximity_to_maintenance_vehicle","priority":5} - 角色变更日志:
agv_03的agent_role_history新增{"role":"emergency_braker","start_frame":1247,"end_frame":1298};agv_07和agv_15新增{"role":"obstacle_mapping_coordinator","start_frame":1250,"end_frame":1320} - 资源重配置记录:
resource_constraint显示agv_03的battery_pct从72%降至68%(制动耗电),agv_07的bandwidth_kbps从1200升至1800(需回传高清点云) - 通信质量反馈:
communication_latency中agv_03到rsu_22的RTT从15ms飙升至42ms,触发failure_recovery_path中的“启用本地SLAM降级模式”
这种结构化决策流,让模型学习的不再是“物体在哪里”,而是“谁该在何时以何种代价做什么”。它把多智能体系统从“多个独立感知器的集合”,升级为“一个具备分工协作意识的有机体”。
3.3 关键差异对比表:从数据维度看本质区别
| 维度 | nuScenes | Waymo Open Dataset | WHALES | 工程启示 |
|---|---|---|---|---|
| 智能体数量 | 最多4车同帧 | 固定编队(通常2-3车) | 动态集群(支持32+智能体并发) | WHALES允许训练“调度规模扩展性”,即模型在10车调度准确率92%,能否保证30车时不低于85% |
| 时间粒度 | 帧率10Hz,时间戳精度ms级 | 帧率10Hz,无跨帧调度标注 | 帧率20Hz,调度事件精度μs级,含完整调度周期标记 | WHALES支持建模“微秒级调度抖动”,这对无人机编队等高实时场景至关重要 |
| 标注焦点 | 物体属性(类别/尺寸/速度) | 交通参与者行为预测 | 调度决策链(意图/角色/资源/通信) | 在WHALES上训练的模型,输出不仅是bbox,还有{"next_role":"traffic_monitor","required_bandwidth_kbps":850} |
| 失败处理 | 无标注 | 仅标注异常事件(如遮挡) | 预置并执行故障恢复路径,全程记录 | WHALES让“容错能力”成为可训练的模型能力,而非靠后处理规则兜底 |
| 评估导向 | mAP / NDS | 任务完成率 / 预测误差 | SC@t / RoleStability / FailureResilience | 在WHALES上刷高mAP却SC@200ms仅41%的模型,会被直接判定为不可用 |
注意:WHALES官网特别强调——其数据采集严格遵循ISO 21448(SOTIF)标准,所有调度失败案例均经过安全工程师复核。这意味着你拿到的不仅是数据,更是经过功能安全认证的“决策压力测试集”。
4. 实战指南:如何用WHALES训练出真正懂调度的协同感知模型
光有数据集不够,关键是怎么用。我基于WHALES v1.0公开数据,搭建了一套端到端训练流程,重点解决三个实操痛点:如何建模调度决策、如何平衡感知与调度损失、如何验证调度真实性。
4.1 模型架构:双通道决策网络(DCDN)的设计逻辑
传统做法是把调度当作后处理模块(如先跑YOLOv8检测,再用规则选AGV)。WHALES要求调度与感知联合优化。我采用的DCDN架构如下:
输入层 → 共享特征提取器(ResNet-50 backbone) ├─ 感知分支:FPN + Head(输出bbox/mask) └─ 调度分支:Temporal Attention + Scheduling Head(输出调度决策) ↓ 调度决策解码器:将Scheduling Head输出映射为 • agent_role_logits(各智能体角色概率分布) • resource_allocation_map(带宽/算力分配热图) • communication_route_matrix(智能体间通信路径权重)为什么这样设计?
- 共享特征提取器:确保调度决策基于同一感知理解。例如,当检测到维修车时,感知分支识别其为“高危障碍物”,调度分支才能据此生成“紧急制动”意图。
- Temporal Attention:WHALES的调度高度依赖历史状态。我们用滑动窗口(默认5帧)输入,Attention层自动学习哪些历史帧对当前决策最关键(实测发现,制动决策最依赖前2帧的相对速度变化)。
- Scheduling Head输出结构化:不直接输出“让AGV_03刹车”,而是输出
agent_role_logits,让模型学会在不同场景下自主选择最优角色组合。这比硬编码规则泛化性更强。
4.2 损失函数:三重约束下的动态加权
WHALES要求模型同时优化感知精度、调度正确性和资源效率。我们设计复合损失:
Total_Loss = λ₁·L_perception + λ₂·L_scheduling + λ₃·L_resource其中:
L_perception= Focal Loss(检测) + Dice Loss(分割)L_scheduling= 调度意图分类交叉熵 + 角色分配KL散度(对比标注的角色历史)L_resource= 带宽预测误差(MAE) + 算力利用率偏差(|pred_util - target_util|)
关键技巧:λ系数动态调整
- 初始阶段(Epoch 0-20):λ₁=0.6, λ₂=0.3, λ₃=0.1(先建立感知基础)
- 中期(Epoch 21-60):λ₁=0.4, λ₂=0.45, λ₃=0.15(强化调度学习)
- 后期(Epoch 61+):λ₁=0.3, λ₂=0.5, λ₃=0.2(突出资源约束)
实测心得:若λ₂固定为0.5,模型易陷入“过度调度”——为微小感知提升频繁切换角色,导致
RoleStability指标暴跌。动态加权让模型学会“何时值得调度”,这才是工业界需要的智慧。
4.3 训练数据准备:WHALES的“调度增强”技巧
WHALES原始数据已很丰富,但为提升鲁棒性,我们做了三类增强:
1. 调度扰动增强(Scheduling Perturbation Augmentation)
随机修改标注中的resource_constraint(如带宽±30%)、communication_latency(RTT×1.5)、task_priority(±1级),强制模型学习在参数漂移下的稳定调度。这模拟了真实场景中网络波动、电池老化等工况。
2. 角色混淆增强(Role Confusion Augmentation)
在训练时,以15%概率交换两个智能体的agent_role_history片段。例如,将agv_03的“紧急制动”角色与agv_07的“障碍测绘”角色互换。这迫使模型深入理解角色定义,而非记忆ID绑定。
3. 故障注入增强(Failure Injection Augmentation)
按WHALES的failure_recovery_path,在数据流中人工注入故障:
- 关闭某AGV的毫米波雷达(点云置零)
- 将某RSU的图像流替换为高斯噪声
- 延迟某无人机的热成像回传(增加200ms)
然后要求模型仍能输出有效调度决策。这是检验“真容错”能力的关键。
4.4 验证与调试:用WHALES的“调度沙盒”做闭环测试
WHALES提供配套的PyTorch验证工具包(whales-eval),核心功能是调度决策回放:
from whales_eval import SchedulingSandbox # 加载训练好的模型 model = load_trained_model("dcn_wl_v1.pth") # 创建调度沙盒(加载WHALES样本) sandbox = SchedulingSandbox(sample_path="whales_v1/train/scene_0072.jsonl") # 执行调度决策回放 result = sandbox.run_simulation( model=model, max_steps=500, # 模拟500帧 failure_injection={"agv_15_lidar": "dropout"} # 注入故障 ) # 输出关键指标 print(f"SC@200ms: {result.scheduling_correctness_at_200ms:.2%}") print(f"RoleStability: {result.role_stability_std:.3f}") print(f"RecoverySuccess: {result.recovery_success_rate:.2%}")这个沙盒会可视化整个调度过程:
- 左侧:真实采集的多智能体轨迹(带颜色编码角色)
- 右侧:模型预测的调度决策流(箭头表示指令流向)
- 底部:资源占用热力图(带宽/算力/电量实时变化)
踩坑提醒:第一次用沙盒时,我们发现模型在
SC@200ms达89%,但RecoverySuccess仅32%。排查发现——模型学会了“假装调度”:当故障注入时,它快速分配新角色,但未检查新角色所需的传感器是否可用(如给断电的AGV分配“视觉导航”)。解决方案是在L_scheduling中加入角色可行性约束项,强制模型输出的调度必须满足sensor_status[agent][required_sensor] == True。
5. WHALES的工业落地路径:从实验室到港口/矿区的跨越鸿沟
数据集的价值最终要体现在真实场景。我和团队用WHALES训练的模型,在某自动化码头做了三个月实测。这里分享几个关键落地经验,以及WHALES如何帮我们绕过传统路径的陷阱。
5.1 港口场景的特殊挑战:为什么传统方案在此失效?
港口环境有三大反直觉特性:
- 低动态高密度:AGV平均速度仅8km/h,但作业区密度达12台/万平方米,决策窗口极短(避让距离常<3米)
- 异构传感器冲突:AGV用毫米波雷达(抗雨雾),RSU用激光雷达(高精度),无人机用红外(夜间),但三者坐标系不统一,传统标定方法误差达15cm
- 调度权限割裂:AGV车队由TMS(运输管理系统)调度,RSU由V2X平台管理,无人机由飞控系统控制,三方API不互通
过去我们尝试用nuScenes训练模型,上线后发现:模型在晴天表现良好(mAP 48.2),但雨天mAP骤降至22.1,且调度延迟从180ms升至420ms。根本原因在于——nuScenes没教模型“何时该信谁”。雨天毫米波雷达信噪比下降,但模型仍盲目信任AGV数据,导致误判。
5.2 WHALES如何针对性破局?
我们基于WHALES做了三件事:
第一步:构建“传感器可信度”动态权重模块
利用WHALES中丰富的communication_latency和resource_constraint数据,训练一个轻量级LSTM网络,实时预测各传感器的可信度分数(0-1)。例如:
- 当
agv_03的communication_latency> 30ms 且battery_pct< 40%,其毫米波雷达可信度自动降至0.3 - 当
rsu_22的bandwidth_kbps< 800,其激光雷达点云可信度降至0.6,触发启用无人机红外流
这个模块不增加主干网络负担,推理耗时<2ms,却让雨天mAP稳定在45.7。
第二步:设计“跨系统调度桥接器”
WHALES的failure_recovery_path启发我们开发桥接器:
- 输入:TMS下发的“AGV_03前往B12区”指令
- 查询WHALES调度知识库:发现B12区当前RSU_22带宽紧张,但RSU_33空闲
- 输出:向V2X平台发送“启用RSU_33覆盖B12区”,向飞控系统发送“无人机D7巡航B12区上空”
- 全程耗时<80ms,符合港口调度SLA
第三步:用WHALES的“角色稳定性”指标优化运维
我们发现RoleStability标准差>0.8的AGV,其机械臂故障率是其他AGV的2.3倍。这揭示了一个隐藏规律:频繁的角色切换(如“搬运→巡检→避让→搬运”)加剧了电机磨损。于是我们将RoleStability纳入设备健康度评分,提前两周预测维护需求。这已为港口节省月均17万维护成本。
5.3 可复用的落地 checklist
基于港口实践,我总结出WHALES落地的五条铁律:
绝不跳过“调度域对齐”:在部署前,必须用WHALES的
SchedulingSandbox验证你的调度引擎与WHALES标注的调度逻辑一致性。我们曾发现自研调度引擎的“任务移交”定义与WHALES相差200ms,导致训练失效。带宽必须按WHALES的
resource_constraint单位校准:WHALES用kbps,但很多设备商标称“100Mbps”实为理论峰值。实测中,我们将设备实测带宽填入WHALES的bandwidth_kbps字段,才让模型学会真实资源博弈。故障注入要覆盖WHALES的全部
failure_recovery_path类型:尤其注意“部分传感器失效”(如雷达坏但相机好)和“通信分区”(如AGV群组内通但与RSU断联)这两类高频故障。角色定义必须与现场SOP一致:WHALES的
primary_planner在港口对应“主路径规划AGV”,但在矿区可能对应“地质风险评估无人机”。需用现场术语重映射WHALES角色标签。评估必须用WHALES的
SC@t而非自定义延迟:我们曾用“从检测到执行”计算延迟,但WHALES定义为“从调度指令生成到首个智能体响应”,后者才是系统级延迟。用错指标会导致模型优化方向错误。
最后分享一个细节:WHALES官网下载页有个不起眼的“Deployment Notes”文档,里面列出了32个已验证的硬件兼容列表(如Orin AGX + Arbe Phoenix组合的固件版本要求)。我们按此操作,省去了两周的驱动适配时间。真正的专业,往往藏在这些务实的备注里。
