【机器人】复现 HOV-SG 机器人导航 | 分层 开放词汇 | 3D 场景图

HOV-SG 是通过语言指令实现机器人导航的,核心特点是分层结构开放词汇3D场景图

来自RSS 2024,大规模、多层次的环境构建精确的、开放词汇的3 场景图,并使机器人能够通过语言指令在其中有效地导航。

论文地址:Hierarchical Open-Vocabulary 3D Scene Graphs for Language-Grounded Robot Navigation

代码地址:https://github.com/hovsg/HOV-SG 

本文分享HOV-SG复现和模型推理的过程~

下面是一个3D场景图的示例:

1、创建Conda环境

首先下载HOV-SG代码,进行工程目录

git clone https://github.com/hovsg/HOV-SG.git
cd HOV-SG

创建一个Conda环境,名字为hovsg,参考environment.yaml中的要求进行创建,如下所示:

name: hovsg
channels:- defaults- pytorch
dependencies:- python=3.9- numpy- pytorch::faiss-gpu- pip- pip:- matplotlib==3.7.3- scipy==1.13.1- open3d==0.18.0- opencv-python- git+https://github.com/facebookresearch/segment-anything.git- torchmetrics- ftfy- tqdm- open-clip-torch- transformers- openai==1.3.7- plyfile- hydra-core- pyvista- scikit-fmm- pathos- opencv-python-headless==4.8.1.78

再进行SG_Nav环境,上面的两条命令对应为:

conda env create -f environment.yaml
conda activate hovsg

安装成功打印信息:

2、安装habitat模拟器

我们需要安装habitat-sim 和 habitat-lab

conda install habitat-sim -c conda-forge -c aihabitat

等待安装完成~

3、安装依赖库

执行下面命令进行安装:

pip install -e .

安装成功打印信息:

2025/6/30 补丁1:pip install numpy==1.24.3

补丁2:先卸载 pip uninstall faiss -y,再安装 pip install faiss-cpu==1.7.4

4、配置OpenCLIP

HOV-SG 使用 Open CLIP 模型从 RGB-D 帧中提取特征

要下载 Open CLIP 模型权重,CLIP-ViT-H-14-laion2B-s32B-b79K请参阅Open CLIP。

执行下面命令,进行下载 CLIP模型权重:

mkdir checkpoints
wget https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K/resolve/main/open_clip_pytorch_model.bin?download=true -O checkpoints/temp_open_clip_pytorch_model.bin && mv checkpoints/temp_open_clip_pytorch_model.bin checkpoints/laion2b_s32b_b79k.bin

等待下载完成:

(可选)另一个选择是使用 OVSeg 微调的 Open CLIP 模型

 执行下面命令,进行下载型权重:

pip install gdown
gdown --fuzzy https://drive.google.com/file/d/17C9ACGcN7Rk4UT4pYD_7hn3ytTa3pFb5/view -O checkpoints/ovseg_clip.pth

4、配置SAM

HOV-SG 使用SAM为 RGB-D 帧生成与类别无关的分割掩码。

执行下面命令,进行下载 SAM模型权重:

wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth -O checkpoints/sam_vit_h_4b8939.pth

等待下载完成:

5、准备HM3D数据集

下载地址:https://github.com/matterport/habitat-matterport-3dresearch

选择“Downloading HM3D v0.2”的 val四个文件:

下载完成后,创建一个data/hm3d/val目录

mkdir -p data/hm3d/val

然后将hm3d-val-glb-v0.2、hm3d-val-habitat-v0.2、hm3d-val-semantic-annots-v0.2目录,复制合并在val内

进入val内的某个子文件夹是这样的:

最终形成这样的目录结构:

├── hm3d
│   ├── hm3d_annotated_basis.scene_dataset_config.json # this file is necessary
│   ├── val
│   │   └── 00824-Dd4bFSTQ8gi
│   │         ├── Dd4bFSTQ8gi.basis.glb
│   │         ├── Dd4bFSTQ8gi.basis.navmesh
│   │         ├── Dd4bFSTQ8gi.glb
│   │         ├── Dd4bFSTQ8gi.semantic.glb
│   │         └── Dd4bFSTQ8gi.semantic.txt
        ...
    ...
...

其中后面会用到场景ID包括:

  1. 00824-Dd4bFSTQ8gi
  2. 00829-QaLdnwvtxbs
  3. 00843-DYehNKdT76V
  4. 00861-GLAQ4DNUx5U
  5. 00862-LT9Jq6dN3Ea
  6. 00873-bxsVRursffK
  7. 00877-4ok3usBNeis
  8. 00890-6s7QHgap2fW

6、姿态转为RGB-D观测值

首先复制hovsg/data/hm3dsem/metadata/poses到 data/hm3dsem_poses中

# 创建data/hm3dsem_poses文件夹
mkdir data/hm3dsem_poses
# 执行复制命令
cp hovsg/data/hm3dsem/metadata/poses/*  data/hm3dsem_poses/

复制后是这样的:

运行代码:

python hovsg/data/hm3dsem/gen_hm3dsem_walks_from_poses.py --dataset_dir data/hm3d/ --save_dir data/hm3dsem_walks/

运行打印信息:

(hovsg) lgp@lgp-MS-7E07:~/2025_project/HOV-SG$ python hovsg/data/hm3dsem/gen_hm3dsem_walks_from_poses.py --dataset_dir data/hm3d/ --save_dir data/hm3dsem_walks/
/home/lgp/anaconda3/envs/hovsg/lib/python3.9/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.17.3 and <1.25.0 is required for this version of SciPy (detected version 1.26.4warnings.warn(f"A NumPy version >={np_minversion} and <{np_maxversion}"
scene: data/hm3d//val/00824-Dd4bFSTQ8gi/Dd4bFSTQ8gi.glb
-------------
data/hm3d//val/00824-Dd4bFSTQ8gi/Dd4bFSTQ8gi.basis.glb
data/hm3d/hm3d_annotated_basis.scene_dataset_config.json
-------------
{}
agent_state: position [ 1.0737159  0.0688231 -2.2800648] rotation quaternion(1, 0, 0, 0)
saving frame 2252/2254: 100%|█████████████████████████████████████████████████████████████| 2253/2253 [01:18<00:00, 28.64it/s]
scene: data/hm3d//val/00829-QaLdnwvtxbs/QaLdnwvtxbs.glb
-------------
data/hm3d//val/00829-QaLdnwvtxbs/QaLdnwvtxbs.basis.glb
data/hm3d/hm3d_annotated_basis.scene_dataset_config.json
-------------
{}
agent_state: position [-3.6943688   0.13573912 -3.9164376 ] rotation quaternion(1, 0, 0, 0)
saving frame 1803/1805: 100%|█████████████████████████████████████████████████████████████| 1804/1804 [01:07<00:00, 26.88it/s]
scene: data/hm3d//val/00843-DYehNKdT76V/DYehNKdT76V.glb
-------------
data/hm3d//val/00843-DYehNKdT76V/DYehNKdT76V.basis.glb
data/hm3d/hm3d_annotated_basis.scene_dataset_config.json

7、创建场景图

修改create_graph.py代码,要不然会报错:

FileNotFoundError: [Errno 2] No such file or directory: 'data/hm3dsem_walks/val/00824-Dd4bFSTQ8gi/val/00824-Dd4bFSTQ8gi/rgb'

示例代码:

import os
import hydra
from omegaconf import DictConfig
from hovsg.graph.graph import Graph# pylint: disable=all@hydra.main(version_base=None, config_path="../config", config_name="create_graph")
def main(params: DictConfig):# create logging directorysave_dir = os.path.join(params.main.save_path, params.main.dataset, params.main.scene_id)params.main.save_path = save_dir# params.main.dataset_path = os.path.join(params.main.dataset_path, params.main.split, params.main.scene_id)print("params.main.split:", params.main.split)print("params.main.scene_id:", params.main.scene_id)print("params.main.dataset_path:", params.main.dataset_path)if not os.path.exists(save_dir):os.makedirs(save_dir, exist_ok=True)# create graphhovsg = Graph(params)hovsg.create_feature_map() # create feature map# save full point cloud, features, and masked point clouds (pcd for all objects)hovsg.save_masked_pcds(path=save_dir, state="both")hovsg.save_full_pcd(path=save_dir)hovsg.save_full_pcd_feats(path=save_dir)# for debugging: load preconstructed map as follows# hovsg.load_full_pcd(path=save_dir)# hovsg.load_full_pcd_feats(path=save_dir)# hovsg.load_masked_pcds(path=save_dir)# create graph, only if dataset is not Replia or ScanNetprint(params.main.dataset)if params.main.dataset != "replica" and params.main.dataset != "scannet" and params.pipeline.create_graph:hovsg.build_graph(save_path=save_dir)else:print("Skipping hierarchical scene graph creation for Replica and ScanNet datasets.")if __name__ == "__main__":main()

执行下面命令:

python application/create_graph.py main.dataset=hm3dsem main.dataset_path=data/hm3dsem_walks/val/00824-Dd4bFSTQ8gi/ main.save_path=data/scene_graphs/00824-Dd4bFSTQ8gi

运行信息:

(hovsg) lgp@lgp-MS-7E07:~/2025_project/HOV-SG$ python application/create_graph.py main.dataset=hm3dsem main.dataset_path=data/hm3dsem_walks/val/00824-Dd4bFSTQ8gi/ main.save_path=data/scene_graphs/00824-Dd4bFSTQ8gi
params.main.split: val
params.main.scene_id: 00824-Dd4bFSTQ8gi
params.main.dataset_path: data/hm3dsem_walks/val/00824-Dd4bFSTQ8gi/
[2025-06-29 23:52:13,474][root][INFO] - Loaded ViT-H-14 model config.
[2025-06-29 23:52:17,300][root][INFO] - Loading pretrained ViT-H-14 weights (checkpoints/laion2b_s32b_b79k.bin).
Creating RGB-D point cloud: 100%|███████████████████████████████████████████████████████████| 226/226 [00:11<00:00, 19.32it/s]
Extracting features:  46%|██████████████████████████████▎                                   | 104/226 [06:09<07:12,  3.55s/it]
 

8、可视化场景图

执行下面命令:

python application/visualize_graph.py graph_path=data/scene_graphs/00824-Dd4bFSTQ8gi/hm3dsem/graph

示例效果:(构建一个 3D场景图层次结构,包括 floor、room 和 object)

不同视角:

构建完3D场景图后,用于导航查询

示例效果:

分享完成~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912977.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm 锁升级机制

Java 虚拟机&#xff08;JVM&#xff09;中的锁升级机制&#xff08;也称为锁膨胀&#xff09;是 HotSpot 虚拟机为了优化 synchronized 关键字的性能而引入的一项重要技术。它的核心思想是&#xff1a;根据实际遇到的竞争激烈程度&#xff0c;动态地将锁从开销最小的状态逐步升…

金蝶云星空 (9.0版本) ERP的WebApi接口随机出现SSLException

环境&#xff1a; java-1.8.0-openjdk-1.8.0.131 hutool-all 依赖&#xff0c; 5.8.25版本 项目背景&#xff1a; 发版上线&#xff0c;用的hutool工具类 HttpUtil.createPost() &#xff0c;请求域名为https://xxx.ik3cloud.com/k3cloud 的金蝶ERP webapi接口 问题&#xff1…

用java,把12.25.pdf从最后一个点分割,得到pdf

要在Java中从文件名 12.25.pdf 的最后一个点&#xff08;.&#xff09;分割文件名和扩展名&#xff0c;可以使用 String 类的 lastIndexOf() 和 substring() 方法。以下是一个示例代码&#xff1a; public class FileNameSplitter {public static void main(String[] args) {St…

UE5 重新编译插件版本

打开要转换的UE的安装目录&#xff0c;一直找到这个文件 不要双击&#xff0c;在地址栏里输入cmd打开命令行&#xff0c;输入如下指令 RunUAT.bat BuildPlugin -plugin"E:\OldPlugin\chatbot5.3\chatbot\chatbot.uplugin" -package"E:\NewPlugin"-plugin…

Linux下的调试器-gdb(16)

文章目录 预备知识&#xff08;9-2.30.00&#xff09;快速认识 gdbgdb 的命令1. 更换成 cgdb2. 打和去除断点3. 逐语句与逐过程4. 使能&#xff08;激活&#xff09;断点 调试思想1. 找到问题&#xff08;找到问题所在的区域&#xff09;2. 查看代码的上下文 补充调试技巧1. wa…

李宏毅NLP-7-计算分数和训练和测试

文章目录 分数计算训练测试 分数计算 插入式序列生成模型的概率计算逻辑&#xff0c;核心是将 “生成序列 h 的过程” 拆解为一系列插入操作&#xff0c;并通过步骤概率的乘积计算总概率 P ( h ∣ X ) P(h∣X) P(h∣X)。以下从 模型框架、步骤分解、概率计算 三个层面解析&…

Python字符与ASCII转换方法

在Python中&#xff0c;可以使用内置函数 ord() 和 chr() 来转换字符和ASCII码&#xff1a; ​获取字符的ASCII码​ - 用 ord() ascii_code ord(A) # 返回 65 ​将ASCII码转为字符​ - 用 chr() character chr(65) # 返回 A 示例&#xff1a; # 打印字母A-Z的ASCII码…

[IMX][UBoot] 10.启动流程 (6) - bootz 命令启动 Linux

文章链接 UBoot 启动流程 (1) - 基本流程 UBoot 启动流程 (2) - 平台前期初始化阶段 - board_init_f UBoot 启动流程 (3) - UBoot 程序重定位 - relocate_code UBoot 启动流程 (4) - 平台后期初始化阶段 - board_init_r UBoot 启动流程 (5) - UBoot 运行阶段 - main_loop …

TCP 三次握手协商 MSS 前,如何确定 MSS 值(结合 Linux 内核源码分析)

文章目录 一、SYN总结影响 SYN MSS 的因素 二、SYNACK总结影响 SYNACK MSS 的因素 结合 Linux 内核源码 一、SYN 总结影响 SYN MSS 的因素 套接字选项 TCP_MAXSEG路由选项 advmss出口 MTU 减去 40(TCP 和 IP 的固定首部大小)IPV4_MAX_PMTU - 40(同上) 二、SYNACK 总结影响 SY…

面试150 矩阵置0

思路 我们使用两个标记集合&#xff0c;分别记录当矩阵的元素为0的时候的横、纵坐标。然后在对矩阵元素进行遍历&#xff0c;如果所在行或者所在列的索引在集合中&#xff0c;对应的矩阵元素修改为0即可 class Solution:def setZeroes(self, matrix: List[List[int]]) -> N…

Element UI 完整使用实战示例

以下是 Element UI 的完整使用实战示例&#xff0c;涵盖从环境搭建、基础组件使用到项目实战的全流程&#xff0c;结合多个实际场景和代码示例&#xff1a; 一、环境搭建与基础配置 1. 安装 Element UI 通过 npm 或 yarn 安装&#xff1a; npm install element-ui --save # …

C# 线程同步(一)同步概念介绍

目录 1.阻塞&#xff08;Blocking&#xff09; 2.阻塞 VS 轮询 3.线程状态 到目前为止&#xff0c;我们已经阐述了如何在线程上启动任务、配置线程以及实现双向数据传递。同时&#xff0c;我们也说明了局部变量是线程私有的&#xff0c;而引用可以通过共享字段在线程间传递以…

解决leetcode第3588题.找到最大三角形面积

3588.找到最大三角形面积难度&#xff1a;中等问题描述&#xff1a;给你一个二维数组coords&#xff0c;大小为nx2&#xff0c;表示一个无限笛卡尔平面上n个点的坐标。找出一个最大三角形的两倍面积&#xff0c;其中三角形的三个顶点来自coords中的任意三个点&#xff0c;并且该…

WIFI 安全测试记录

之前为实训课特意买的无线网卡没用上&#xff0c;但是我怎么可能让他荒废。所以用了几个下午&#xff0c;浅学了WiFi&#xff0c;当然没找到什么好教材&#xff0c;自己摸索着学的很基础&#xff0c;主要是当练习了&#xff0c;特此把我此前学习…WiFi密码实践过程写上来。 省流…

android14设置--网络--Internet副标题修改

收银机订制项目 插SIM卡&#xff0c;设备使用数据流量时&#xff0c;设置–网络–Internet副标题显示对应SIM卡运营商名称&#xff0c;客户要求修改这时的名称(注意图标也要同步修改) packages\apps\Settings\src\com\android\settings\network\InternetPreferenceController.j…

Web3区块链有哪些岗位?

Web3区块链领域的岗位丰富多样&#xff0c;涵盖技术开发、产品管理、运营、商务等多个方面&#xff0c;以下是具体介绍&#xff1a; - 技术开发类&#xff1a; - 智能合约开发工程师&#xff1a;负责编写、审计和优化智能合约&#xff0c;常见于DeFi开发&#xff0c;包括抵押…

解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题

场景重现在使用 MyBatis/Mybatis-Plus 框架对 MySQL 操作时习惯了字段名小驼峰映射&#xff0c;然而在操作 Elasticsearch 时发现字段名没有小驼峰映射。解决方法1. 使用 ObjectMapper 手动转换&#xff1a; 这是最直接也最常用的方法。 在 Spring Boot 应用中使用 ObjectMappe…

Error:Cannot find module ‘chokidar‘

错误复现 在vue开发中&#xff0c;出现报错&#xff1a;Error&#xff1a;Cannot find module ‘chokidar’ 原因 缺包导致 解决方案 直接安装依赖包 npm install chokidar依旧无效&#xff0c;删除node_modules重新安装 rm -rf node_modules npm i

Spring AI 向量数据库详解与 RAG 简单实战项目

一、什么是向量数据库&#xff1f; 向量数据库用于存储、检索稠密语义向量&#xff08;Embedding&#xff09;&#xff0c;是构建 RAG&#xff08;检索增强生成&#xff09;系统的核心组件。它支持近似最近邻搜索&#xff08;ANN&#xff09;&#xff0c;可根据语义相似度找出…

【RK3568+PG2L50H开发板实验例程】Linux部分/FPGA FSPI 通信案例

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1. 简介 本案例旨在 ARM端运行 Linux系统&#xff0c;基通过 FSPI测试。 2. ARM端和 FPGA端通信流程 (1)ARM端实现SP…