首页
/ MiDaS深度估计模型run.py文件深度解析与使用指南

MiDaS深度估计模型run.py文件深度解析与使用指南

2025-07-08 04:01:45作者:郦嵘贵Just

概述

MiDaS是一个由Intel ISL开发的单目深度估计模型,能够从单张RGB图像预测场景的深度信息。run.py是该模型的核心执行脚本,负责加载预训练模型、处理输入图像/视频流并生成深度图。本文将深入解析该脚本的工作原理,并指导用户如何正确使用。

核心功能解析

1. 模型处理流程

run.py脚本实现了完整的深度估计流程:

  1. 初始化阶段:加载指定类型的预训练模型,配置计算设备(CPU或CUDA)
  2. 输入处理:读取输入图像或摄像头视频流
  3. 推理阶段:将输入数据送入模型进行深度预测
  4. 后处理:对预测结果进行插值和归一化
  5. 输出阶段:保存或显示深度图结果

2. 关键函数分析

process()函数

这是核心推理函数,负责:

  • 处理不同模型类型的输入格式(常规PyTorch模型或OpenVINO优化模型)
  • 实现半精度浮点优化(当启用optimize参数时)
  • 对输出进行双三次插值以适应原始图像尺寸

create_side_by_side()函数

生成可视化结果,将原始图像与深度图并排显示:

  • 深度图归一化到0-255范围
  • 支持灰度或inferno色彩映射
  • 保持原始图像与深度图尺寸一致

run()主函数

协调整个流程:

  • 初始化模型和转换器
  • 处理输入路径或摄像头流
  • 管理输出路径和格式
  • 控制推理循环

使用指南

1. 基本使用方式

通过命令行参数控制脚本行为:

python run.py -i input_folder -o output_folder -m model_weights.pth -t dpt_large_384

2. 参数详解

参数 说明 可选值
-i/--input_path 输入图像文件夹路径 任意有效路径
-o/--output_path 输出结果保存路径 任意有效路径
-m/--model_weights 模型权重文件路径 预训练权重文件
-t/--model_type 模型类型 dpt_beit_large_512等12种选项
-s/--side 并排显示原始图和深度图 布尔标志
--optimize 启用半精度优化 布尔标志
--height 指定输入高度 整数,如384
--square 强制方形输入 布尔标志
--grayscale 使用灰度色彩映射 布尔标志

3. 模型类型选择

脚本支持多种预训练模型,主要分为几类:

  • DPT系列:基于Transformer架构的大模型,精度高但计算量大
  • MiDaS v2.1系列:传统CNN架构,平衡精度与速度
  • OpenVINO优化模型:针对Intel硬件优化的版本

4. 高级技巧

  1. 半精度优化:在CUDA设备上使用--optimize可提升推理速度,但可能影响某些模型的精度
  2. 输入尺寸控制:通过--height和--square参数可调整输入分辨率
  3. 实时摄像头处理:不指定输入路径时自动启用摄像头采集
  4. PFM格式输出:除了PNG外,还保存高精度的PFM格式深度图

技术细节深入

1. 图像预处理

脚本使用统一的transform处理输入图像:

  • 归一化到0-1范围
  • 应用模型特定的标准化参数
  • 保持或调整长宽比

2. 设备优化

脚本自动检测CUDA可用性,并支持:

  • 通道最后内存格式优化
  • 半精度推理
  • cuDNN加速

3. 视频流处理

当使用摄像头输入时:

  • 实现FPS计算和显示
  • 支持ESC键退出
  • 保持实时性能的同时处理每一帧

常见问题解决方案

  1. 内存不足:尝试使用较小的模型类型或降低输入分辨率
  2. 色彩映射异常:检查--grayscale参数是否符合预期
  3. OpenVINO模型加载失败:确保模型文件与指定类型匹配
  4. 摄像头无法启动:检查摄像头权限和设备索引

性能优化建议

  1. 对于实时应用,推荐使用较小的模型如"midas_v21_small_256"
  2. 在支持CUDA的设备上启用--optimize标志
  3. 批量处理图像时,考虑实现自己的批处理逻辑
  4. 对静态场景,可降低帧率以节省计算资源

扩展应用方向

run.py脚本可作为基础,扩展实现:

  • 3D场景重建
  • 增强现实应用
  • 自动驾驶感知系统
  • 机器人导航与避障

通过深入理解run.py的工作原理,开发者可以更好地利用MiDaS模型进行深度估计任务,并根据实际需求进行定制化开发。