☰
MiDaS 深度估计的 TensorFlow 与 ONNX 推理实践:stable-diffusion-webui-forge 中 ZOE 预处理器的模型部署指南
2026/10/2 1:58:46 网站建设 项目流程
  • 人工智能
  • 大模型
  • 媒体生成
  • 本地部署
  • 深度学习

【免费下载链接】stable-diffusion-webui-forge

项目地址:https://gitcode.com/GitHub_Trending/st/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-iinput输入图片目录
--output_path-ooutput输出深度图目录
--model_weights-mmodel-f6b98070.pb模型权重路径
--model_type-tlarge模型类型: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.2

3. 运行推理

将输入图片放入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

项目地址:https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge
点击查看免费下载
上一篇:JetBrains Mono:专为开发者设计的终极编程字体
下一篇:BDInfo工具终极指南:从零开始掌握蓝光分析技术

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询