
TensorFlow models cognitive_planning基于 Active Vision 数据集的语义目标导航训练与评估全解【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/modelscognitive_planning是 TensorFlow models 仓库 research 目录下的一个研究型项目实现了论文Visual Representations for Semantic Target Driven NavigationECCV 2018 Workshop提出的语义目标驱动导航训练与评估流程智能体在真实住宅数据集 Active Vision DatasetAVD中以 RGB 图像、目标检测、语义分割或深度图作为观察学习根据文字化的目标类别如 fridge、microwave找到对应物体。本文以 research/cognitive_planning/README.md 为骨架结合仓库源码逐节展开安装、数据、gin 配置、环境、训练、评估与可视化的完整实操并给出每个参数在源码中的实际作用。项目定位与整体结构该模块解决的任务可以概括为给定一个语义目标one-hot 表示的类别和一段历史观察序列输出离散动作前进一步、转向、停止等使智能体在真实住宅拓扑图上走到目标物体所在的视角。README 中给出的目标类别演示了 fridge、television、microwave、couch 四类导航实例论文原图以动画形式展示了四个目标的导航过程。从源码结构看整个项目由五个核心文件协作完成一条数据 → 模型 → 训练/评估流水线文件职责envs/task_env.py定义ModalityTypes枚举与TaskEnv环境接口拓扑图 gym 接口envs/active_vision_dataset_env.pyAVD 数据集的具体环境实现ActiveVisionDatasetEnvgraph、姿态、观察tasks.py导航任务库训练实际使用GotoStaticXNoExplorationTask生成监督样本与损失embedders.py各模态的嵌入网络ResNet50、小型卷积网、恒等映射等policies.py策略网络LSTMPolicy嵌入拼接 全连接 LSTM 动作 logitstrain_supervised_active_vision.py训练/评估统一入口train 与 eval 两种 modeviz_active_vision_dataset_main.py环境演示、基准测试、评估结果统计与 gif 生成envs/configs/active_vision_config.gingin 配置文件绑定环境构造参数此外还有 preprocessing/ 目录CifarNet/Inception/LeNet/VGG 的图像预处理工厂与 label_map.txtCOCO 类目标到索引的映射供环境解析检测类别使用。安装与环境要求README 给出的 Python 依赖非常精简networkx gin-confignetworkx环境以nx.DiGraph组织场景拓扑短路径查询nx.shortest_path贯穿监督标签计算、评估指标与可视化gin-config环境类ActiveVisionDatasetEnv使用gin.configurable装饰见 active_vision_dataset_env.py命令行通过--gin_config与--gin_params注入参数。重要前提这是一个 Python 2 TensorFlow 1.x 时代的代码库。源码中大量使用print语句、xrange、dict.iteritems、StringIO以及tf.contribAPI如tf.contrib.slim、slim.learning.train且embedders.py直接依赖from tensorflow.contrib.slim.nets import resnet_v2因此需要在 TensorFlow 1.x 环境下运行README 中的命令即为该环境的用法。这一点决定了它不适合作为 TensorFlow 2.x 项目的直接起点但作为多模态序列决策的完整参考实现依然很有价值。克隆仓库后代码位于research/cognitive_planning目录下README 中的所有相对命令如envs/configs/active_vision_config.gin都以该目录为工作目录。数据Active Vision Dataset 与 AVD MinimalREADME 说明训练与评估使用Active Vision DatasetAVD可从其官方网站下载。为了让代码更快、内存占用更小作者制作了AVD Minimal数据集由原始 AVD 的低分辨率图像组成额外附带目标视角target views标注附带在MS-COCO 上预训练的目标检测器输出的预测检测结果附带在NYU-v2 上预训练的语义分割模型输出的预测分割结果。下载后需设置环境变量$AVD_DIR指向解压目录。代码实际读取的文件结合 active_vision_dataset_env.py 的源码可以确认 AVD Minimal 目录需要包含以下内容路径均相对于dataset_root路径用途源码位置Meta/annotated_targets.npy每个世界中被标注的目标视角read_cached_dataMeta/depth_imgs.npy深度图加载时除以12102归一化并拼接一通道有效掩码形成 2 通道观察Meta/sseg_crf.npy语义分割图缩放到output_size并expand_dims成单通道Meta/imgs.npy低分辨率 RGB 图像缓存Meta/world_id_dict.npy世界名到图像 id 列表的映射Meta/Detections/world.npy每个世界的逐视角检测结果detection_boxes/classes/scores按世界懒加载world/jpg_rgb/、world/annotations.json图像目录与场景图每个视角在各动作下的后继视角即拓扑边world/image_structs.mat每个视角的世界坐标 (x, z)、3x3 旋转矩阵与全局 scaleread_all_poses其中annotations.json是场景图的核心_next_image(image_id, action)直接查表得到执行某动作后的下一个视角 idL517-L536动作不可执行如撞墙时返回空字符串。SUNCG 支持README 中的 TODOREADME 明确指出当前版本不支持 SUNCG 数据集若要支持可实现 envs/task_env.py 中TaskEnvInterface要求的函数random_step_sequence、targets、state、graph、vertex_to_pose、pose_to_vertex、observation、action并参考公开的 SUNCG 环境House3D、MINOS 一类实现。这从接口层面说明环境抽象是数据集无关的。gin 配置active_vision_config.gingins 配置文件 通过gin机制为ActiveVisionDatasetEnv.__init__的全部参数绑定默认值README 的命令中再叠加一条--gin_paramsActiveVisionDatasetEnv.dataset_root$AVD_DIR覆盖数据集路径。逐项说明如下配置项取值源码中的作用episode_length200单条 episode 最大步数超过后doneTrue_step_no_reward中self._steps_taken self._episode_length判定actionsright, rotate_cw, rotate_ccw, forward, left, backward, stop7 个离散动作与SUPPORTED_ACTIONS一致旋转每次 30°confidence_threshold0.5目标检测置信度阈值低于该值的检测框不参与目标判定_largest_detection_for_imageoutput_size64观察分辨率sseg/det/depth 均为 64x64worldsHome_001_1...Home_016_1共 18 个世界参与环境加载的世界白名单targetstv, dining_table, fridge, microwave, couch5 个语义目标类别goal one-hot 维度由此确定compute_distanceFalse是否输出到目标的距离观察ModalityTypes.DISTANCEshould_draw_detectionsFalse为 True 时 RGB 观察上会叠加检测框_draw_detectionsdataset_root默认值命令行必须用$AVD_DIR覆盖labelmap_pathlabel_map.txt检测类别名到索引的映射文件label_map_util.pyreward_collision0碰撞惩罚源码要求非正数reward_goal_range2距目标 ≤2 步即判到达并结束 episode注意训练入口会显式传reward_goal_range-1禁止提前终止见下文num_detection_classes90检测观察的通道数COCO 90 类segmentation_file_namesseg_crf语义分割文件名对应Meta/sseg_crf.npydetection_folder_nameDetections检测结果文件夹Meta/Detections/world.npytargets_file_nameannotated_targets目标标注文件名shaped_rewardFalse是否每步追加距离增量型 shaped reward环境实现ActiveVisionDatasetEnvactive_vision_dataset_env.py 将 AVD 包装为 gym 环境gym.Env并实现拓扑接口同时注册了active-vision-env-v0。模态与观察空间ModalityTypes枚举task_env.py L32-L49定义了 10 种模态AVD 环境实际支持其中的SEMANTIC_SEGMENTATION、DEPTH、OBJECT_DETECTION、IMAGE、GOAL、PREV_ACTION、DISTANCESUPPORTED_MODALITIES列表。观察空间obs_shapes按模态动态组装例如 64 分辨率下sseg(64, 64, 1)det(64, 64, 90)——由generate_detection_image把每个检测框按其类别填到独立通道二值化is_binaryTrue时框内置 1depth(64, 64, 2)归一化深度 有效掩码image(64, 64, 3)低分辨率图训练时会被 ResNet 分支放大到 299x299goal(5,)one-hotprev_action(8,)前 7 维是上一步动作 one-hot第 8 维是上一步是否执行成功碰撞/不可达时为 0——这一成功位是 README 未展开但源码中很关键的设计。拓扑图与目标距离_update_graphL766-L812为每个世界构建nx.DiGraph每个视角一个节点annotations.json给出的可执行动作成为有向边再为每个目标类别引入一个超级源点把所有标注目标视角与它双向连边于是到目标的步数就是图上的最短路径长度distance_to_goal[goal][v] len(nx.shortest_path(graph, v, super_source)) - 2。gt_value(goal, v)直接查这张表被训练数据生成、环境终止判定和评估指标三处复用。步行动作与训练数据流_step_no_reward执行动作查表得到下一视角更新prev_action动作 one-hot 成功位若distance_to_goal reward_goal_range则置done。random_step_sequence(max_len)则执行一条随机游走刻意不采样stop因为它不带来新信息返回path, actions, states, step_outputs四元组——这正是任务层生成监督样本的原料L1053-L1097。reset随机选择有该目标标注的世界 随机目标 随机初始视角若配置了eval_init_points_file_name则按固定评估点列表逐条取用评估模式的确定性来源。手动演示human 模式README 提供了一条进入 AVD 环境手动导航的命令适合先熟悉数据长什么样python viz_active_vision_dataset_main -- \ --modehuman \ --gin_configenvs/configs/active_vision_config.gin \ --gin_paramsActiveVisionDatasetEnv.dataset_root$AVD_DIRviz_active_vision_dataset_main.py 支持 5 种模式human键盘操控、vis路径可视化、benchmark批量采样随机游走并绘制路径长度直方图源码默认benchmark_iter1000、graph与eval。human 模式的键盘映射源码string_key_mapa左移、d右移、w前进、s后退、j逆时针转、l顺时针转。训练命令、参数与源码级实现前提ResNet50 预训练权重README 强调当使用 RGB 图像模态时ResNet 嵌入会用预训练权重初始化。需要在当前工作目录准备./resnet_v2_50_checkpoint/resnet_v2_50.ckpt即官方 ResNet50 预训练检查点压缩包resnet_v2_50_2017_04_14.tar.gz解压后的产物。源码对应 train_supervised_active_vision.py L119-L122 的resnet50_path与freeze_resnet_weights默认 True两个 flag。训练命令README 原样# Train python train_supervised_active_vision.py \ --modetrain \ --logdir$CHECKPOINT_DIR \ --modality_typesdet \ --batch_size8 \ --train_iters200000 \ --lstm_cell_size2048 \ --policy_fc_size2048 \ --sequence_length20 \ --max_eval_episode_length100 \ --test_iters194 \ --gin_configenvs/configs/active_vision_config.gin \ --gin_paramsActiveVisionDatasetEnv.dataset_root$AVD_DIR \ --logtostderr仓库中还提供了 train_supervised_active_vision.sh 脚本可作为命令行参数的参考。完整 flag 表源码默认值以下为 train_supervised_active_vision.py L71-L126 中定义的全部 flagflag默认值说明modetrain可选 eval训练/评估切换logdircheckpoint 与 summary 目录即$CHECKPOINT_DIRmodality_types模态名下划线分隔合法值image/sseg/det/depth可组合如image_detbatch_size8训练批大小sequence_length20观察序列长度 Ttrain_iters200000训练迭代数lstm_cell_size2048LSTM 隐层尺寸policy_fc_size2048策略网络全连接层宽度embedding_fc_size128每个模态嵌入的最终维度goal 也映射到该维度obs_resolution64sseg/det/depth 观察分辨率conv_window_sizes8_4_3小卷积网卷积核conv_strides4_2_1小卷积网步长conv_channels8_16_16小卷积网通道数learning_rate0.0001初始学习率decay_steps1000指数衰减步长decay_rate 固定 0.98staircaseweight_decay0.0002L2 正则goal_category_count5目标类别数对应 gin 中 5 个 targetsaction_size7动作数与 ginactions一致max_eval_episode_length100评估时单次展开最大步数test_iters194每个 checkpoint 的评估展开次数对应固定评估点数resnet50_path./resnet_v2_50_checkpoint/resnet_v2_50.ckptResNet50 权重路径freeze_resnet_weightsTrue是否冻结 ResNet冻结时其变量不参与训练eval_init_points_file_name评估初始点文件名eval 模式固定用all_init_configssave_summaries_secs/save_interval_secs/log_every_n_steps300/300/20日志与保存节奏master/task_id/ps_taskslocal/0/0分布式参数replica_device_setterREADME 还指出训练可针对不同模态及模态组合语义分割、检测、RGB、深度。低分辨率图像与 COCO 检测器/NYU-v2 分割模型的输出作为分发内容的一部分位于AVD_Minimal 的Meta目录——这与前面read_cached_data的加载逻辑完全吻合。训练世界与测试世界的划分源码在 L129-L135 硬编码了世界划分训练用 11 个世界Home_001_1至Home_010_1评估用 3 个未参与训练的世界Home_011_1、Home_013_1、Home_016_1因此评估结果反映的是跨场景泛化能力。监督信号如何产生GotoStaticXNoExplorationTask训练任务tasks.py L1097 起的每条样本环境随机游走max_lensequence_length步收集各模态观察序列对路径上每个顶点计算所有 7 个动作的真值价值_compute_gt_valueoutput_value[action] my_distance - adj_distance即该动作使到目标的最短路径长度缩短 1 得 1、远离得 -1初始化为 -2代表碰撞/过早 stop 等根本不该发生的动作最终乘以 0.5 缩放输出 shape 为(sequence_length, action_size)并附带掩码屏蔽随机游走提前终止产生的无效位置。损失函数是该任务定义的target_loss对掩码内元素做 MSEtf.losses.mean_squared_error——即对动作价值做监督回归而非分类。这与策略网络输出 7 维 action values 的结构一一对应。模态嵌入器映射map_to_embedderL192-L212把每种模态映射到 embedders.py 中的具体实现模态嵌入器说明imageResNet50Embedder图像先缩放到 299x299过resnet_v2_50global_poolTrue得到 2048 维嵌入权重由resnet50_path的 init_fn 载入默认冻结ssegSmallNetworkEmbedder输入先 one-hot 展开为 10 通道one_hot_length10再走三层卷积detSmallNetworkEmbedder90 通道检测图直接进卷积depthSmallNetworkEmbedder2 通道深度goalIdentityEmbedder保持 one-hot策略内部再用全连接映射到 128 维prev_actionNone不经过嵌入器直接拼接到 LSTM 输入SmallNetworkEmbedder的结构由上文 flag 决定卷积核 8/4/3、步长 4/2/1、通道 8/16/16SAME填充 ReLU最后 flatten 接全连接到embedding_fc_size128。以 64x64 输入为例空间尺寸依次变为 16x16、8x8、8x8。策略网络 LSTMPolicypolicies.py 中的 LSTMPolicy 构建如下各模态嵌入按modality_names的固定顺序拼接goal one-hot 先经embed_goal全连接映射到 128 维再拼入拼接向量过两层 2048 全连接ReLU权重截断正态 stddev0.01L2 正则weight_decayprev_action71 维拼到特征上后送入BasicLSTMCell(2048)训练时用dynamic_rnn按sequence_length展开再过一层 2048 全连接输出 7 维 action values无激活。训练图create_train_and_init_opsL215-L278数据来自task.tf_episode_batch(batch_size)内部用tf.py_func调用 Python 采样并用环境锁保证线程安全见UnrolledTask的注释优化器AdamOptimizer(1e-4)学习率exponential_decay(decay_steps1000, decay_rate0.98, staircaseTrue)slim.learning.create_train_op创建 train op当 ResNet 存在且freeze_resnet_weightsTrue时ResNet 变量被排除在variables_to_train之外但仍通过slim.assign_from_checkpoint_fn在 init_fn 中载入预训练权重——这解释了 README使用 RGB 模态需下载 ResNet50 checkpoint的约束summary 记录LR与loss。环境为何用 reward_goal_range-1init()L374-L412构造环境时显式传reward_goal_range-1源码注释解释得很清楚负值使环境在智能体接近目标时不提前终止策略必须用满 100 步通过 stop 或在目标附近振荡从而让训练样本长度保持一致、掩码逻辑正确。gin 配置里的reward_goal_range2只影响直接用环境跑 gym 交互的场景。评估eval 模式与结果统计评估命令README 原样# Eval python train_supervised_active_vision.py \ --modeeval \ --logdir$CHECKPOINT_DIR \ --modality_typesdet \ --batch_size8 \ --train_iters200000 \ --lstm_cell_size2048 \ --policy_fc_size2048 \ --sequence_length20 \ --max_eval_episode_length100 \ --test_iters194 \ --gin_configenvs/configs/active_vision_config.gin \ --gin_paramsActiveVisionDatasetEnv.dataset_root$AVD_DIR \ --logtostderr参数与训练完全一致README 说明推理代码会周期性检查 checkpoint 目录。源码test()L415-L468的工作方式用sequence_length1、eval_init_points_file_nameall_init_configs、世界集TEST_WORLDS重建环境——初始点来自Meta/all_init_configs.npy即世界 x 目标 x 初始视角的固定评估点列表通过tf.train.Supervisor挂起会话轮询latest_checkpoint一旦训练端写出新 checkpoint 就恢复并评估因此评估进程可与训练并行长跑每个 checkpoint 依次执行test_iters194次展开对应 194 个评估点每次调用unroll_policy_for_evalLSTM 状态清零贪心取argmax动作逐步执行把上一步动作 one-hot 与成功位写回prev_action记录每步到所有目标视图的最小最短路径长度直到done或达到max_eval_episode_length100每条轨迹把states与distance存入$CHECKPOINT_DIR/evals/$ITER/image_id_goal.npy$ITER为 checkpoint 步数统计口径末步距离 ≤ 7 个图步即记为该目标的成功按目标类别与总体mean写 summaryeval_in_range_category。统计与可视化viz 的 eval 模式任意时刻可运行 README 给出的统计命令汇总至今所有评估的成功率并生成最佳策略的展开 gif# Visualize and Compute Stats python viz_active_vision_dataset_main.py \ --modeeval \ --eval_folder$CHECKPOINT_DIR/evals/ \ --output_folder$OUTPUT_GIFS_FOLDER \ --gin_configenvs/configs/active_vision_config.gin \ --gin_paramsActiveVisionDatasetEnv.dataset_root$AVD_DIR该脚本读取evals/下各迭代目录的.npy轨迹计算成功率并在--output_folder写出图像/gif其余模式vis观察环境与路径、benchmark直方图与耗时、human手动导航的用法在 viz_active_vision_dataset_main.py 文件头部 docstring 中均有示例。小结与引用cognitive_planning提供了一个少见的、从数据加载到策略评估全部闭环的多模态导航参考实现gin 管理的环境参数、图上最短路径监督标签、动作价值回归 掩码 MSE的训练目标、冻结 ResNet50 的图像分支、贪心展开 图距离判定的评估协议各环节都能在仓库源码中找到对应文件环境、任务、策略、嵌入器、两个入口脚本。需要注意的适用前提Python 2 / TensorFlow 1.x 技术栈、依赖 AVD Minimal 数据分发、当前不支持 SUNCG需自行实现task_env.py接口。README 中给出的论文引用信息inproceedings{MousavianECCVW18, author {A. Mousavian and A. Toshev and M. Fiser and J. Kosecka and J. Davidson}, title {Visual Representations for Semantic Target Driven Navigation}, booktitle {ECCV Workshop on Visual Learning and Embodied Agents in Simulation Environments}, year {2018}, }【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考