
Nerfstudio 本地 Legacy Viewer 部署指南自托管 Web 查看器全流程与源码解析【免费下载链接】nerfstudioA collaboration friendly studio for NeRFs项目地址: https://gitcode.com/GitHub_Trending/ne/nerfstudioNerfstudio 的训练与推理结果可以通过 Viewer 实时可视化。当无法访问官方云端 Viewer、需要使用 Safari 浏览器或打算对 Viewer 前端代码进行二次开发时可以自行在本机启动一个本地 Web Viewer。本文以仓库中的 local_viewer.md 为核心完整讲解 Legacy Viewer 的依赖安装、客户端启动、前后端 WebSocket 连接原理以及常见故障排查并结合当前仓库源码给出可验证的实现细节帮助你从会跑起来进阶到看得懂。Legacy Viewer 是什么为什么需要本地部署Nerfstudio 的 Viewer 经历了两个阶段Legacy Viewer在 Nerfstudio 版本0.3.4中作为默认 Viewer 使用对应本仓库的nerfstudio/viewer_legacy/目录新版 Viewer从 Nerfstudio1.0.0开始成为默认方案Legacy Viewer 被标记为弃用deprecated需要通过显式参数--vis viewer_legacy手动选入。从源码可以印证这一机制在 experiment_config.py 中TrainerConfig的vis字段是一个包含viewer、wandb、tensorboard、comet、viewer_legacy等取值的Literal类型默认值为wandbis_viewer_legacy_enabled()方法专门判断是否启用了 Legacy Viewerexperiment_config.py。根据官方说明在以下三种场景下应当考虑部署本地 Viewer无法连接到官方云端 Viewer 服务受网络环境限制需要使用 Safari 浏览器访问 Viewer本地部署不受浏览器兼容性约束希望开发 / 调试 Viewer 前端代码库例如修改界面、增加新面板、调试 WebSocket 消息协议。整体架构本地 Web 客户端 Python WebSocket 服务端在动手安装前先理解本地 Viewer 的两端组成这有助于后续排错前端 Web 客户端一个基于 React three.js 的浏览器应用代码位于nerfstudio/viewer_legacy/app/注意原文档写作nerfstudio/viewer/app在当前仓库布局中Legacy Viewer 的前端应用实际位于 nerfstudio/viewer_legacy/app/ 目录而nerfstudio/viewer/目录存放的是新版 Viewer 的 Python 服务端代码后端服务端训练进程内嵌的 Python 服务负责把 NeRF 场景、相机位姿、训练状态推送给前端。对应实现为 viewer_state.py 中的ViewerLegacyState类它内部通过ViserServer(hostconfig.websocket_host, portwebsocket_port)启动一个 WebSocket 服务器。两者通过WebSocket MessagePack通信前端使用msgpackr库将消息序列化为二进制ViserWebSocket.tsx后端ViserServer监听消息并回调处理。默认端口规划为角色默认端口说明Web 静态服务器前端4000由yarn start启动的本地站点WebSocket 服务端后端7007训练进程内嵌的 ViserServer 监听端口环境准备Node.js 与 yarn 依赖安装前端应用是一个标准的 React 工程依赖 Node.js 生态工具链。按以下步骤完成环境准备对应原文档 Installing Dependencies 章节。第 1 步进入前端应用目录cd nerfstudio/viewer_legacy/app第 2 步安装 npm 与 yarnsudo apt-get install npm npm install --global yarnnpm 用于安装 yarn 全局工具yarn 负责解析和安装前端项目的依赖。第 3 步安装 nvm 并锁定 Node 版本Legacy Viewer 前端工程对 Node 版本有要求官方文档明确指定使用 Nodev17.8.0nvm install 17.8.0安装完成后运行node --version应输出v17.8.0。第 4 步安装项目依赖yarn install该命令会依据 package.json 拉取全部依赖。从package.json可以看到前端技术栈react18.1.0、three0.142.03D 渲染、reduxjs/toolkit状态管理、leva0.9.29参数控制面板、msgpackr与socket.io-client通信、camera-controls相机操控等。同时package.json内置了常用脚本start: react-scripts start, build: react-scripts build, test: react-scripts test, lint: eslint --ext .js,.jsx .启动本地 Web 客户端并连接训练进程依赖安装完成后即可启动前端开发服务器。第 1 步在nerfstudio/viewer_legacy/app目录运行yarn start第 2 步访问本地 Viewer本地 Web 服务器默认运行在4000 端口。当ns-train训练进程正在运行时通过以下地址连接http://localhost:4000/?websocket_urlws://localhost:7007URL 中的websocket_url查询参数告诉前端后端 WebSocket 服务所在的地址。前端在启动时通过getParam(websocket_url)读取该参数并写入 Redux 状态Banner.jsx若未携带该参数页面会弹出 LandingModal 让你手动填写 WebSocket 地址WebSocketUrlField.jsx 提供了输入框、格式校验和带参数重新打开的快捷链接。前端连接行为来自 ViserWebSocket.tsx建立连接后通过msgpackr.unpack反序列化二进制消息并按message.type分发到场景树、渲染状态、控制面板等处理器连接建立设置了 5 秒超时保护超时未连上会自动关闭重试连接断开后每隔 1 秒自动尝试重连训练过程中断网后 Viewer 可自动恢复高频消息如相机位置更新通过makeThrottledMessageSender做节流发送避免 WebSocket 背压。服务端接入让 ns-train / ns-viewer 使用 Legacy Viewer前端就绪后还需让后端训练进程启动 Legacy Viewer 服务。有两种方式方式一训练时启用ns-train nerfacto --vis viewer_legacy nerfstudio-data即在ns-train命令中通过--vis viewer_legacy显式选入 Legacy Viewer这正是 1.0.0 之后弃用期要求的写法。方式二加载已训练 checkpoint 单独启动Nerfstudio 提供了独立的ns-viewer命令入口定义在 pyproject.tomlns-viewer nerfstudio.scripts.viewer.run_viewer:entrypoint用于加载已保存的 checkpoint 并以评估模式启动 Viewerns-viewer --load-config path/to/config.yml --vis viewer_legacy其实现位于 run_viewer.pyRunViewer数据类的vis字段同样为Literal[viewer, viewer_legacy]默认viewermain()通过eval_setup加载配置与 pipeline随后在_start_viewer中根据config.vis分支创建ViewerLegacyState或新版Viewer状态对象并打印Legacy viewer at: {viewer_state.viewer_url}的横幅信息。后端端口分配逻辑viewer_state.py若未指定websocket_port则调用viewer_utils.get_free_port(default_port7007)优先尝试 7007 端口被占用时自动申请系统空闲端口viewer_utils.pyget_viewer_url会读取前端package.json的版本号拼出完整访问 URLviewer_utils.py。Viewer 相关配置项base_config.py 的ViewerConfig参数默认值说明websocket_portNoneWebSocket 端口None时自动查找空闲端口websocket_port_default7007优先尝试的默认 WebSocket 端口websocket_host0.0.0.0WebSocket 服务绑定地址num_rays_per_chunk32768Viewer 渲染时每 chunk 的 ray 数量max_num_display_images512最多在 Viewer 中显示的训练图像数避免卡顿不影响实际训练-1表示全部显示image_formatjpegViewer 传输图像的格式jpeg有损 /png无损jpeg_quality75JPEG 压缩质量quit_on_train_completionFalse训练完成后是否结束任务camera_frustum_scale0.1场景中相机视锥体的缩放比例default_composite_depthTrue深度合成默认开关关闭后可无遮挡地查看相机视锥体这些参数均可通过命令行覆盖例如ns-train nerfacto --vis viewer_legacy --viewer.websocket-port 7010 --viewer.image-format png nerfstudio-dataFAQEngine node incompatible 解决方案现象执行yarn install时出现The engine node is incompatible with this module.错误。原因前端工程的依赖如react-scripts等声明了 Node 引擎版本约束而当前系统 Node 版本不在其允许范围内。解决方案首选安装 nvm 并切换到文档指定的 Node17.8.0nvm install 17.8.0然后重新执行yarn install。解决方案备选如果无法安装 nvm可以通过忽略引擎约束强制安装yarn install --ignore-engines该命令会跳过引擎版本检查但在旧版或过新版本的 Node 下可能出现其他运行时兼容问题建议仅在测试环境使用。进阶二次开发与生产构建既然本地 Viewer 的核心价值之一是可以开发 Viewer 代码库这里补充几个可直接落地的开发入口开发调试在nerfstudio/viewer_legacy/app下修改前端源码React 组件、Redux 状态、three.js 场景树保存后react-scripts start会自动热更新生产构建运行yarn build生成静态产物由于服务端通过get_viewer_url按package.json的version字段拼接 URL改动版本号后构建产物即形成独立的可部署版本代码规范运行yarn lint执行 ESLint 检查配置见 package.json单元测试运行yarn test执行 Jest 测试桌面端工程还内置了 Electron 入口electron: electron .与public/electron.js可打包为桌面应用形态。如果希望深入了解 Viewer 的功能面板与场景控制可继续阅读仓库中的 viewer_control.md查看器控制操作指南与 custom_gui.md自定义 GUI 开发指南本地 Viewer 与训练/评估命令的组合用法可参考 ns-viewer 命令文档。小结本地 Legacy Viewer 的部署链路可以概括为环境Node 17.8.0 yarn→ 启动前端yarn start端口 4000→ 后端启用--vis viewer_legacyWebSocket 默认端口 7007→ 通过?websocket_url参数完成前后端握手。在 1.0.0 之后的版本中Legacy Viewer 不再是默认选项但通过--vis viewer_legacy依然可以完整使用尤其适合 Safari 用户、无法访问官方云端服务的环境以及希望深度定制 Viewer 前端的开发者。遇到engine node is incompatible时优先切换到 Node17.8.0或使用--ignore-engines作为临时绕过方案。【免费下载链接】nerfstudioA collaboration friendly studio for NeRFs项目地址: https://gitcode.com/GitHub_Trending/ne/nerfstudio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考