feat: Implement depth surface strip cleanup and organize tool CLI
- Added a proposal for depth surface strip cleanup, detailing the rationale and changes to the depth plane and cutout nodes. - Created specifications for the new cleanup requirements, including scenarios for strip removal and boundary edge detection. - Developed tasks for implementing shared strip detection logic and integrating new interfaces for depth nodes. - Established a new CLI structure for organizing node groups and model commands, replacing old entry points with a more intuitive command structure. - Introduced a prototype for panorama surface generation, including requirements for distance reconstruction and geometry node surfaces. - Added comprehensive tests for depth strip cleanup functionality, ensuring correct behavior for various mesh topologies and edge cases.
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-09
|
||||
64
openspec/changes/clean-depth-surface-strip-faces/design.md
Normal file
64
openspec/changes/clean-depth-surface-strip-faces/design.md
Normal file
@@ -0,0 +1,64 @@
|
||||
## Context
|
||||
|
||||
两个节点组共用 `split_depth_surface`,在变形前读取相邻面深度并拆边,随后固定相机坐标、投影和加厚。实验直接复制原资产,只插入单次 Delete Geometry;关闭实验开关时求值的顶点与面与原组完全一致。
|
||||
|
||||
实验四边网格结果:山景从 80,449 面删去 21,306 面,蜘蛛图 Depth Cutout 从 37,206 面删去 2,249 面。蜘蛛图三角网格的 74,412 面全部保留。两个实验均为 MoGe-2 Small、level 0、Split Threshold 0.5;面数取决于实验网格,正式测试验证拓扑性质。实验深度采用无损 EXR 打包,保存重开结果一致。
|
||||
|
||||
## Goals
|
||||
|
||||
在两个 Depth 节点组中共用确定性的单次条带删面逻辑,将 Split 控制放在主输入区 Smooth 前,并保留剩余表面的 UV、独立切口身份和加厚连接。
|
||||
|
||||
## Decisions
|
||||
|
||||
### 1. 在拆边分支内执行一次删除
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[当前基础几何及已有预处理] --> B{Split Threshold 大于 0}
|
||||
B -->|是| C[原有面深度采样与 Split Edges]
|
||||
C --> D[四边面按顺序读取四条边的 Face Count]
|
||||
D --> E[任一组对边均为边界边]
|
||||
E --> F[Delete Geometry:Face / All,单次删除]
|
||||
F --> G[固定剩余顶点的相机坐标]
|
||||
B -->|否| G
|
||||
G --> H[深度投影]
|
||||
H --> I[现有厚度与 Smooth 流程]
|
||||
```
|
||||
|
||||
共用实现放在 `tools/nodes/common/depth_surface.py`,将删除节点接在 Split Edges 输出与现有启用 Switch 的 True 输入之间。删除选择在该时刻的完整拆后几何上求值一次。
|
||||
|
||||
### 2. 按面角顺序识别边界对边
|
||||
|
||||
在 FACE 域用 Index → Corners of Face 获取当前面的一个起始角和面角数量。通过 Offset Corner in Face 的偏移 0、1、2、3,分别用 Edges of Corner 的 Next Edge Index 取得同方向的四条边;Evaluate at Index 在 EDGE 域读取 Mesh Edge Neighbors 的 Face Count。
|
||||
|
||||
令 `b_i = (FaceCount(edge_i) == 1)`,选择条件为:
|
||||
|
||||
```text
|
||||
corner_count == 4 AND ((b0 AND b2) OR (b1 AND b3))
|
||||
```
|
||||
|
||||
该结果与起始角和面绕序无关。一张面宽条带、三条边界边的条带末端、孤立四边面被选中;具有一条边界边或两条相邻边界边的普通面保留。边界计数严格等于 1,零邻面和非流形边不作为边界边参与匹配。
|
||||
|
||||
### 3. 正式接口只有 Split 控制
|
||||
|
||||
条带清理随 Split 正值分支固定启用。两个节点组仅有一个 `Split Threshold`,其 parent 为主输入区,顺序紧邻 `Smooth` 之前。维持 `FACTOR`、范围 0–1、默认 0 及现有阈值映射。
|
||||
|
||||
移动接口时检查构建顺序、局部 Group Input、修改器赋值与测试中的标识符或顺序依赖。组名保持正式名称;正式接口不引入实验开关。节点使用默认名称、局部连线和未使用输出隐藏规则。
|
||||
|
||||
### 4. 按输入拓扑验收
|
||||
|
||||
四边面按上述条件处理;三角面和其他多边面通过面角数量门控保留。Depth Cutout 的当前三角化输入仍可使用原 Split,清理阶段自然不选面。保持真实建网流程,不为匹配清理规则增加三角面合并或重拓扑。
|
||||
|
||||
### 5. 更新覆盖约束并验证厚度
|
||||
|
||||
将现有“Split 保留所有面”的测试改为“保留所有未命中条带条件的面”,并保留独立的纯拆边与零值旁路检查。厚度依据删面后几何建立边界;正厚度测试检查剩余区域闭合、切口区域独立和属性生命周期。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- 规则识别一张面宽的拓扑结构;真实窄结构、已被原 Split 过度拆分的远山也可能命中。不能据此承诺语义上的前景或远山完整保留。
|
||||
- 两张面宽的条带及三角条带不受本规则处理,剩余边界仍受原网格分辨率限制。
|
||||
- 单次求值避免清理不断向完整区域推进。首次删除后新暴露的候选面留待后续用户改变输入时重新求值,不能在同一次求值中反复删除。
|
||||
|
||||
## Delivery
|
||||
|
||||
本提案完成后实施源码与测试,保留工作区其他修改,执行全量测试并确认正常退出。依照项目规范,此实施任务不构建文档或产物。正式节点资产重建发布需要单独安排;源码实施完成不代表用户安装的节点资产已更新。
|
||||
27
openspec/changes/clean-depth-surface-strip-faces/proposal.md
Normal file
27
openspec/changes/clean-depth-surface-strip-faces/proposal.md
Normal file
@@ -0,0 +1,27 @@
|
||||
## Why
|
||||
|
||||
Depth Plane 与 Depth Cutout 的 Split Edges 会在深度过渡区域产生一张面宽的条带和孤立四边面。拆边后检查四边面的两组对边,可以识别这些结构,同时保留只有相邻两条边为边界的普通表面角落。独立节点组实验已验证该判定及单次删除行为。
|
||||
|
||||
## What Changes
|
||||
|
||||
- `O Image Depth Plane` 与 `O Image Depth Cutout` 在启用 Split 的分支中,拆边后默认执行一次条带删面。
|
||||
- 仅选择至少一组对边均为边界边的四边面;边界边的 Face Count 必须等于 1。
|
||||
- 正式接口不增加实验中的 `Remove Strip Faces` 输入。`Split Threshold = 0` 时旁路拆边和条带删面。
|
||||
- 两组的 `Split Threshold` 从 `Options` 移到主输入区,紧邻并位于 `Smooth` 前;名称、默认值、范围和阈值映射保持现状。
|
||||
- 共用节点构建逻辑,并更新针对面数保留、接口顺序和厚度连接的行为测试。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `depth-surface-strip-cleanup`:拆边后默认进行单次四边面对边界边筛选删面,以及两个节点组的 Split 输入位置。
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
无。当前 `openspec/specs/` 为空;本提案依据当前源码及实验结果定义增量行为。
|
||||
|
||||
## Impact
|
||||
|
||||
涉及 `tools/nodes/common/depth_surface.py`、两个 Depth 节点组构建模块和对应测试。运行时继续加载正式命名的节点资产。实现阶段只修改源码与测试并执行测试;正式 `.blend` 的重建发布另行安排。
|
||||
|
||||
三角面及其他非四边面保持原行为。当前 Cutout 建网流程产生三角面,因此本次规则对这类输入不会删面;四边网格输入的实验效果不能作为三角网格的验收结果。条带判定依据拓扑,已被拆成条带的真实物体细节也可能被删除。
|
||||
@@ -0,0 +1,69 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 拆边后默认执行单次条带清理
|
||||
|
||||
`O Image Depth Plane` 与 `O Image Depth Cutout` SHALL 在 Split 正值分支内、Split Edges 之后且投影和厚度生成之前,通过几何节点执行一次 Face / All 删除。两个节点组 SHALL 共用该逻辑,正式接口 SHALL NOT 暴露 `Remove Strip Faces` 开关。
|
||||
|
||||
#### Scenario: 开启 Split
|
||||
- **WHEN** Split Threshold 大于 0
|
||||
- **THEN** 系统先按当前规则拆边,再根据拆后拓扑执行一次条带删面
|
||||
|
||||
#### Scenario: 关闭 Split
|
||||
- **WHEN** Split Threshold 为 0
|
||||
- **THEN** 系统旁路拆边及新增条带删面,保持当前零值分支的几何与投影行为
|
||||
|
||||
#### Scenario: 单次删除
|
||||
- **WHEN** 首次删除使另一张面新出现一组边界对边
|
||||
- **THEN** 该面不会因新边界在本次求值中被继续删除
|
||||
|
||||
### Requirement: 四边面边界对边判定
|
||||
|
||||
系统 SHALL 仅选择四边面,并按面角顺序取得四条边。若至少一组对边的 Face Count 均等于 1,该面 SHALL 被选中;其余面 SHALL 被保留。
|
||||
|
||||
#### Scenario: 条带及孤立四边面
|
||||
- **WHEN** 四边面具有两条相对的边界边,或具有三条、四条边界边
|
||||
- **THEN** 该面被删除
|
||||
|
||||
#### Scenario: 普通边缘及角落
|
||||
- **WHEN** 四边面没有边界边、只有一条边界边,或仅有两条相邻边界边
|
||||
- **THEN** 该面保留
|
||||
|
||||
#### Scenario: 面角起点与绕序
|
||||
- **WHEN** 同一四边面的面角起点改变或绕序反转
|
||||
- **THEN** 选择结果不变
|
||||
|
||||
#### Scenario: 非四边面
|
||||
- **WHEN** 输入面为三角面或其他非四边面
|
||||
- **THEN** 新增清理规则不删除该面
|
||||
|
||||
#### Scenario: 非流形边
|
||||
- **WHEN** 一条边的 Face Count 不等于 1
|
||||
- **THEN** 该边不能作为匹配条件中的边界边
|
||||
|
||||
### Requirement: 清理结果接入原投影和厚度流程
|
||||
|
||||
系统 SHALL 在剩余几何上固定相机坐标并执行现有投影及加厚,保留 UV 和用户属性,保持切口区域独立。清理选择 SHALL 只依据拆后拓扑,不依赖 Thickness 或后续 Smooth。
|
||||
|
||||
#### Scenario: 剩余区域加厚
|
||||
- **WHEN** 清理后的定向正确的流形片状区域设置正厚度
|
||||
- **THEN** 每个保留区域的正背面与侧壁保持完整连接,区域之间保持独立
|
||||
|
||||
#### Scenario: 改变显示形状参数
|
||||
- **WHEN** 基础几何、深度输入与 Split Threshold 不变,仅修改 Thickness 或 Smooth
|
||||
- **THEN** 被条带清理选中的基础面集合不变
|
||||
|
||||
#### Scenario: 属性与空结果
|
||||
- **WHEN** 清理保留部分面或删除全部面
|
||||
- **THEN** 求值正常完成且坐标有限;有剩余几何时 UV 与用户属性可用,临时属性依当前流程清理
|
||||
|
||||
### Requirement: Split Threshold 位于 Smooth 前
|
||||
|
||||
两个节点组 SHALL 将唯一的 `Split Threshold` 输入放在主输入区,紧邻并位于 `Smooth` 之前。该输入 SHALL 保持原名称、FACTOR 类型、0–1 范围、默认 0 和当前阈值映射。
|
||||
|
||||
#### Scenario: 检查接口
|
||||
- **WHEN** 检查任一节点组或其修改器输入
|
||||
- **THEN** Split Threshold 位于 Smooth 前且不属于 Options,Options 内没有重复输入,接口没有 Remove Strip Faces
|
||||
|
||||
#### Scenario: 参数读取
|
||||
- **WHEN** Operator 为修改器赋值或用户调整 Split Threshold
|
||||
- **THEN** 新位置的输入正常控制原拆边强度及默认条带清理
|
||||
16
openspec/changes/clean-depth-surface-strip-faces/tasks.md
Normal file
16
openspec/changes/clean-depth-surface-strip-faces/tasks.md
Normal file
@@ -0,0 +1,16 @@
|
||||
## 1. 共用条带判定
|
||||
|
||||
- [x] 1.1 在 `tools/nodes/common/depth_surface.py` 实现四边面对边界边判定,在 Split Edges 后、启用分支 Switch 前接入单次 Face / All 删除;正式逻辑固定启用,无额外开关。
|
||||
- [x] 1.2 验证孤立四边面、一面宽条带、普通边缘与角落、面角起点和绕序、三角面及其他多边面、非流形边;加入首次删除后出现新候选面的用例以确认仅执行一遍。
|
||||
|
||||
## 2. 两组接口与行为接入
|
||||
|
||||
- [x] 2.1 将 `O Image Depth Plane` 和 `O Image Depth Cutout` 的 Split Threshold 移到主输入区 Smooth 紧前,保留输入语义,整理局部节点布局。
|
||||
- [x] 2.2 更新接口顺序、Options 归属、唯一输入、无实验开关及相关修改器赋值测试。
|
||||
- [x] 2.3 更新原有面数保留断言,分别验证两组的四边面清理、三角面保留和 Split 为零时原行为;确认原梯度选择与比例映射不变。
|
||||
|
||||
## 3. 几何与集成验证
|
||||
|
||||
- [x] 3.1 验证剩余表面的 UV、用户属性、临时属性清理、空结果、正厚度闭合以及 Smooth 后区域独立;确认厚度与 Smooth 不改变基础删面集合。
|
||||
- [x] 3.2 使用真实 Blender 求值验证两组节点;分别记录四边网格与当前 Cutout 三角网格的结果,不能用四边实验替代正式三角输入验收。
|
||||
- [x] 3.3 运行 `uv run pytest` 全量测试并确认正常退出,检查最终差异和旧接口断言,保留其他已有修改;不构建文档或产物,并在交付说明中明确正式节点资产尚待另行重建发布。验证结果:940 passed、2 xfailed,退出码 0。
|
||||
2
openspec/changes/organize-tool-cli/.openspec.yaml
Normal file
2
openspec/changes/organize-tool-cli/.openspec.yaml
Normal file
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-10
|
||||
44
openspec/changes/organize-tool-cli/design.md
Normal file
44
openspec/changes/organize-tool-cli/design.md
Normal file
@@ -0,0 +1,44 @@
|
||||
## Context
|
||||
|
||||
参见 proposal.md。现有节点入口依次调用 Blender 构建、资产校验及 pytest,预览模块已有 HTML 导出能力。模型入口统一准备模型并按选项上传,包含现成文件下载、普通 ONNX 转换及 PiSA-SR 独立环境转换。
|
||||
|
||||
## Goals
|
||||
|
||||
命令入口负责参数解析与流程调度,业务模块负责产物;复用现有 Blender 启动、模型准备与校验实现。
|
||||
|
||||
## Decisions
|
||||
|
||||
- 在现有两个 cli.py 使用 argparse 子命令,脚本入口为 `node-group` 和 `model`。Python 包继续使用表示业务集合的 `tools/nodes`、`tools/models`。
|
||||
- `node-group build` 保持构建、资产校验、全量 pytest 的顺序;`check` 复用后两步。两者支持 `--blender` 和现有 `--skip-tests`,后者只跳过 pytest。任一步失败立即以非零状态退出。
|
||||
- `preview` 复用 Blender 启动流程及现有预览导出器,默认写入系统临时目录的独立 HTML,输出绝对路径,再由父进程打开浏览器。支持 `--blender`、`--output PATH`、`--no-open`、`--fragment`;fragment 模式仅输出片段且不自动打开。文件保留供查看,资产文件保持原样。
|
||||
- 模型子命令为 `prepare` 和 `sync`。`prepare` 替代 `--prepare-only`,统一下载现成 ONNX 或准备源权重并导出,包含 PiSA-SR;按既有目录输出,复用已校验的缓存及独立转换环境。`sync` 复用全部准备成功后上传的流程。
|
||||
- PiSA-SR 在模型目录下的临时目录导出整组文件,全部通过目录清单校验后再更新正式产物,临时目录随流程退出清理。
|
||||
- 使用延迟导入,使帮助与参数错误可以在未加载 Blender、Torch 和导出环境时返回。无动作时显示帮助并成功退出,非法动作或参数非零退出。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[解析命令] --> B[node-group]
|
||||
A --> C[model]
|
||||
B --> D[build 构建资产]
|
||||
D --> E[校验资产]
|
||||
B --> F[check]
|
||||
F --> E
|
||||
E --> G[pytest]
|
||||
B --> H[preview 内存构建与排列]
|
||||
H --> I[HTML 预览]
|
||||
C --> J[prepare 下载或导出并校验全部模型]
|
||||
C --> K[sync]
|
||||
K --> J
|
||||
J --> L{动作是 sync}
|
||||
L -->|是| M[上传 R2]
|
||||
```
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- CLI 改名影响本地脚本调用 → 删除旧入口并验证新的安装脚本映射,实施时报告命令迁移。
|
||||
- Blender 参数与预览参数共用进程命令行 → 显式传递业务参数,测试参数隔离与失败传播。
|
||||
- 模型导出成本较高 → 保留大小及 SHA-256 校验后的缓存复用;自动测试使用隔离文件和替代执行器验证路由。
|
||||
|
||||
## Migration Plan
|
||||
|
||||
更新入口及子命令后执行 `uv sync` 刷新本地脚本,运行相关测试、帮助命令及节点构建链验证。保留工作区既有修改。
|
||||
24
openspec/changes/organize-tool-cli/proposal.md
Normal file
24
openspec/changes/organize-tool-cli/proposal.md
Normal file
@@ -0,0 +1,24 @@
|
||||
## Why
|
||||
|
||||
节点组和模型工具需要统一为「对象 + 动作」命令,让构建、检查、预览和模型准备的职责直观可见,并能独立执行。
|
||||
|
||||
## What Changes
|
||||
|
||||
- **BREAKING**:将 `build-nodes` 替换为 `node-group build`,将 `sync-models` 替换为 `model sync`,删除旧入口。
|
||||
- 提供 `node-group check`,检查已有资产并运行测试;提供 `node-group preview`,生成当前源码的 HTML 预览并打开浏览器。
|
||||
- 提供 `model prepare`,按模型来源下载现成文件或准备源权重并导出,统一校验全部模型。
|
||||
- 使用统一的小写子命令;未提供动作时显示帮助。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `developer-tool-cli`:节点组和模型命令的路由、执行边界、参数及失败行为。
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
无。
|
||||
|
||||
## Impact
|
||||
|
||||
涉及 `pyproject.toml` 的脚本入口、`tools/nodes`、`tools/models` 和相关命令测试。使用现有 argparse、Blender 与模型转换依赖。实施范围为命令代码与测试;本次产出为 OpenSpec 规划文件。
|
||||
@@ -0,0 +1,81 @@
|
||||
## Purpose
|
||||
|
||||
为 AnyImage 开发者提供按业务对象组织的命令接口,明确节点组构建、检查与预览,以及模型准备与同步的执行边界,将模型下载和导出统一归入准备流程,让每个动作的产物、失败状态和副作用均可验证。
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Grouped command entry points
|
||||
|
||||
系统 SHALL 提供 `uv run node-group` 和 `uv run model` 入口,使用小写子命令,并移除旧脚本入口 `build-nodes`、`sync-models`。
|
||||
|
||||
#### Scenario: Display help
|
||||
- **WHEN** 用户未指定子命令或传入 `--help`
|
||||
- **THEN** 命令显示帮助并成功退出,不启动 Blender、模型准备或上传
|
||||
|
||||
#### Scenario: Invalid arguments
|
||||
- **WHEN** 用户传入未知子命令或参数
|
||||
- **THEN** 命令显示参数错误并非零退出,业务动作不执行
|
||||
|
||||
### Requirement: Build and check node groups
|
||||
|
||||
`node-group build` SHALL 依次构建资产、校验保存的资产、运行全量 pytest;`node-group check` SHALL 仅执行后两步。两者 SHALL 支持 `--blender` 选择 Blender,支持 `--skip-tests` 仅跳过 pytest。
|
||||
|
||||
#### Scenario: Build assets
|
||||
- **WHEN** 用户运行 `uv run node-group build`
|
||||
- **THEN** 更新 O_AnyImage.blend,并在资产校验和全量测试成功后成功退出
|
||||
|
||||
#### Scenario: Check existing assets
|
||||
- **WHEN** 用户运行 `uv run node-group check`
|
||||
- **THEN** 检查已有资产并运行全量测试,资产文件内容保持原样
|
||||
|
||||
#### Scenario: Skip Python tests
|
||||
- **WHEN** build 或 check 指定 `--skip-tests`
|
||||
- **THEN** 仍执行资产校验,跳过 pytest
|
||||
|
||||
#### Scenario: Stop after failure
|
||||
- **WHEN** 构建、校验或测试任一步失败
|
||||
- **THEN** 命令非零退出且不执行后续步骤
|
||||
|
||||
### Requirement: Preview node groups
|
||||
|
||||
`node-group preview` SHALL 从当前源码在内存中构建并排列几何节点组,生成 HTML,输出绝对路径并默认打开浏览器,保持资产文件内容原样。默认文件 SHALL 保存于系统临时目录并在命令退出后可供查看。命令 SHALL 支持 `--blender`、`--output PATH`、`--no-open` 和 `--fragment`。
|
||||
|
||||
#### Scenario: Preview current source
|
||||
- **WHEN** 用户运行 `uv run node-group preview`
|
||||
- **THEN** 生成当前源码的可查看 HTML 并尝试打开浏览器
|
||||
|
||||
#### Scenario: Save without opening
|
||||
- **WHEN** 用户指定 `--output PATH --no-open`
|
||||
- **THEN** HTML 写入指定路径且不启动浏览器
|
||||
|
||||
#### Scenario: Export fragment
|
||||
- **WHEN** 用户指定 `--fragment`
|
||||
- **THEN** 输出 HTML 片段及其路径,不自动打开浏览器
|
||||
|
||||
### Requirement: Prepare and sync models
|
||||
|
||||
模型命令 SHALL 提供 `prepare` 和 `sync` 两个子命令。`model prepare` SHALL 准备并校验目录中全部模型,复用有效缓存,按模型来源下载现成 ONNX 或准备源权重并导出(包含 PiSA-SR);`model sync` SHALL 在全部准备成功后上传 R2。`prepare` SHALL 不上传且不要求上传工具可用。
|
||||
|
||||
#### Scenario: Prepare locally
|
||||
- **WHEN** 用户运行 `uv run model prepare`
|
||||
- **THEN** 全部模型在本地通过既有大小和 SHA-256 校验,不执行上传
|
||||
|
||||
#### Scenario: Sync prepared models
|
||||
- **WHEN** 用户运行 `uv run model sync` 且全部准备成功
|
||||
- **THEN** 上传全部模型到既定 R2 位置
|
||||
|
||||
#### Scenario: Preparation fails
|
||||
- **WHEN** 任一模型准备或校验失败
|
||||
- **THEN** 命令非零退出,sync 不开始上传
|
||||
|
||||
#### Scenario: Download and export models
|
||||
- **WHEN** 用户运行 `uv run model prepare` 且本地缺少有效模型
|
||||
- **THEN** 根据模型来源下载现成文件或准备源权重并导出,产物保存到既有本地目标并通过校验
|
||||
|
||||
#### Scenario: Reuse valid cache
|
||||
- **WHEN** 本地模型已通过大小和 SHA-256 校验
|
||||
- **THEN** prepare 复用该产物,跳过对应下载和导出
|
||||
|
||||
#### Scenario: Export fails
|
||||
- **WHEN** 源权重准备、转换或产物校验失败
|
||||
- **THEN** 命令非零退出,失败产物不替换正式目标
|
||||
19
openspec/changes/organize-tool-cli/tasks.md
Normal file
19
openspec/changes/organize-tool-cli/tasks.md
Normal file
@@ -0,0 +1,19 @@
|
||||
## 1. 命令入口
|
||||
|
||||
- [x] 1.1 将脚本入口替换为 `node-group`、`model`,增加子命令解析并删除旧入口及 `--prepare-only`;更新入口测试,验证帮助、无动作、非法参数均不执行业务操作。
|
||||
|
||||
## 2. 节点组命令
|
||||
|
||||
- [x] 2.1 实现 build 与 check 的公共 Blender 调度,支持 `--blender`、`--skip-tests`;通过命令测试验证顺序、check 不构建和失败即停止。
|
||||
- [x] 2.2 接入 preview,支持默认临时 HTML、`--output`、`--no-open`、`--fragment`,由父进程打开浏览器;验证参数传递、输出内容、片段模式和资产内容保持原样。
|
||||
|
||||
## 3. 模型命令
|
||||
|
||||
- [x] 3.1 实现 prepare 与 sync 两个模型子命令,prepare 统一下载和导出,sync 复用准备后上传逻辑;通过隔离测试验证缓存命中、下载或转换选择、校验失败阻断上传,以及 prepare 不依赖上传工具。
|
||||
- [x] 3.2 验证 prepare 覆盖现成模型下载、普通模型转换与 PiSA-SR 导出,测试源权重准备、产物校验、失败临时文件清理和正式目标保护。
|
||||
|
||||
## 4. 集成验证
|
||||
|
||||
- [x] 4.1 执行 `uv sync` 后检查两组命令及全部子命令的 `--help`,运行相关工具测试,确认安装入口与源码一致。
|
||||
- [x] 4.2 执行 `uv run node-group build` 验证真实 Blender 构建、资产校验和全量 pytest 正常退出;运行 `node-group check` 和 `node-group preview --no-open`,校验资产哈希保持原样及预览文件可查看。
|
||||
- [x] 4.3 检查代码与测试中的旧入口引用、最终差异和测试结果,确认保留工作区既有修改,并简要报告命令迁移及验证结果。
|
||||
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-09
|
||||
36
openspec/changes/prototype-panorama-surface/design.md
Normal file
36
openspec/changes/prototype-panorama-surface/design.md
Normal file
@@ -0,0 +1,36 @@
|
||||
## Context
|
||||
|
||||
本地具备 MoGe2 ONNX 模型和 Blender 4.5。试验以独立脚本运行,使用合成房间的解析距离作为几何真值。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
目标是验证完整全景的距离融合、几何节点径向变形与接缝。试验范围限定为 `experiments/panorama_surface` 和本变更目录。
|
||||
|
||||
## Decisions
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[解析房间或用户全景] --> B[12 个重叠的 90 度视图]
|
||||
B --> C[MoGe2 ONNX 与固定视角后处理]
|
||||
C --> D[周期边界的对数距离融合]
|
||||
D --> E[浮点距离及有效性]
|
||||
E --> F[独立 Blender 节点资产]
|
||||
F --> G[Quad Sphere 细分与径向定位]
|
||||
G --> I[Mask 与 Alpha 剔除]
|
||||
I --> H[重新加载与数值验证]
|
||||
```
|
||||
|
||||
- 融合参考官方梯度域算法,使用 SciPy 稀疏求解;通过全局对数距离偏移恢复输入预测的整体尺度。
|
||||
- Quad Sphere 从用户指定的 O_Essentials_GeometryNodes.blend1 离线载入并打包进试验文件,Segments 为 2^Subdivide + 1。
|
||||
- 球面方向生成采样 UV;材质 UV 在面角域处理经度接缝及极点。
|
||||
- 深度导出将 Mask × 源图 Alpha 写入 depth.exr 的 Alpha;几何节点只读取深度图片。
|
||||
- Depth Scale 在单位球与预测距离间插值;深度 EXR 的 Alpha 低于阈值时,通过点域布尔字段删除面。
|
||||
- 真实照片先使用 BEN2 去除天空,透明区域在视图几何恢复及融合阶段排除;最后按源图 Alpha 写入深度有效性。
|
||||
- 节点组通过独立离线脚本构建到试验 `.blend`;验证阶段重新加载该文件。
|
||||
- 合成真值与 AI 输出分别检查,区分投影实现误差和模型预测误差。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- 合成图与真实照片分布不同 → AI 结果只作为流程验证,几何正确性以解析真值验证。
|
||||
- 梯度融合没有绝对尺度约束 → 输出明确采用预测尺度锚定,记录相对误差。
|
||||
- 遮挡处连接可能产生长面 → 通过真实照片试验观察可见表面连接质量。
|
||||
21
openspec/changes/prototype-panorama-surface/proposal.md
Normal file
21
openspec/changes/prototype-panorama-surface/proposal.md
Normal file
@@ -0,0 +1,21 @@
|
||||
## Why
|
||||
|
||||
验证 MoGe 多视图距离融合与 Blender 几何节点能否组成全景表面生成流程,为后续产品方案提供实测依据。
|
||||
|
||||
## What Changes
|
||||
|
||||
- 在 `experiments/panorama_surface` 实现独立试验,使用可计算真实距离的合成全景验证投影、融合与网格。
|
||||
- 使用本地 MoGe2 ONNX 模型完成一次多视图推理,输出距离图和独立 Blender 示例。
|
||||
- 检查可调细分 Quad Sphere、全景 UV、Mask 与 Alpha 剔除及 Blender 重新加载后的求值。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `panorama-surface-prototype`: 独立的全景距离融合和几何节点验证。
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
## Impact
|
||||
|
||||
新增试验目录和本提案目录。试验复用当前 Python、NumPy、SciPy、ONNX Runtime 与 Blender 环境,生产源码、依赖及原节点资产保持原状。
|
||||
@@ -0,0 +1,33 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Isolated panorama experiment
|
||||
|
||||
试验 SHALL 将代码和输出保存在独立试验目录,使用已有模型及运行环境。
|
||||
|
||||
#### Scenario: Run prototype
|
||||
- **WHEN** 执行全景原型
|
||||
- **THEN** 生成距离数据、独立 Blender 文件与验证结果,原有源码及节点资产保持原状
|
||||
|
||||
### Requirement: Periodic distance reconstruction
|
||||
|
||||
试验 SHALL 对完整全景使用周期经度映射、多视图距离融合及已知 90 度相机视角。
|
||||
|
||||
#### Scenario: Synthetic reference
|
||||
- **WHEN** 使用解析球面或房间距离验证
|
||||
- **THEN** 投影与融合产生有限正距离,并记录与真值的误差
|
||||
|
||||
### Requirement: Geometry node surface
|
||||
|
||||
试验 SHALL 使用可调 Subdivide 的 Quad Sphere,按全景距离沿球面射线定位顶点。Depth Scale 为 0 时保持单位球,1 时恢复预测距离。深度导出 SHALL 将 Mask × 源图 Alpha 写入 depth.exr 的 Alpha;几何节点 SHALL 只接收一张深度图片,并按该 Alpha 与 Validity Threshold 的比较结果剔除无效面。
|
||||
|
||||
#### Scenario: Reload Blender asset
|
||||
- **WHEN** 在新的 Blender 进程加载试验文件
|
||||
- **THEN** 全有效输入下网格闭合且仅有四边面,面数为 6 × 4^Subdivide,Depth Scale 0 与 1 分别得到单位球和预测表面
|
||||
|
||||
#### Scenario: Invalid image samples
|
||||
- **WHEN** 输入包含无效 Mask 或透明图片 Alpha
|
||||
- **THEN** 按 O Image Depth Plane 的点域布尔选择与面域删除方式剔除不合格区域
|
||||
|
||||
#### Scenario: Sky removal before geometry prediction
|
||||
- **WHEN** 生成真实全景照片示例
|
||||
- **THEN** 先去除天空背景,使用处理后的透明全景进行几何预测与深度导出
|
||||
22
openspec/changes/prototype-panorama-surface/tasks.md
Normal file
22
openspec/changes/prototype-panorama-surface/tasks.md
Normal file
@@ -0,0 +1,22 @@
|
||||
## 1. 距离原型
|
||||
|
||||
- [x] 1.1 实现解析全景、12 视图投影与固定视角 MoGe2 推理
|
||||
- [x] 1.2 实现周期对数距离融合并用解析真值测试
|
||||
|
||||
## 2. Blender 验证
|
||||
|
||||
- [x] 2.1 构建独立节点示例,提供距离变形、比例和断层控制
|
||||
- [x] 2.2 在独立 Blender 进程重新加载并验证拓扑、位置与比例
|
||||
- [x] 2.3 运行本地模型,检查结果并交付示例与验证数据
|
||||
|
||||
## 3. Quad Sphere 调整
|
||||
|
||||
- [x] 3.1 复用参考 Quad Sphere,支持动态细分与全景 UV
|
||||
- [x] 3.2 使用 Depth Scale 控制球面变形,按 Mask 与 Alpha 剔除无效面
|
||||
- [x] 3.3 验证细分面数、全四边面、UV、Alpha 与 Mask 并更新两个试验文件
|
||||
|
||||
## 4. 深度 Alpha 数据约定
|
||||
|
||||
- [x] 4.1 将 Mask × 源图 Alpha 写入 depth.exr,几何节点仅保留深度图片输入
|
||||
- [x] 4.2 真实照片先去天空,再重新推理、融合并生成示例
|
||||
- [x] 4.3 验证单图片输入、Alpha 乘积及天空剔除
|
||||
Reference in New Issue
Block a user