YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
MODNet 与 RVM 模型制品仓库 (Model Artifact Registry)
用途:集中托管 MODNet 与 RVM 的模型制品(ckpt / onnx / rknn 文件本身) 不包含:训练代码与 C++ 推理代码——这些在配套的私有仓库中维护
维护者:PotterWhite 最后更新:2026-07-03 许可证(License):MIT
目录(Table of Contents)
1. MODNet 模型
1.1 官方预训练模型
摄影人像抠图(Photographic Portrait Matting)
文件:photographic/modnet_photographic_portrait_matting.ckpt
原始 MODNet 检查点,在人像抠图数据集上训练
- 来源:作者 Google Drive(ZHKKKe/MODNet)
- 格式:PyTorch .ckpt(state_dict)
- 架构:MODNet + IBNorm + InstanceNormalization
- 输入尺寸:512×512
- 用途:微调实验的基线参考
- 状态:✓ 生产基线
摄像头人像抠图(Webcam Portrait Matting)
文件:modnet_webcam_portrait_matting.ckpt
针对摄像头实时抠图优化的 MODNet 检查点
- 来源:作者 Google Drive
- 格式:PyTorch .ckpt(state_dict)
- 架构:MODNet + IBNorm + InstanceNormalization
- 输入尺寸:384×384(更低延迟)
- 用途:实时视频/直播场景
- 状态:✓ 可用,当前管线未使用
MobileNetV2 人体分割(Human Segmentation)
文件:mobilenetv2_human_seg.ckpt
辅助分割模型,用于预处理阶段
- 来源:作者 Google Drive
- 格式:PyTorch .ckpt
- 用途:可选预处理阶段(当前未部署)
- 状态:✓ 可用作参考
1.2 微调模型 — 摄影数据集
纯批归一化变体(Pure Batch Normalization Variant)
训练轮次:Block 1.2 微调(2026-03-19 ~ 2026-03-19)
概要
在 P3M-10k 摄影数据集上微调 MODNet-BN
- 将所有 IBNorm + InstanceNormalization 替换为纯 BatchNorm2d
- 15 个 Epoch 的监督训练,含学习率调度(Learning Rate Schedule)
- 最佳模型:验证集 L1 Loss 0.0062
训练配置
| 参数 | 值 |
|---|---|
| 数据集(Dataset) | P3M-10k(Photographic 子集) |
| 训练样本数 | 9,421 |
| 验证样本数 | 500 |
| 批大小(Batch Size) | 8 |
| 轮次(Epochs) | 15 |
| 初始学习率(Learning Rate) | 0.01 |
| 学习率调度 | StepLR:γ=0.1 @ epoch 5, 10 |
| 输入尺寸 | 512×512 |
| 优化器(Optimizer) | Adam (β₁=0.9, β₂=0.999) |
| 损失函数(Loss Function) | L1(MAE),作用于 alpha 遮罩 |
| 设备(Device) | NVIDIA A100 (CUDA 11.8) |
| 训练时长 | ~4 小时 |
| 时间戳 | 2026-03-19 15:40:18 |
生成的制品(Artifacts)
photographic/finetune/
├── checkpoints/
│ ├── modnet_bn_best.ckpt # ★ 最佳模型(Val L1: 0.0062)
│ ├── modnet_bn_epoch_01.ckpt
│ ├── modnet_bn_epoch_02.ckpt
│ ├── ...(epoch 3-14 省略)
│ └── modnet_bn_epoch_15.ckpt
├── logs/
│ └── block1_2_training_20260319_154018.log # 训练日志(详细)
├── onnx/
│ └── modnet_bn_best_pureBN.onnx # ★ ONNX 导出(见 §1.3.3)
└── output/
├── epoch_01_val.png # 验证预览(第 1 轮)
├── epoch_02_val.png
├── ...(epoch 3-14 省略)
└── epoch_15_val.png # 最终验证可视化
验证损失曲线(Validation Loss Curve)
Epoch | Val L1 Loss | 改进幅度
------|-------------|-------------------
1 | 0.0264 | Δ = -0.0202(新最佳)
2 | 0.0175 | Δ = -0.0089(新最佳)
3 | 0.0121 | Δ = -0.0054(新最佳)
4 | 0.0098 | Δ = -0.0023(新最佳)
5 | 0.0089 | Δ = -0.0009(新最佳)
6 | 0.0081 | Δ = -0.0008(新最佳)
7 | 0.0076 | Δ = -0.0005(新最佳)
8 | 0.0074 | Δ = -0.0002(新最佳)
9 | 0.0072 | Δ = -0.0002(新最佳)
10 | 0.0070 | Δ = -0.0002(新最佳)
11 | 0.0068 | Δ = -0.0002(新最佳)
12 | 0.0066 | Δ = -0.0002(新最佳)
13 | 0.0065 | Δ = -0.0001(新最佳)
14 | 0.0063 | Δ = -0.0002(新最佳)
15 | 0.0062 | Δ = -0.0001(最终)
→ 第 5 轮后收敛(学习率调度生效),持续稳步改进
使用方法
# PyTorch 推理
import torch
from modnet import MODNet
checkpoint = torch.load('photographic/finetune/checkpoints/modnet_bn_best.ckpt')
model = MODNet()
model.load_state_dict(checkpoint)
model.eval()
# 或使用 ONNX 推理(推荐用于部署)
import onnxruntime
sess = onnxruntime.InferenceSession('photographic/finetune/onnx/modnet_bn_best_pureBN.onnx')
1.3 ONNX 模型变体
官方原始版本(Photographic)
文件:photographic/modnet_photographic_portrait_matting.onnx
从官方检查点直接导出的 ONNX
- 来源:作者 Google Drive
- 格式:ONNX opset 11
- 包含:InstanceNormalization 算子
- 输入:[1, 3, 512, 512](float32,[-1, 1] 归一化)
- 输出:[1, 1, 512, 512](float32,[0, 1] 范围)
- 状态:✓ 对比参考
- 注意:InstanceNormalization 在 NPU 上会回退到 CPU,**不推荐用于边缘部署**
折叠变体(Folded Variant,Anti-fusion)
文件:photographic/modnet_photographic_portrait_matting_in_folded.onnx
通过 anti-fusion 方法展开 InstanceNormalization
- 优化者:PotterWhite (potter_white@outlook.com)
- 日期:2026-03-11 16:11
- 方法:将 InstanceNorm 展开为算术原语
- Var(x) = E[x²] − (E[x])²
- 防止 RKNN 编译器重新识别 InstanceNormalization
- 强制在 CPU 上执行(负面效果)
- 状态:⚠️ 实验性,不推荐
- 分析:违背了优化初衷
纯批归一化版本(ONNX 导出)
文件:photographic/finetune/onnx/modnet_bn_best_pureBN.onnx
从 modnet_bn_best.ckpt(微调模型)导出的 ONNX
- 来源:PyTorch 微调训练(第 15 轮)
- 导出日期:2026-03-31 16:15
- 格式:ONNX opset 11
- 架构:纯 BatchNormalization(无 InstanceNorm)
- 输入:[1, 3, 512, 512](float32,[-1, 1] 归一化)
- 输出:[1, 1, 512, 512](float32,[0, 1] 范围)
- 文件大小:25 MB
- 状态:⚠️ 参考用。纯 BN 变体在当前量化/部署路径上仍有数值问题,
**生产部署请用 §1.3.1 官方原版(带 InstanceNorm)**。
技术说明(仅供对比研究):
- 无 InstanceNormalization → 理论上是 NPU 友好
- 全部算子:Conv2d, BatchNorm2d, ReLU 等(硬件友好)
- 但实测在某些量化路径上数值偏移较大,需进一步调试
已测试环境:
- ONNX Runtime 1.16.3(CPU, x86_64)
- ONNX Runtime 1.16.3(aarch64, 模拟环境)
- RKNN 工具链 v2.3.2(编译阶段验证)
验证结果(对比参考)
黄金测试向量(Golden Test Vector):green-fall-girl-point-to.png (1803×1019)
- Python 推理输出:py_08_inference-Output.bin ✓
- C++ 推理输出:cpp_08_inference-Output.bin(待 C++ 构建)
- 预期匹配:像素级 L∞ 误差 < 1e-5(float32 精度)
1.4 目录结构
MODNet/
│
├── README.md ← 当前文件
│
├── [官方模型 - 根目录]
│ ├── mobilenetv2_human_seg.ckpt (备份,非活跃)
│ └── modnet_webcam_portrait_matting.ckpt (参考用,384×384)
│
└── photographic/ ← ★ 活跃部署变体
│
├── README.md (历史文件,已被取代)
│
├── [官方基线]
│ ├── modnet_photographic_portrait_matting.ckpt (1.8 GB)
│ ├── modnet_photographic_portrait_matting.onnx (26 MB, InstanceNorm)
│ └── modnet_photographic_portrait_matting_in_folded.onnx (26 MB, folded)
│
└── finetune/ ← ★ 活跃训练输出
│
├── checkpoints/ (PyTorch 制品)
│ ├── modnet_bn_best.ckpt ★ (1.8 GB, 最佳模型)
│ ├── modnet_bn_epoch_01.ckpt
│ ├── modnet_bn_epoch_02.ckpt
│ ├── ... (epoch 3-14)
│ └── modnet_bn_epoch_15.ckpt
│
├── onnx/ (部署用)
│ └── modnet_bn_best_pureBN.onnx ★ (25 MB, 推荐)
│
├── logs/ (元数据)
│ └── block1_2_training_20260319_154018.log
│
└── output/ (验证可视化)
├── epoch_01_val.png
├── epoch_02_val.png
├── ... (epoch 3-14)
└── epoch_15_val.png
1.5 速查表
| 模型 | 文件 | 大小 | 用途 | 状态 |
|---|---|---|---|---|
| 官方摄影模型 | photographic/modnet_photographic_portrait_matting.ckpt |
1.8 GB | 基线参考 | ✓ 参考 |
| 官方 ONNX | photographic/modnet_photographic_portrait_matting.onnx |
26 MB | InstanceNorm 变体 | ⚠️ 不推荐 |
| 微调最佳模型 | photographic/finetune/checkpoints/modnet_bn_best.ckpt |
1.8 GB | PyTorch 部署 | ✓ 生产 |
| 微调 ONNX | photographic/finetune/onnx/modnet_bn_best_pureBN.onnx |
25 MB | C++/RKNN 部署 | ★ 推荐 |
| 摄像头模型 | modnet_webcam_portrait_matting.ckpt |
1.8 GB | 实时流媒体 | ✓ 可用 |
2. RVM 模型
2.1 ONNX 模型
位于 RobustVideoMatting/onnx/。
| 模型 | 文件 | 大小 | 骨干网络(Backbone) | 深度导向滤波(Deep Guided Filter) | 来源 |
|---|---|---|---|---|---|
| MobileNetV3 FP32 | rvm_mobilenetv3_fp32.onnx |
14.3MB | MobileNetV3 | ✓ | PeterL1n/RobustVideoMatting v1.0.0 |
| MobileNetV3 FP16 | rvm_mobilenetv3_fp16.onnx |
7.2MB | MobileNetV3 | ✓ | FP16 导出 |
| MobileNetV3 FP32 | rvm_mobilenetv3_fp32_no_refiner.onnx |
14.3MB | MobileNetV3 | — | 移除 Deep Guided Filter |
| ResNet50 FP32 | rvm_resnet50_fp32.onnx |
~90MB | ResNet50 | ✓ | PeterL1n v1.0.0 |
| ResNet50 FP16 | rvm_resnet50_fp16.onnx |
~45MB | ResNet50 | ✓ | FP16 导出 |
关键模型属性(MobileNetV3):
- Opset 12,IR version 6,353 个节点
- 零个 InstanceNorm 节点(NPU 友好)
- 6 个输入:
src [1,3,H,W]、r1i~r4i(ConvGRU 状态)、downsample_ratio [1] - 经 ArcFoundry
fold_constant_inputs处理后:5 个输入(downsample_ratio 烘焙为常量)
2.2 RKNN 模型
位于 RobustVideoMatting/rknn/,目标平台 RK3588 / RK3588S。
全部 RKNN 都已应用 no-resize graph surgery(详见 §2.5):refiner 末尾的 2× Resize + Mul/Add/Split/Clip 链已从 NPU 图中移除,由 C++ 后处理端实现 guided-filter 组合 + 上采样。下表不再单独标注 no-resize 变体。
| 模型 | 文件 | 大小 | 分辨率 | 精度 | dsr | 状态 |
|---|---|---|---|---|---|---|
| 1080×1920 FP16 | rvm_mobilenetv3_fp16_1080x1920_0.25-dsr_rk3588s_20260603_rk3588_fp16.rknn |
10.9MB | 1080×1920 | FP16 | 0.25 | 默认 |
| 736×1280 FP16 | rvm_mobilenetv3_fp16_736x1280_0.5-dsr_rk3588s_20260603_rk3588_fp16.rknn |
11.3MB | 736×1280 | FP16 | 0.5 | 较高质量 |
| 736×1280 FP16 | rvm_mobilenetv3_fp16_736x1280_0.25-dsr_rk3588s_20260603_rk3588_fp16.rknn |
9.9MB | 736×1280 | FP16 | 0.25 | — |
| 544×960 FP16 | rvm_mobilenetv3_fp16_544x960_0.5-dsr_rk3588s_20260603_rk3588_fp16.rknn |
10.3MB | 544×960 | FP16 | 0.5 | 中等质量 |
| 544×960 FP16 | rvm_mobilenetv3_fp16_544x960_0.25-dsr_rk3588s_20260603_rk3588_fp16.rknn |
9.5MB | 544×960 | FP16 | 0.25 | — |
| 416×736 FP16 | rvm_mobilenetv3_fp16_416x736_0.5-dsr_rk3588s_20260603_rk3588_fp16.rknn |
9.8MB | 416×736 | FP16 | 0.5 | — |
| 416×736 FP16 | rvm_mobilenetv3_fp16_416x736_0.25-dsr_rk3588s_20260603_rk3588_fp16.rknn |
9.3MB | 416×736 | FP16 | 0.25 | — |
| 320×576 FP16 | rvm_mobilenetv3_fp16_320x576_0.5-dsr_rk3588s_20260603_rk3588_fp16.rknn |
9.5MB | 320×576 | FP16 | 0.5 | — |
| 320×576 FP16 | rvm_mobilenetv3_fp16_320x576_0.25-dsr_rk3588s_20260603_rk3588_fp16.rknn |
9.1MB | 320×576 | FP16 | 0.25 | — |
| 288×512 FP16 | rvm_mobilenetv3_fp16_288x512_0.25-dsr_rk3588s_20260603_rk3588_fp16.rknn |
9.1MB | 288×512 | FP16 | 0.25 | 早期验证 |
| 256×256 FP16 | rvm_mobilenetv3_fp16_256x256_0.25-dsr_rk3588s_20260603_rk3588_fp16.rknn |
8.8MB | 256×256 | FP16 | 0.25 | 早期验证 |
转换工具:ArcFoundry v0.15.0
- 配置目录:
ArcFoundry.git/configs/rvm/ - 目标平台:RK3588 / RK3588S
- 归一化:
mean=[0,0,0], std=[255,255,255](RKNN 运行时执行/255.0)
2.3 质量总结
当前批次(
rk3588s_20260603)的板端 benchmark 正在收集中。 旧的 s14/s20/s21 数据对应的是已下线的rk3588批次,不再适用。
通用预期(基于已知的 RVM 行为规律):
- dsr 越大,质量越好、速度越慢(decoder 工作在
H×dsr × W×dsr分辨率上) - 处理分辨率越大,alpha 边缘越锐利,但 NPU 推理时间近似线性增长
- 1080p 输入 +
dsr=0.25是速度最优档(decoder 工作在 270×480) - 1080p 输入 +
dsr=0.5是质量最优档(decoder 工作在 540×960)—— 当前批次未提供该组合
详细 benchmark 数据待补。
2.4 推荐模型选择
待补。当前批次(
rk3588s_20260603)的 benchmark 数据收集中。 一般规则:质量优先选dsr=0.5中最大处理分辨率(候选:544×960 / 736×1280), 速度优先选1080×1920 / dsr=0.25,低内存选256×256 / dsr=0.25。 选定后填入下表。
| 使用场景 | 推荐模型 | 理由 |
|---|---|---|
| 质量优先 | (待补) | (待补) |
| 速度优先 | (待补) | (待补) |
| 低内存 | (待补) | (待补) |
2.5 Graph Surgery:移除最终的 Resize 及以后的算子
本仓库全部 RKNN 模型都已应用此 graph surgery(见 §2.2 表前的说明)。 原始 RVM ONNX 的 refiner 末尾含 2 个
Resize+ 后续 element-wise 链(Mul、Add、 Split、Clip 等),通过 ArcFoundry 的graph_surgery步骤把这些节点从 NPU 图中 移除,由 C++ 后处理端自行完成 guided-filter 组合 + 上采样。
裁剪点
| 项目 | 数值 |
|---|---|
| 原始 ONNX 总节点数 | 353 |
| 被删除的"尾部"命名算子 | 2× Resize + Mul + Add + Split + Add + 2× Clip(共 8 个) |
graph.cleanup() 级联删除的死节点 |
28 个 |
| 图清理后净减少的节点(实测) | 36 个(353 → 317) |
| 裁剪版图输出 tensor | 777(Conv_316 输出,refiner A,4ch,272×480)、779(Sub_318 输出,refiner b,4ch,272×480),外加 r1o~r4o |
实测算子分类对比
| op_type | 原版 | 裁剪版 | Δ(原版 − 裁剪版) |
|---|---|---|---|
| Constant | 48 | 32 | +16 |
| Shape | 12 | 8 | +4 |
| Slice | 12 | 8 | +4 |
| Concat | 23 | 20 | +3 |
| Add | 16 | 14 | +2 |
| Clip | 2 | 0 | +2 |
| Resize | 7 | 5 | +2 |
| Mul | 47 | 46 | +1 |
| ReduceMean | 2 | 1 | +1 |
| Split | 10 | 9 | +1 |
| 合计 | +36 |
上表只列出发生变化的
op_type(未变的不列出)。
为什么 Constant 减少了 16 个? 因为 graph.cleanup() 会同时清理那些原本只为
被删节点提供常量输入的 Constant 节点;而 Shape/Slice/Concat 的减少则来自
refiner 内 Concat_311 上游、只为已删除 Resize 准备 shape/slice 信息的辅助节点。
为什么 Conv 一颗没少? 裁剪只动 refiner 尾巴(ID 195-202 对应的算子),
refiner 内部产生 A/b 的 Conv 网络(Conv_312/314/316)被保留——它输出的
A(4ch,272×480) + b(4ch,272×480) 是 C++ 后处理 guided-filter 组合的输入。
3. 相关文档
本仓库仅托管模型制品(ckpt / onnx / rknn 文件),不包含训练代码和 C++ 推理代码。
- 训练流程、ONNX 导出、C++ 推理、RKNN 转换等代码均在配套的私有仓库中维护
- 公开可见的模型来源:
- MODNet:作者 Google Drive(ZHKKKe/MODNet)
- RVM:PeterL1n/RobustVideoMatting v1.0.0
- RKNN 转换 pipeline:ArcFoundry(配置文件位于其
configs/rvm/)
附录:训练日志摘要
[Config] Device: cuda
[Config] Epochs: 15, BS: 8, LR: 0.01, Input: 512×512
[Dataset] Loaded 9421 samples (P3M-10k train)
[Model] Total parameters: 6,487,795
[Model] Trainable parameters: 6,487,795
Training Results (15 epochs):
- Epoch 1: Avg Loss 0.5410 → Val L1 0.0264 (new best)
- Epoch 2: Avg Loss 0.3054 → Val L1 0.0175 (new best)
- Epoch 3: Avg Loss 0.2634 → Val L1 0.0121 (new best)
- ...
- Epoch 15: Avg Loss 0.1820 → Val L1 0.0062 (final)
Convergence: ✓ Steady improvement through all 15 epochs
Overfitting: ✓ No significant degradation, clean convergence
文档版本:1.4 最后更新:2026-07-03 by PotterWhite 提交历史:通过 Git commit message 追踪