Skip to content

AI Features.zh.CN

paperhammer edited this page May 22, 2026 · 1 revision

AI 功能

VirtualPaper 提供三项 AI 驱动的图像处理功能,全部通过 ONNX Runtime 完全本地离线运行。不会将任何数据发送到外部服务器。

所有模型文件无需打包进安装目录 Plugins/ML/ 并按需加载——会话初始化一次,在调用间复用。


图像风格迁移

模型: AdaIN(自适应实例归一化)
文件: Plugins/ML/StyleTransfer/adain_style_transfer.onnx
实现: StyleTransfer/AdaIn.cs

工作原理

AdaIN 是基于编码器-解码器架构的任意风格迁移网络,分三步执行:

  1. 编码——内容图像与风格图像分别通过共享的 VGG 编码器提取特征表示。
  2. 统计对齐——将内容特征的逐通道均值和方差归一化为与风格特征一致。这就是"自适应实例归一化"的核心:无需重新训练即可将风格的颜色与纹理统计量迁移至内容结构上。
  3. 解码——将对齐后的特征送入解码器,重建风格化图像。

alpha 参数(0.0–1.0)控制原始内容与风格化结果之间的混合强度。默认 alpha = 1.0 表示完全应用风格。

推理管线

内容图像 ──► LoadAndResizeImage(短边 → 512px)
                     │
风格图像 ────► LoadAndResizeImage(短边 → 512px)
                     │
          ┌──────────┴──────────┐
          │                     │
      ImageToTensor         ImageToTensor
     [1, 3, H, W]           [1, 3, H, W]
          │                     │
          └──────┬──────────────┘
                 │  + alpha 标量 [1]
                 ▼
         ONNX Session.Run()
         输入:"content"、"style"、"alpha"
                 │
                 ▼
         输出张量 [1, 3, H, W]
                 │
         TensorToImageAndSave
         (缩放回原始内容尺寸)

像素值在推理前归一化至 [0, 1],输出后裁剪回 [0, 1]。图片在 OpenCV 原生 BGR 与处理所需的 RGB 之间进行转换。

取消机制

CancellationToken 绑定于 RunOptions.Terminate。令牌触发时,ONNX Runtime 在下一个算子边界处中止推理,取消操作几乎是即时的,无需等待完整的前向传播完成。


超分辨率

模型: Real-ESRGAN(基于生成对抗网络的超分辨率模型)
文件: Plugins/ML/SuperResolution/realesrgan_x4plus_dynamic.onnx
实现: SuperResolution/Realesrgan.cs

工作原理

Real-ESRGAN 是一个残差密集网络,经过判别器训练,可生成照片级真实感的放大图像。x4plus 变体针对一般自然图像设计,最高支持 4× 放大。

界面提供了两种模式:

模式 实际效果
清晰度恢复 以 ×1 比例运行模型(输入输出分辨率相同)。网络仍然进行去噪和锐化,只是最终图像缩放回原始尺寸。由于去噪后图像可压缩性提高,文件大小可能减小。
无损放大 以 ×2 或 ×4 比例运行模型。分辨率提高的同时保留细节。

分块推理

对大型图像进行完整 4× 推理可能会超出内存预算。实现方案将图像分割为重叠的瓦片并并行处理:

参数 用途
TileSize 512 像素 固定输入瓦片尺寸。使 ONNX 执行计划在瓦片间保持恒定。
TileOverlap 16 像素 相邻瓦片间的重叠区域。拼接时裁剪掉重叠条带以消除接缝伪影。
MaxParallelTiles 2 最大并发 Session.Run() 调用数。IntraOpNumThreads 设置为 ProcessorCount / MaxParallelTiles,使所有瓦片共同占满 CPU 核心,互不竞争。

小于 TileSize 的边缘瓦片使用边缘复制填充(向外重复边缘像素),而非零填充,以避免放大输出中出现黑边伪影。

拼接

每块瓦片的输出区域(裁剪重叠边距后)映射到最终图像中不重叠的矩形目标区域。瓦片直接写入共享的输出 Mat——由于各自的目标矩形不相交,无需加锁。

输入图像
  ├── 瓦片 (0,0) ──► ONNX ──► 裁剪重叠 ──► 写入 output[0,   0  ]
  ├── 瓦片 (1,0) ──► ONNX ──► 裁剪重叠 ──► 写入 output[496, 0  ]
  ├── 瓦片 (0,1) ──► ONNX ──► 裁剪重叠 ──► 写入 output[0,   496]
  └── …
最终缩放至 targetWidth × targetHeight

取消机制

与风格迁移相同:取消时设置 RunOptions.Terminate。每块瓦片捕获抛出的 OnnxRuntimeException 并静默返回;Parallel.ForEachCancellationToken 随后向调用方抛出一个统一的 OperationCanceledException


深度估计(3D 视差)

模型: MiDaS v2 Small
文件: Plugins/ML/DepthEstimate/model-small.onnx
实现: DepthEstimate/MiDaS.cs

该模型内部用于为静态图像的 3D 视差效果生成深度图,不直接暴露为 AI+ 面板中的用户功能。

工作原理

MiDaS(混合数据集单目深度估计算法)接收单张 RGB 图像,预测逐像素的相对深度图。

  1. 输入图像缩放至模型预期的分辨率(加载时从 InputMetadata 读取)。
  2. 像素值归一化至 [0, 1]
  3. 模型输出相对深度值的浮点数组。
  4. 输出最小-最大归一化[0, 1],再缩放为 8 位灰度图(0–255)。
  5. 深度图缩放回原始图像尺寸,保存为壁纸旁的灰度 PNG 文件。

视差渲染器使用深度图,根据光标位置按比例移动图像图层,从而产生深度错觉。


运行时与性能

项目 详情
运行时 Microsoft.ML.OnnxRuntime
图像处理 OpenCvSharp4
执行提供器 CPU(默认)。代码中 CUDA / DirectML 提供器已注释,可启用 GPU 加速。
内存 使用 ArrayPool 管理张量缓冲区,避免每次推理产生 GC 压力。
线程安全 InferenceSession 创建一次,在调用间共享。所有每次调用私有的可变状态(输出 MatRunOptions)均限定在各自 RunAndSave 方法内。

Clone this wiki locally