ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/28 22:13:39 拓冰建站 浏览量
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),仅供参考