DeepMind Lab 观测(Observations)体系全解:内置、自定义与调试观测的配置与原理

发布时间:2026/9/28 22:13:55

DeepMind Lab 观测(Observations)体系全解:内置、自定义与调试观测的配置与原理 人工智能强化学习机器学习【免费下载链接】labA customisable 3D platform for agent-based AI research项目地址https://gitcode.com/gh_mirrors/la/lab点击查看免费下载观测observation是智能体从环境中获取信息的唯一通道。在 DeepMind Lab 中每一类观测都有确定的名称、数据类型与张量形状tensor shape它们分别由引擎内置、Lua 装饰器注入或调试接口暴露。本文以仓库中的 docs/users/observations.md 为骨架结合 game_scripts/decorators/custom_observations.lua、game_scripts/decorators/debug_observations.lua 与 engine/code/deepmind/dmlab_connect.c 等源码系统讲解观测的命名规则、形状约定、配置项与底层实现帮助你按需选取、注册并读取观测。观测的两条基础约定在深入各类观测之前先记住 DeepMind Lab 对观测数据的两条全局约定形状约定所有观测的张量形状shape采用行主序row-major排列图像原点所有图像类观测的原点位于左上角top left。此外部分观测的分辨率取决于两个环境配置项width默认320与height默认180。这两个值不仅决定玩家视角图像的大小也决定依赖画面的调试相机观测的输出尺寸。在 engine/code/deepmind/dmlab_connect.c 中可以看到width与height在 C 层解析时被强制要求为大于等于 4 且是 4 的倍数否则环境会通过 error hook 报错——这是设置分辨率时需要留意的一个硬性限制。内置观测Built-in仅玩家端内置观测由引擎直接提供任何关卡脚本都可用。文档给出的完整清单如下观测名称类型 / 形状说明RGB_INTERLEAVEDBytes (height, width, 3)玩家视角画面交错interleaved排列RGBD_INTERLEAVEDBytes (height, width, 4)玩家视角画面 深度交错排列RGBBytes (3, height, width)玩家视角画面平面planar排列RGBDBytes (4, height, width)玩家视角画面 深度平面排列BGR_INTERLEAVEDBytes (height, width, 3)玩家视角画面交错排列BGR 通道序BGRD_INTERLEAVEDBytes (height, width, 4)玩家视角画面 深度交错排列BGR 通道序FRAMES_REMAINING_AT_60Doubles (1)本 episode 剩余帧数按 60 fps 估算提前结束时除外平面Planar与交错Interleaved的本质区别文档用两条注释明确了两种内存排列方式Planar平面每个通道位于最高维major rank。字节按RRR... GGG... BBB...排列即形状(3, height, width)中第一个维度是颜色通道。Interleaved交错每个颜色位于最低维minor rank。字节按RGBRGB...或BGRBGR...排列即形状(height, width, 3)中最后一个维度是颜色通道。如何选择优先 RGB_INTERLEAVED文档给出了一个明确的工程建议优先使用RGB_INTERLEAVED。理由是交错布局读取后无需再做通道分离处理处理开销更小、速度更快。这也与深度学习框架常见的(H, W, C)输入布局一致便于直接送入卷积网络。历史遗留INTERLACED 同义词已弃用由于历史原因引擎至今仍将RGB_INTERLACED与RGBD_INTERLACED作为RGB_INTERLEAVED与RGBD_INTERLEAVED的同义词接受。在 engine/code/deepmind/dmlab_connect.c 的kObservationNames表中这两个名称仍被保留并明确标注为Deprecated。文档提醒它们的支持将在未来版本中移除新代码不应再使用。另外从同一份 C 源码的观测枚举可以看出引擎层还内置了一个文档表格之外的观测MAP_FRAME_NUMBERDoubles (1)用于返回当前地图帧号在 docs/users/python_api.md 的observation_spec()输出示例中也能看到它。这说明dmlab_connect.c中kObservationNames数组engine/code/deepmind/dmlab_connect.c是内置观测名称的权威注册表。自定义观测Custom observations仅玩家端除内置观测外关卡还可以通过custom_observations.decorate(api)注入自定义观测。文档列出的自定义观测如下观测名称类型 / 形状说明VEL.TRANSDoubles (3)玩家相对速度相对朝向的平移速度VEL.ROTDoubles (3)玩家相对角速度INSTRString关卡向智能体发送的文本指令TEAM.SCOREDoubles (2)队伍得分我方对方源码级的注册与回调机制在 game_scripts/decorators/custom_observations.lua 中这套机制的实现路径非常清晰custom_observations.addSpec(name, type, shape, callback)第 34-40 行把观测规格追加到obsSpec表同时把回调函数存进obs[name]同名观测不会重复注册。api:customObservationSpec()第 96-102 行把装饰器内注册的规格追加到关卡原有的观测规格列表之后供引擎枚举。api:customObservation(name)第 126-129 行负责分发若obs[name]存在则调用其回调否则回落到关卡自身的实现。以VEL.TRANS为例其回调velocity()第 42-50 行读取game:playerInfo()的平移速度与偏航角通过sin/cos旋转矩阵把世界系速度投影到玩家朝向坐标系最终返回tensor.DoubleTensor{velx, vely, velz}——这就是玩家相对速度的数学含义。TEAM.SCORE的回调第 60-63 行同样取自playerInfo()的teamScore与otherTeamScore字段构成Doubles(2)观测。语言通道 INSTRINSTR是一个字符串观测作为关卡向智能体下发指令的文本通道。模块内的languageChannel()第 56-58 行直接返回模块级变量instructionObservation而关卡脚本可以通过装饰器暴露的api.setInstruction(text)第 133-135 行随时改写该字符串。这种设计让语言指令类任务如走向红色区域可以实时地把任务文本送入智能体的观测空间。顺带一提FRAMES_REMAINING_AT_60虽然被文档归入内置观测但在 game_scripts/decorators/custom_observations.lua 中它也会由装饰器注册一份同名规格其回调基于timeout.timeRemainingSeconds() * 60计算剩余帧数与 game_scripts/decorators/timeout.lua 的回合计时机制挂钩。调试观测Debug observations玩家端调试观测用于在训练或调参时看到代理看不到的东西。玩家端的调试相机观测默认沿用屏幕分辨率即width/height但可通过两个设置放大输出maxAltCameraWidth相机观测的最大宽度maxAltCameraHeight相机观测的最大高度。实际输出尺寸按文档给出的规则计算altWidthwidth与maxAltCameraWidth中的较大值maxaltHeightheight与maxAltCameraHeight中的较大值max。也就是说调试相机分辨率取主分辨率与上限分辨率的逐维最大值。在 engine/code/deepmind/dmlab_connect.c 中可以看到maxAltCameraWidth/maxAltCameraHeight在 C 层被解析并存入gc-alt_camera_width/gc-alt_camera_height而hasAltCameras布尔设置第 562-566 行会通过set_has_alt_camerashook 通知引擎渲染端默认情况下只有靠近当前玩家的实体才会被渲染开启hasAltCameras后所有实体始终可见。玩家端调试观测清单观测名称类型 / 形状说明DEBUG.CAMERA.TOP_DOWNBytes (3, altHeight, altWidth)自上而下的俯视相机topDownCameraDEBUG.CAMERA.PLAYER_VIEWBytes (3, altHeight, altWidth)玩家视角无 HUD带准星 reticleDEBUG.CAMERA.PLAYER_VIEW_NO_RETICLEBytes (3, altHeight, altWidth)玩家视角无 HUD、无准星DEBUG.POS.TRANSDoubles (3)玩家在世界坐标系中的位置 (x, y, z)单位游戏单位DEBUG.POS.ROTDoubles (3)玩家在世界坐标系中的朝向单位度pitch, yaw, rollDEBUG.PLAYER_IDDoubles (1)当前玩家的 id实现细节渲染与矩阵变换在 game_scripts/decorators/debug_observations.lua 中这些观测的实现值得关注topDownCamera通过game:renderCustomView{width..., height..., poscamera.pos, lookcamera.look}渲染俯视图第 270-283 行随后用两次transpose把交错布局(H, W, 3)转为平面布局(3, H, W)并clone()——这正是文档中 planar 形状(3, altHeight, altWidth)的来源。playerView(reticleSize)同样基于renderCustomViewreticleSize 0时会在画面中央用buffer:narrow(...):fill{200, 200, 200}画出灰色准星第 286-316 行对应PLAYER_VIEW与PLAYER_VIEW_NO_RETICLE的差别。DEBUG.POS.TRANS/DEBUG.POS.ROT分别取自game:playerInfo()的pos与angles第 40-46 行。相机位置可由关卡通过debug_observations.setCameraPos(pos, look)调整第 260-263 行enableCameraMovement第 389-411 行甚至可以把 WASD Ctrl/Space 映射为相机移动用于人工调试时自由巡视场景。此外从源码可以看出该装饰器还额外注册了与文档平面版对应的交错版调试相机观测DEBUG.CAMERA_INTERLEAVED.TOP_DOWN、DEBUG.CAMERA_INTERLEAVED.PLAYER_VIEW、DEBUG.CAMERA_INTERLEAVED.PLAYER_VIEW_NO_RETICLE第 324-332 行以及DEBUG.PLAYERS.VELOCITY、DEBUG.PLAYERS.SCORE、DEBUG.PLAYERS.CAPTURES、DEBUG.PLAYERS.IS_BOT等文档表格之外的玩家聚合观测第 356、360-362 行需要更细粒度调试信息时可查阅该文件获取完整清单。调试观测Debug observations服务器端服务器端调试观测用于获取每个玩家的状态信息。这类观测有一个关键约定形状中任何维度为 0 的条目运行时都会自动扩展为地图中活跃玩家的数量包括机器人 bots。例如DEBUG.PLAYERS.HEALTH的形状是Doubles(0)实际运行时若场上有 4 个活跃玩家则会得到长度为 4 的向量。服务器端观测清单观测名称类型 / 形状说明DEBUG.PLAYERS.ARMORDoubles (0)护甲值DEBUG.PLAYERS.GADGETDoubles (0)当前持有的 gadget武器/道具DEBUG.PLAYERS.GADGET_AMOUNTDoubles (0)当前 gadget 的余量DEBUG.PLAYERS.HEALTHDoubles (0)每个玩家的生命值DEBUG.PLAYERS.HOLDING_FLAGDoubles (0)是否持有旗帜DEBUG.PLAYERS.IDDoubles (0)玩家 idDEBUG.PLAYERS.EYE.POSDoubles (0, 3)玩家眼睛位置未平滑DEBUG.PLAYERS.EYE.ROTDoubles (0, 3)玩家视线方向度DEBUG.PLAYERS.NAMEString玩家名单换行符分隔DEBUG.PLAYERS.TEAMDoubles (0)玩家队伍0None1Red2BlueDEBUG.MAZE.LAYOUTString迷宫布局文本形式DEBUG.MAZE.VARIATIONString迷宫变体文本形式文档指出这些观测的完整实现位于 game_scripts/decorators/debug_observations.lua。从源码可以印证实现方式DEBUG.PLAYERS.HEALTH/ARMOR/GADGET/GADGET_AMOUNT通过遍历玩家库存视图inventory.View的health()、armor()、gadget()等访问器聚合而成第 65-96 行DEBUG.PLAYERS.TEAM通过TEAM_LOOKUP {r 1, b 2}把字符串队伍名映射为数值第 146-153 行DEBUG.PLAYERS.NAME用table.concat(names, \n)拼成换行分隔的字符串第 61-63 行DEBUG.MAZE.LAYOUT/VARIATION则由debug_observations.setMaze(maze)写入第 254-258 行。旗帜观测Flag data服务器端还提供两类旗帜相关观测。第一类是旗帜实时状态观测格式为{posX, posY, posZ, playerId, state}其中state映射为0 NONE不存在1 HOME在基地2 CARRIED被携带3 DROPPED被丢弃观测名称类型 / 形状说明DEBUG.FLAGS.REDDoubles (5)红旗的位置、playerId、状态DEBUG.FLAGS.BLUEDoubles (5)蓝旗的位置、playerId、状态第二类是旗帜出生点home location状态观测格式为{posX, posY, posZ, state}此处state映射为0 NONE不存在1 HOME在基地2 AWAY离开基地观测名称类型 / 形状说明DEBUG.FLAGS.RED_HOMEDoubles (4)红旗出生点位置与状态DEBUG.FLAGS.BLUE_HOMEDoubles (4)蓝旗出生点位置与状态源码中红蓝旗逻辑通过遍历game_entities:entities{team_CTF_redflag}/team_CTF_blueflag实体并查询玩家hasPowerUp(inventory.POWERUPS.RED_FLAG / BLUE_FLAG)实现第 177-236 行旗帜实体可见且位于出生点时记为HOME被玩家携带时用玩家eyePos作为位置并记为CARRIED否则返回(0,0,0,0,NONE)兜底。FLAG_STATE与HOME_FLAG_STATE两张映射表第 170-175、214-218 行与文档中的状态编号完全一致可直接对照阅读。在 Python 环境中选择与读取观测观测的最终消费端通常是 Python 训练脚本。根据 docs/users/python_api.md构造环境时以名称列表声明需要的观测import deepmind_lab observations [RGBD] env deepmind_lab.Lab(lt_chasm, observations, config{width: 640, # 屏幕宽度像素 height: 480, # 屏幕高度像素 botCount: 2}, # lt_chasm 关卡选项 rendererhardware) # 选择渲染器 env.reset()deepmind_lab.Lab(level, observations, config, renderer, level_cache)中observations列表里的每个名字都必须能在observation_spec()中查到包括关卡自定义观测config以字符串键值对形式传入width/height、fps等均在此设置。env.observation_spec()返回所有可用观测的规格每条形如{name: RGB_INTERLEAVED, dtype: type numpy.uint8, shape: (180, 320, 3)}若某维度运行时才确定则显示为 0若秩未知则 shape 为空元组。env.observations()返回以观测名为键、以 Numpy 数组为值的字典其形状与observation_spec()中声明的一致。需要提醒的两点一是 C 层要求width/height必须是 4 的正整数倍见 engine/code/deepmind/dmlab_connect.c二是若使用--define graphicssdl把画面渲染到原生窗口则observations列表里必须包含一个以RGB开头的观测游戏才能正确渲染。测试用例如何验证观测行为仓库提供了针对观测的自动化测试是理解各观测语义的最佳参考python/tests/debug_observation_test.py 定义了完整的玩家调试观测列表PLAYER_DEBUG_OBSERVATIONS并验证了DEBUG.PLAYER_ID与DEBUG.PLAYERS.ID[0]相等、DEBUG.PLAYERS.NAME按换行分隔、射击后GADGET_AMOUNT递减为 0、被打中后HEALTH下降、DEBUG.PLAYERS.SCORE与IS_BOT的取值以及DEBUG.MAZE.LAYOUT与关卡 ASCII 地图逐字符一致test_debug_camera还逐个像素比对DEBUG.CAMERA.TOP_DOWN平面与DEBUG.CAMERA_INTERLEAVED.TOP_DOWN交错的画面内容。python/tests/custom_view_test.py 演示了通过maxAltCameraWidth/maxAltCameraHeight把辅助相机分辨率放大到128的配置方式python/tests/custom_view_test.py。这两份测试从输出形状、取值语义、像素内容三个层面锁定了观测的行为写新关卡或自定义观测时可把它们当作行为契约来对照。总结DeepMind Lab 的观测体系可以归纳为三层引擎内置RGB/RGBD/BGR 系列与FRAMES_REMAINING_AT_60、Lua 装饰器注入的自定义观测VEL.TRANS、VEL.ROT、INSTR、TEAM.SCORE等通过 game_scripts/decorators/custom_observations.lua 的addSpec注册、以及调试观测玩家端相机/位姿 服务器端全玩家状态与旗帜信息。使用时只需牢记三条主线图像的 planar/interleaved 布局与左上角原点、width/height/maxAltCamera*/hasAltCameras对图像尺寸与可见性的影响、以及形状中0维度在运行时的动态扩展语义。掌握了这些约定你就能在训练脚本中精确地选择观测、在关卡 Lua 中自由地注册观测并借助调试观测把训练过程的上帝视角完整记录下来。赞分享人工智能强化学习机器学习【免费下载链接】labA customisable 3D platform for agent-based AI research项目地址https://gitcode.com/gh_mirrors/la/lab点击查看免费下载相关推荐Apache SkyWalking MicroMeter Observations 接入指南Spring 应用观测指标的上报与 OAP 后端配置Apache SkyWalking MicroMeter Observations 接入指南Spring 应用观测指标的上报与 OAP 后端配置 MicroM可观测性后端微服务云原生Ant Design Mentions allowClear 全解析自定义清除按钮的配置、原理与测试验证Ant Design Mentions allowClear 全解析自定义清除按钮的配置、原理与测试验证 Ant Design 的 Mentions提及组前端UI组件设计系统Hunk 主题系统完全指南内置主题、自动检测与自定义配置Hunk 主题系统完全指南内置主题、自动检测与自定义配置 Hunk 是一款面向 Agent 开发者的终端 diff 查看器其主题系统围绕 Shiki 内置主开发工具代码评审CLIAI 应用上一篇JAX 首次运行 JIT 编译特别慢用 jax_log_compiles 与 jax_explain_cache_misses 定位慢在哪下一篇Swift并发编程新选择CollectionConcurrencyKit核心API全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/28 22:13:55

Java医院挂号系统:Servlet+JDBC实战与并发一致性保障

简介:这是一套基于Java技术栈开发的医院预约挂号系统源码,面向Java Web初学者与中级开发者,聚焦医疗信息化场景下的典型业务实现,如用户认证、医生排班、在线预约、数据持久化与前后端交互。资源包为ZIP格式,大小37.3M…

2026/9/28 22:08:55

UDS多帧传输避坑指南:STmin与BS参数详解及调试技巧

1. 为什么多帧传输是UDS诊断里最容易翻车的一环搞过UDS诊断的人都有一个共识:单帧收发的诊断服务(比如会话控制、读取故障码)基本不会出问题,真正让人抓耳挠腮的,永远是那些数据长度超过7个字节、必须走多帧传输的场景…

2026/9/28 22:08:55

从认知匹配到行为形成:WSaiOS 中能力、知识与行为的匹配理论

从认知匹配到行为形成:WSaiOS 中能力、知识与行为的匹配理论摘要:本文系统阐述 WSaiOS 认知匹配理论中“能力—知识—行为”匹配框架。该框架回应了一个核心问题:一个方法能够被找到,并不等于认知对象能够执行它;一个行…

2026/9/29 0:04:04

LLM红队实战:从攻击面枚举到防护策略的完整方法论

1. 从“Lysios”这个名字说起:LLM红队到底在防什么第一次看到“Lysios – LLM red teaming org”这个标题,很多人会愣一下:Lysios是什么?是一个开源工具、一个组织代号,还是一套方法论?从命名习惯来看&…

2026/9/29 0:04:04

LSTM时间序列预测实战:从数据窗口构造到模型调参避坑

简介:这份资源面向高校学生与Python初学者,提供一套可直接运行的LSTM时间序列预测完整项目,适用于期末大作业、课程设计及入门级深度学习实践。项目以空气质量等真实数据为样本,覆盖数据预处理、模型搭建、训练与预测全流程&#…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/28 23:59:03

ESP-IDF离线安装三步法:绕过网络校验与工具链劫持

1. 为什么离线装Python依赖会卡在“正在下载esp-idf-tools”这一步?我第一次在客户现场部署ESP-IDF开发环境时,就栽在这儿了。客户机房网络策略极其严格:所有外网出口被封死,DNS只允许解析内网地址,连ping通8.8.8.8都做…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑