Files
AnyImage/docs/internals/runtime.md
nan 08309f719d feat: Implement cutout tool and depth generation features
- Added a new cutout tool for selecting regions in images, allowing users to choose mesh shapes based on selected areas.
- Introduced depth generation capabilities for rasterized images, including normal data extraction.
- Created jobs for generating depth planes and region data, enhancing the AI data generation workflow.
- Developed a selection refinement process for cutout regions, improving accuracy in generated outputs.
- Established a new region module for handling rasterized image regions and their associated AI generation tasks.
- Enhanced node graph builders for asset generation, facilitating smoother integration of new features.
2026-08-30 23:09:13 +08:00

4.7 KiB
Raw Blame History

Job Runtime 与 Server

AnyImage 使用 BlendJob 管理独立 Python Environment、Server 进程和任务队列。Blender 侧只配置 Runtime 与提交参数;server/ 是不依赖 bpy 的计算包,可以在独立解释器中导入。

对应文件

src/anyimage/
├── runtime.py                 # Environment 与 JobRuntime 配置
└── server/
    ├── app.py                 # Job 注册和共享资源
    ├── model_catalog.py       # 模型声明
    ├── model_download.py      # 下载、校验与镜像回退
    ├── model_manager.py       # 模型目录与 Session 缓存
    ├── media/input.py         # 图片、视频和序列输入
    ├── jobs/                  # app.py 可提交的公开任务
    ├── region/                # BEN2 Region 细化
    ├── models/                # 模型适配与 ONNX 推理
    ├── geometry/              # 深度反投影与法线纹理编码
    └── outputs/               # Debug Prediction 序列化

任务生命周期

flowchart TD
    Request["Operator request()"] --> Runtime["JobRuntime"]
    Runtime --> Queue["单 Worker 队列"]
    Queue --> Job["app.py 注册的 Job"]
    Job --> Resource["ModelManager / Media"]
    Resource --> Directory["jobs/<job-id>/"]
    Directory --> Response["Operator response()"]

Runtime 在首次任务或显式启动时拉起 Server。任务在队列中串行执行,进度、取消和日志由 BlendJob 提供;AnyImage Job 在阶段边界调用 context.check_cancelled(),并把业务产物写入当前 Job 目录。Operator 完成响应后再清理 Blender 侧为 Packed Image 准备的临时输入。

server/app.py 是任务清单的唯一入口:

Job 主要用途
download-model、download-required-models 准备模型文件
remove-background BEN2 透明前景
upscale-image 4× 图片或帧序列
refine-image-mask 为 Image Box / Lasso 细化 Region
generate-depth-plane 为 Depth Plane 生成颜色副本与深度场
generate-region-data 按需为 Cutout Region 生成 Refine、Depth 或 Normal
debug-* 保存模型适配层的直接输出

媒体输入

server/media/input.py 把单图、视频和图片目录统一为有序帧路径,并用上下文管理器负责临时帧目录的生命周期。帧展开是媒体输入的内部能力,不再暴露没有业务消费者的独立 Job。server/media/resolution.py 提供默认 2048 的共用输入长边限制;Upscale Operator 只允许长边小于该值的当前 Image 进入正式任务,Depth Plane 与 Cutout 则只限制模型分析输入,不降低颜色贴图分辨率。

generate-depth-plane 与 generate-region-data 只接受一帧,因此 Depth Plane 与 Cutout 都是静态图工作流。Remove Background 与 Upscale 通过同一媒体入口处理单图、视频和序列帧。

公开 Job 按稳定的计算边界划分,不按界面入口机械映射。Depth Plane 使用 jobs/generate_depth_plane.py,Cutout 使用 jobs/generate_region_data.py,四个 Debug Job 共享 jobs/debug_predictions.py。Job 只负责协议和编排;可复用的输入、AI Region、模型与几何数据能力分别位于 media/、region/、models/ 和 geometry/,Job 之间不互相导入实现。

模型层

Job 只编排流程,模型适配层把不同推理 API 统一为内存对象:

  • DA3 适配为深度、置信度、相机内外参与相机点。
  • MoGe-2 适配为深度、法线、有效区域、相机内参与可选相机点。
  • BEN2 返回带 Alpha 的前景图。
  • Upscale 返回保留源 Alpha 的 4× RGBA 图。

ModelManager 管理下载目录和 ONNX Session。缓存按 BEN2、几何模型和 Upscale 三个族分开;每个族只保留最近一次使用的模型与 Device,切换同族模型时释放旧 Session。这样连续任务可以复用模型,同时避免同一类模型重复占用资源。

Environment 与 Storage Root

runtime.py 声明 Python 3.12 环境和固定版本的 NumPy、Pillow、PyAV、trimesh、Hugging Face Hub 与 ONNX Runtime。Windows 安装 DirectML 版本,其他平台安装标准 ONNX Runtime。首次安装后依次下载默认 MoGe-2、BEN2 和 Real-ESRGAN WDN 模型。

Storage Root 默认是 ~/.anyimage:

~/.anyimage/
├── .venv/           # 独立 Environment
├── models/          # 模型目录
├── jobs/            # Job 产物与 job.log
├── environment.json
├── manifest.json
├── install.log
└── server.log

Storage Root 由扩展偏好设置提供给 Runtime。切换路径等同于切换整套 Environment、模型和任务数据,不会自动迁移旧目录。

各 Job 的稳定产物见 Job 产物。