- 人工智能
- 大模型
- 媒体生成
- 本地部署
- 深度学习
【免费下载链接】stable-diffusion-webui-forge
本篇技术指南聚焦 MiDaS(Towards Robust Monocular Depth Estimation)模型在 TensorFlow 与 ONNX Runtime 两种框架下的推理部署流程,并结合 stable-diffusion-webui-forge 仓库中 ZOE 深度估计预处理器对 MiDaS 基座的集成方式展开说明。读完本文后,你将掌握.pb与.onnx格式模型的下载、依赖安装、批处理推理、输出解读,以及如何从 PyTorch 权重制作 ONNX 模型的完整操作链路。
背景:MiDaS 与 Forge 中的 ZOE 预处理器
MiDaS 是一个单目深度估计模型,其核心论文提出通过混合多达 12 个数据集(ReDWeb、DIML、Movies、MegaDepth、WSVD、TartanAir、HRWSI、ApolloScape、BlendedMVS、IRS、KITTI、NYU Depth V2)进行多目标优化训练,从而获得零样本跨数据集迁移能力。在 stable-diffusion-webui-forge 中,MiDaS 作为深度估计基座被集成进 ZOE 预处理器:仓库中的 ZOE 检测器实现 加载 ZoeDepth 模型,并对输入图像执行ZoeDepth.build_from_config推理后,输出经过百分位裁剪与反转的深度图(vmin = np.percentile(depth, 2)、vmax = np.percentile(depth, 85)),最终以 8bit 灰度图形式提供给 ControlNet 等下游使用。而 MiDaS 官方仓库的tf/目录(即本文关联文档所在目录 midas_repo/tf)则提供了脱离 PyTorch、仅依赖 TensorFlow 或 ONNX Runtime 的轻量推理路径,适合嵌入式、服务端或需要最小化依赖的场景。
一、使用 TensorFlow 运行.pb模型推理
1. 下载模型权重
从 MiDaS v2.1 发布版本获取两个 Frozen Graph 权重文件,并将其放入tf/目录:
model-f6b98070.pb:large 模型(输入分辨率 384×384)model-small.pb:small 模型(输入分辨率 256×256)
在仓库中对应目录为 extensions-builtin/forge_legacy_preprocessors/annotator/zoe/zoedepth/models/base_models/midas_repo/tf。
2. 安装依赖
# 安装 OpenCV pip install --upgrade pip pip install opencv-python # 安装 TensorFlow pip install -I grpcio tensorflow==2.3.0 tensorflow-addons==0.11.2 numpy==1.18.0注意:-I表示忽略已安装的依赖、强制重新安装指定版本。文档声明该环境基于 Python 3.6.9、TensorFlow 2.2.0、TensorFlow-addons 0.8.3、OpenCV 4.3.0 验证,请根据实际运行环境评估版本兼容性。
3. 运行推理
将一张或多张输入图片放入tf/input目录,然后执行:
python tf/run_pb.py运行 small 模型:
python tf/run_pb.py --model_weights model-small.pb --model_type small推理得到的逆深度图(inverse depth maps)会写入tf/output目录。
4. 源码视角:run_pb.py 的完整参数与执行流程
run_pb.py 定义了 4 个命令行参数:
| 参数 | 缩写 | 默认值 | 说明 |
|---|---|---|---|
--input_path | -i | input | 输入图片目录 |
--output_path | -o | output | 输出深度图目录 |
--model_weights | -m | model-f6b98070.pb | 模型权重路径 |
--model_type | -t | large | 模型类型:large(384×384)或small(256×256) |
核心执行逻辑包括:
- GPU 显存约束:启动时通过
tf.config.experimental.set_virtual_device_configuration将每块 GPU 的显存上限设置为 4000 MB,避免推理阶段显存溢出(相关行已被注释保留,可按需恢复set_memory_growth)。 - 网络分辨率选择:
model_type == "large"时网络宽高为 384×384,small时为 256×256;其他取值直接断言失败并提示use: --model_type large。 - 图加载与节点定位:使用
tf.compat.v1.GraphDef解析.pb文件,并通过tf.import_graph_def(graph_def, name='')导入默认图;输入节点固定为'0:0',输出层取图中最后一个操作节点model_operations[len(model_operations) - 1].name + ':0'——这意味着模型输出张量名是动态探测而非硬编码的。 - 预处理流水线:
Resize(384, 384, resize_target=None, keep_aspect_ratio=False, ensure_multiple_of=32, resize_method="upper_bound", image_interpolation_method=cv2.INTER_CUBIC)与PrepareForNet()组合,将图像缩放到网络所需尺寸并转为NCHW连续内存的 float32 张量。 - 后处理与写盘:
prediction.reshape(net_h, net_w)后,通过cv2.resize双三次插值恢复到原始图像尺寸,最终调用utils.write_depth(filename, prediction, bits=2)输出。
5. 预处理与输出格式的实现细节
transforms.py 提供了三个可复用的预处理类:
- Resize:核心参数
resize_method支持三种策略——lower_bound(输出至少不小于给定尺寸)、upper_bound(输出至多不超过给定尺寸)、minimal(尽可能少缩放);ensure_multiple_of保证输出宽高是 32 的倍数;keep_aspect_ratio=False时直接拉伸为方形输入。 - NormalizeImage:执行
(image - mean) / std标准化。 - PrepareForNet:将 HWC 图像转置为 CHW,并调用
np.ascontiguousarray保证内存连续,同时将 mask、disparity、depth 等附加字段统一转为 float32。
utils.py 中read_image将 BGR 图像转为 RGB 并归一化到 0–1;write_depth则同时写出两份结果:
.pfm:以 float32 保存的原始浮点深度(write_pfm实现,支持彩色PF与灰度Pf头)。.png:将深度线性映射到0 ~ 2^(8*bits)-1后写入;bits=1输出 uint8(256 级),bits=2输出 uint16(65536 级),用于保留更高的深度精度。
二、使用 ONNX Runtime 运行.onnx模型推理
1. 下载模型权重
从 MiDaS v2.1 发布版本获取 ONNX 权重文件并放入tf/目录:
model-f6b98070.onnx:large 模型model-small.onnx:small 模型
2. 安装依赖
# 安装 OpenCV pip install --upgrade pip pip install opencv-python # 安装 ONNX pip install onnx==1.7.0 # 安装 ONNX Runtime pip install onnxruntime==1.5.23. 运行推理
将输入图片放入tf/input后执行:
python tf/run_onnx.py运行 small 模型:
python tf/run_onnx.py --model_weights model-small.onnx --model_type small输出同样写入tf/output目录。
4. 源码视角:run_onnx.py 的差异点
run_onnx.py 与run_pb.py的参数接口完全一致,但推理后端不同:
- 会话创建:通过
rt.InferenceSession(model_path)加载模型,输入输出张量名由model.get_inputs()[0].name与model.get_outputs()[0].name动态获取。 - 设备选择:源码中默认
device = "CUDA:0"("CPU"一行被注释保留),可在代码中切换为纯 CPU 推理。 - 张量喂入:
model.run([output_name], {input_name: img_input.reshape(1, 3, net_h, net_w).astype(np.float32)}),显式将预处理后的图像构造成 NCHW 的 float32 批次输入。 - 输出处理:
np.array(output).reshape(net_h, net_w)后同样双三次插值恢复原尺寸,并以bits=2写入.pfm与 uint16 的.png。
ONNX 路径的显著优势在于无需完整 TensorFlow 运行库,仅依赖onnxruntime即可在 CPU 或 GPU 上完成推理,特别适合服务端部署与资源受限环境。
三、从 PyTorch 权重制作 ONNX 模型
如果手头只有 PyTorch 权重,可以通过 make_onnx_model.py 转换得到 ONNX 文件。
1. 下载模型权重
从 MiDaS v2.1 发布版本获取model-f6b98070.pt,放入 MiDaS 仓库根目录(make_onnx_model.py中MODEL_PATH = "../model-f6b98070.pt"即指向该位置)。
2. 安装依赖
# 安装 OpenCV pip install --upgrade pip pip install opencv-python # 安装 PyTorch 与 TorchVision pip install -I torch==1.7.0 torchvision==0.8.0 # 安装 TensorFlow pip install -I grpcio tensorflow==2.3.0 tensorflow-addons==0.11.2 numpy==1.18.0 # 安装 ONNX pip install onnx==1.7.0 # 安装 ONNX-TensorFlow(用于后续 TensorFlow 前端解析 ONNX 图) git clone https://github.com/onnx/onnx-tensorflow.git cd onnx-tensorflow git checkout 095b51b88e35c4001d70f15f80f31014b592b81e pip install -e .3. 运行转换
python tf/make_onnx_model.py转换生成的model-f6b98070.onnx文件会写入tf/目录,可直接用于上文 ONNX Runtime 推理流程。
4. 源码视角:转换脚本的关键机制
make_onnx_model.py 的实现值得注意:
- 临时源码修补:
modify_file()会先备份midas/blocks.py为.bak,然后执行三处字符串替换——将align_corners=True改为align_corners=False、为文件追加import torchvision.models as models、将torch.hub.load("facebookresearch/WSL-Images", "resnext101_32x8d_wsl")替换为models.resnext101_32x8d()(避免转换时在线下载主干网络权重)。导入midas.midas_net.MidasNet后再由restore_file()还原文件。 - 归一化封装:自定义
MidasNet_preprocessing(MidasNet)子类,在forward中先用 ImageNet 均值/方差([0.485, 0.456, 0.406] / [0.229, 0.224, 0.225])对输入做 in-place 归一化,再调用父类前向,从而把归一化步骤冻结进 ONNX 图内。 - 导出配置:以全零的
(3, 384, 384)float32 张量作为示例输入,在torch.no_grad()下执行一次前向并做 bicubic 上采样验证,随后通过torch.onnx.export(model, sample, <name>.onnx, opset_version=9)导出;输出文件名由ntpath.basename(model_path).rsplit('.', 1)[0] + '.onnx'推导。
四、运行环境与版本要求
关联文档明确给出了验证环境(该 tf/ 目录代码在以下组合下测试通过,请以此作为版本兼容性的参考基线):
- Python 3.6.9
- PyTorch 1.5.1
- TensorFlow 2.2.0(依赖安装命令中为 2.3.0,两者均为 v2.1 时代的 TensorFlow 2.x)
- TensorFlow-addons 0.8.3
- ONNX 1.7.0
- ONNX-TensorFlow(GitHub master,2020-07-17 提交)
- OpenCV 4.3.0
需要注意的是,仓库的 midas_repo 根 README 已演进到 MiDaS 3.x(dpt_beit_large_512、dpt_swin2_large_384、dpt_swin2_tiny_256、dpt_levit_224等 Transformer 系模型),而本文讨论的tf/目录对应的是 MiDaS 2.1 时代遗留的卷积模型导出与跨框架推理方案,适合需要最小化运行时依赖或对接 TF/ONNX 生态的场景。
五、引用与许可
若在论文或产品中使用本代码或任一模型,请引用 MiDaS 原始论文:
@article{Ranftl2019, author = {Ren\'{e} Ranftl and Katrin Lasinger and David Hafner and Konrad Schindler and Vladlen Koltun}, title = {Towards Robust Monocular Depth Estimation: Mixing Datasets for Zero-shot Cross-dataset Transfer}, journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI)}, year = {2020}, }该 MiDaS 仓库副本以 MIT License 分发(参见 midas_repo/LICENSE),可在遵守协议的前提下自由使用与修改。
小结
本文完整覆盖了 MiDaS 在 TensorFlow(.pb)与 ONNX Runtime(.onnx)两条推理链路的部署实践:权重获取、依赖安装、批处理命令、命令行参数与输出格式,并深入源码解析了run_pb.py、run_onnx.py、make_onnx_model.py及配套的transforms.py、utils.py实现。在 stable-diffusion-webui-forge 中,这一 MiDaS 基座进一步被 ZOE 预处理器 复用并扩展为深度图生成能力,理解 TF/ONNX 推理路径有助于在脱离 PyTorch 的环境下快速验证深度估计质量或服务化部署深度预处理服务。
- 人工智能
- 大模型
- 媒体生成
- 本地部署
- 深度学习
【免费下载链接】stable-diffusion-webui-forge
相关推荐
sd-webui-controlnet 中的 MiDaS 单目深度估计:.pb 与 ONNX 模型的 TensorFlow/ONNX-Runtime 推理与转换实战
sd webui controlnet 中的 MiDaS 单目深度估计:.pb 与 ONNX 模型的 TensorFlow/ONNX Runtime 推理与转换
人工智能媒体生成计算机视觉深度学习spring-rest-service-oauth源码分析:OAuth2认证流程的底层实现原理
spring rest service oauth源码分析:OAuth2认证流程的底层实现原理 spring rest service oauth是一个基于Sp
后端如何快速掌握Stable Diffusion WebUI Forge:从安装到实践的完整指南
如何快速掌握Stable Diffusion WebUI Forge:从安装到实践的完整指南 Stable Diffusion WebUI Forge是一款功能
人工智能大模型媒体生成本地部署深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考