feat: Add restore cutout depth extension with edge depth correction

- Introduced a new extension for restoring cutout depth with edge correction.
- Implemented edge depth extension algorithm in `edge_depth.py` to enhance depth accuracy near cutout edges.
- Updated `generate_moge_artifacts` to include an option for extending depth edges during depth generation.
- Modified cutout job processing to enable edge depth extension based on depth request.
- Added comprehensive tests for edge depth functionality, ensuring correct behavior under various scenarios.
- Updated existing node loading functions to remove asset revision dependencies, simplifying the loading process.
- Created new design and proposal documentation outlining the goals and decisions for the extension.
This commit is contained in:
2026-09-13 20:36:52 +08:00
parent 2a00ed0ee6
commit a0dd6e4a88
25 changed files with 482 additions and 32 deletions

View File

@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-09-13

View File

@@ -0,0 +1,36 @@
## Context
共享 MoGe 产物入口当前直接输出预测 XYZ。本变更在 Cutout 深度产物写入前加入边缘延伸,生成的贴图由现有几何节点直接消费。
独立实验位于 `C:/Users/icrdr/.codex/visualizations/2026/09/13/cutout-depth-4px/`,`report.md`、脚本、预测、对照图及 Blender 文件记录完整过程。使用 v26 节点组、BiRefNet Lite、MoGe-2 ViT-S Level 5,同一 Alpha 和预测,剪裁阈值 0.9,世界边长 0.015,Depth Split=0.1。蜘蛛/头骨补边约 35/26 ms,拖尾明显减少,细腿仍有断裂与折点。该节点版本仅是已有实验条件;实施验收使用现有节点和固定参数,仅替换深度产物。
## Goals
以一次深度补边稳定 Cutout 轮廓采样,保持可靠内部、相机投影和产物有效性一致。
## Decisions
### 沿用实测的固定来源规则
恢复 `31074bd^:src/anyimage/server/geometry/edge_depth.py` 的算法语义。剪裁阈值用于可见域及其 8 连通分量;可靠候选在该分量内满足 Alpha ≥ 0.95、Validity > 0.5、深度有限且为正。0.95 是固定来源条件,不新增随剪裁阈值变化的参数逻辑。低剪裁阈值可以保留毛发,但低 Alpha 像素仍从可靠来源取得深度。
不透明候选域按图片边缘延续计算距离,距离域外大于 2 个深度图像素的可靠候选作为供体。没有核心时回退到本分量未内缩的可靠候选;仍无候选则保留原预测。保持旧算法对内部区域的保护:模型 validity 孔洞只影响来源资格。
每个分量以最近供体 Z 延伸到边缘及可见域外 4 px。使用 sigma=0.8、半径3 px的 Gaussian,仅写回旧算法定义的补齐区;分量局部 padding 为7 px,重叠透明区域由最近可修复分量提供。完整不透明输入原样返回。
### 在 Cutout 产物边界启用
共享 `generate_moge_artifacts()` 接收默认关闭的内部补边选项,由 `server/jobs/cutout.py` 在请求深度时开启。模型只推理一次,保留原始 Frame,另取修复 Frame 写入 Cutout EXR 和 Metadata。Normal Writer 消费原始 Frame;Depth Plane 等调用保持默认行为。
修改 Z 后使用当前像素中心射线重建 XYZ,复用服务端已有反投影函数并处理像素/归一化内参。仅写回变化像素,保留原 validity;EXR A 继续为原图 Alpha × 原 validity,Metadata 参考深度按修复 Frame 和原参考掩码计算。复用已声明的 NumPy/SciPy,实施时核对独立服务端依赖。
## Risks / Trade-offs
- 固定宽度对低分辨率、细腿覆盖比例较大 → 验证细分量回退及两张实图;维持已实测参数。
- 高 Alpha 仍可能包含错误深度 → 保留内侧保护带;实图报告残余断裂和内部深度错误。
- 补边有一次生成成本 → 分别记录补边耗时与后续节点求值耗时。
- Normal 来自原始预测 → 对修复边缘检查材质着色,明确几何与法线差异。
## Migration Plan
实施调整服务端深度处理与 Cutout 产物调用。新生成 Cutout 获得修复深度,已有对象可通过重新生成取得新产物。几何节点保持当前逻辑、参数和资产;相关测试与工作区外实图验收通过后交付。

View File

@@ -0,0 +1,23 @@
## Why
Cutout 轮廓附近的背景深度会形成长条拖尾。蜘蛛和恐龙头骨实测表明,生成时延伸深度 4 像素可明显减少拖尾,适合在深度产物生成阶段恢复。
## What Changes
- 仅为 Cutout 深度产物恢复已实测的旧版边缘延伸:可靠来源 Alpha ≥ 0.95、内侧保护 2 px、外侧延伸 4 px、局部平滑。
- 保留旧算法的来源筛选、分量隔离与回退规则;剪裁 Alpha 继续定义可见轮廓,不新增来源阈值联动或设置。
- 普通 Depth Plane、全景深度与 Normal 使用原始预测;Cutout 深度及 Metadata 使用同一修复结果。
## Capabilities
### New Capabilities
- `cutout-depth-extension`: Cutout 专用的可靠边缘深度延伸、产物隔离与实图验收。
### Modified Capabilities
无;相关规范尚未归档至 `openspec/specs`。
## Impact
涉及 Cutout Job、共享 MoGe 产物入口、服务端深度处理与相关测试。复用现有 NumPy/SciPy,核对服务端依赖声明。实现范围为生成的 Cutout 深度图及配套 Metadata;几何节点源码、参数、revision 和 `.blend` 资产保持现状。

View File

@@ -0,0 +1,49 @@
## ADDED Requirements
### Requirement: Reliable depth sources retain the tested alpha rule
系统 SHALL 按剪裁 Alpha 定义可见域和8连通分量;供体候选 SHALL 位于同一可见分量内,并满足固定 Alpha ≥ 0.95、Validity > 0.5、有限正深度。系统 SHALL 保留内侧2像素保护及旧版回退规则。
#### Scenario: Low clipping threshold retains translucent edges
- **WHEN** 剪裁 Alpha 为0.1,边缘 Alpha 为0.1且同分量存在可靠核心
- **THEN** 边缘属于可见域但不能充当供体,其深度使用同分量可靠来源补齐
#### Scenario: Narrow component lacks a core
- **WHEN** 分量内缩2像素后没有可靠供体
- **THEN** 使用本分量未内缩的可靠候选;候选也为空时保留该分量原预测
### Requirement: Extension preserves reliable interior and projection
系统 SHALL 沿用旧算法补齐轮廓边缘及可见域外4个深度图像素,使用sigma=0.8、半径3像素的分量内局部平滑。系统 SHALL 保留内部受保护区域及未修补像素,按目标像素射线重建变化像素的XYZ。
#### Scenario: Filtered sampling crosses an outline
- **WHEN** 采样邻域跨越主体轮廓
- **THEN** 邻近透明侧4像素范围提供延伸深度,各分量采用自身供体和平滑输入,其他可见分量保持各自处理结果
#### Scenario: Corrected points retain their pixel location
- **WHEN** 像素继承供体Z
- **THEN** XYZ仍投影至目标像素,归一化投影误差小于1e-6;原Alpha和validity保持不变
#### Scenario: Opaque input and interior validity holes
- **WHEN** 输入完全不透明,或透明图内部存在模型validity孔洞
- **THEN** 完全不透明输入原样返回;内部孔洞只限制供体资格,不扩大轮廓修补区域
### Requirement: Only cutout depth artifacts use corrected frames
系统 SHALL 仅由Cutout深度请求开启延伸,使用同一修复Frame写入深度和Metadata。共享入口默认 SHALL 关闭修复,Normal SHALL 使用原始Frame,EXR A SHALL 保持原Alpha乘原validity。
#### Scenario: Cutout requests depth and normals
- **WHEN** 同一Cutout请求同时生成深度和Normal
- **THEN** 只执行一次模型预测,深度及Metadata来自修复Frame,Normal来自原始Frame
#### Scenario: Other artifact requests
- **WHEN** 普通Depth Plane、全景深度或仅Normal请求运行
- **THEN** 沿用各自原始预测产物行为
### Requirement: Real image verification uses a fixed prediction
验收 SHALL 在工作区外使用用户蜘蛛和头骨原图、固定同一Alpha与预测,在现有几何节点及相同参数下仅替换原始/延伸深度产物,记录截图、耗时与残余问题。
#### Scenario: Full modifier evaluation
- **WHEN** 两张图完成深度产物对照
- **THEN** 全部结果非空、坐标有限、无节点警告,报告一次补边与节点求值的独立耗时,并检查Normal着色

View File

@@ -0,0 +1,13 @@
## 1. Cutout 深度延伸
- [x] 1.1 恢复实测旧算法:固定0.95可靠来源条件、内侧2 px保护、外侧4 px延伸、分量内平滑和细分量回退;复用现有服务端反投影函数,核对NumPy/SciPy服务端声明。
- [x] 1.2 为共享产物入口增加默认关闭的内部选项,仅由Cutout深度请求开启;深度和Metadata使用修复Frame,Normal与有效性通道保留原始语义。
- [x] 1.3 补充相关行为测试:低剪裁Alpha不降低供体要求、分量隔离、无核心回退、贴图边界、完全不透明输入、内部validity孔洞、XYZ投影和未修改像素。
- [x] 1.4 验证Cutout深度/Normal联合请求只推理一次,以及普通Depth Plane、全景和仅Normal路径的产物隔离。
## 2. 验收
- [x] 2.1 运行受影响的服务端与Cutout产物测试,确认进程正常退出。
- [x] 2.2 在工作区外复用实测蜘蛛/头骨Alpha和预测,固定现有节点及参数,仅替换原始/延伸深度产物,记录同视角图、补边耗时、节点求值耗时与残余问题。
- [x] 2.3 检查使用原始Normal的边缘着色,以及生产Cutout产物与独立实验的数值一致性。
- [x] 2.4 检查最终差异与OpenSpec校验,确认改动限于深度产物生成及相关测试,汇总结果。