-
Notifications
You must be signed in to change notification settings - Fork 2
AI Features.zh.CN
VirtualPaper 提供三项 AI 驱动的图像处理功能,全部通过 ONNX Runtime 完全本地离线运行。不会将任何数据发送到外部服务器。
所有模型文件无需打包进安装目录 Plugins/ML/ 并按需加载——会话初始化一次,在调用间复用。
模型: AdaIN(自适应实例归一化)
文件: Plugins/ML/StyleTransfer/adain_style_transfer.onnx
实现: StyleTransfer/AdaIn.cs
AdaIN 是基于编码器-解码器架构的任意风格迁移网络,分三步执行:
- 编码——内容图像与风格图像分别通过共享的 VGG 编码器提取特征表示。
- 统计对齐——将内容特征的逐通道均值和方差归一化为与风格特征一致。这就是"自适应实例归一化"的核心:无需重新训练即可将风格的颜色与纹理统计量迁移至内容结构上。
- 解码——将对齐后的特征送入解码器,重建风格化图像。
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.ForEach 的 CancellationToken 随后向调用方抛出一个统一的 OperationCanceledException。
模型: MiDaS v2 Small
文件: Plugins/ML/DepthEstimate/model-small.onnx
实现: DepthEstimate/MiDaS.cs
该模型内部用于为静态图像的 3D 视差效果生成深度图,不直接暴露为 AI+ 面板中的用户功能。
MiDaS(混合数据集单目深度估计算法)接收单张 RGB 图像,预测逐像素的相对深度图。
- 输入图像缩放至模型预期的分辨率(加载时从
InputMetadata读取)。 - 像素值归一化至
[0, 1]。 - 模型输出相对深度值的浮点数组。
- 输出最小-最大归一化至
[0, 1],再缩放为 8 位灰度图(0–255)。 - 深度图缩放回原始图像尺寸,保存为壁纸旁的灰度 PNG 文件。
视差渲染器使用深度图,根据光标位置按比例移动图像图层,从而产生深度错觉。
| 项目 | 详情 |
|---|---|
| 运行时 | Microsoft.ML.OnnxRuntime |
| 图像处理 | OpenCvSharp4 |
| 执行提供器 | CPU(默认)。代码中 CUDA / DirectML 提供器已注释,可启用 GPU 加速。 |
| 内存 | 使用 ArrayPool 管理张量缓冲区,避免每次推理产生 GC 压力。 |
| 线程安全 |
InferenceSession 创建一次,在调用间共享。所有每次调用私有的可变状态(输出 Mat、RunOptions)均限定在各自 RunAndSave 方法内。 |