单目深度估计实战:用 MiDaS 从一张照片还原三维空间的距离信息
单目深度估计实战用 MiDaS 从一张照片还原三维空间的距离信息【免费下载链接】MiDaSCode for robust monocular depth estimation described in Ranftl et. al., Towards Robust Monocular Depth Estimation: Mixing Datasets for Zero-shot Cross-dataset Transfer, TPAMI 2022项目地址: https://gitcode.com/gh_mirrors/mi/MiDaS拿到一张普通照片你能立刻说出画面里每个物体离你多远吗人眼可以但计算机做不到——这正是单目深度估计Monocular Depth Estimation要解决的问题只靠单张 RGB 图像预测出每个像素对应的深度值。Intel 实验室开源的 MiDaS 把这件事做到了开箱即用的水平本文会带你从模型选型、分辨率设置到结果后处理完整跑通一条高清晰度深度图的生成链路并附上实测有效的排坑清单。什么是深度图简单说它是一张和原图同尺寸的灰度图每个像素的亮度代表该点距离相机的远近。有了它二维照片就有了三维空间的结构信息。一个深度值背后藏着什么先理解 MiDaS 在解决什么问题深度估计的传统做法是双目视觉用两台相机拍下同一场景靠左右视差反算距离。MiDaS 走的是更轻的路线——单目即一台相机、一张图。但这带来一个致命问题单张图像本身就存在尺度歧义。同样是一辆车的照片你无法判断它到底是近处的小车还是远处的大卡车。MiDaS 的策略是退一步不做绝对距离只做相对深度近处亮、远处暗把尺度问题交给下游任务处理。它的另一项关键能力是零样本跨数据集迁移Zero-shot Cross-dataset Transfer。模型在多达 12 个数据集上混合训练包括 ReDWeb、DIML、MegaDepth、TartanAir、ApolloScape、KITTI、NYU Depth V2 等覆盖室内、室外、航拍、驾驶等差异极大的场景。训练时多目标优化让它在从未见过的数据集上也能保持稳定表现——这也是它鲁棒robust二字的由来。论文《Towards Robust Monocular Depth Estimation: Mixing Datasets for Zero-shot Cross-dataset Transfer》详细描述了这套方法。先选对模型再谈精度读懂 MiDaS 的模型命名与权衡打开仓库的midas/model_loader.py你会发现内置了 14 种模型类型。命名有规律可循dpt_beit_large_512中dpt表示解码器采用 Dense Prediction Transformer 架构beit是骨干网络特征提取器large是规模512是训练分辨率。看懂这串名字你就知道该选谁。模型类型参数量训练分辨率RTX 3090 推理帧率适合场景dpt_beit_large_512345M512×512约 6 FPS追求极致细节离线处理dpt_swin2_large_384213M384×384约 41 FPS精度与速度均衡dpt_swin2_tiny_25642M256×256约 64 FPS嵌入式设备、实时应用dpt_next_vit_large_38472M384×384约 30 FPS轻量但精度不俗dpt_levit_22451M224×224约 73 FPS手机端、高帧率需求midas_v21_small_25621M256×256约 90 FPS老牌轻量模型CPU 可跑选型时记住一句话显存和帧率是硬约束细节是软需求。BEiT-L-512 比 v3.0 的 DPT-L-384 平均精度提升约 28%代价是帧率只有它的十分之一。如果你的应用是离线的建筑测绘、文物数字化直接上dpt_beit_large_512如果是实时机器人避障dpt_swin2_tiny_256才是正确选择。让网络吃得下你的图分辨率调整的三个关键细节输入一张 4K 照片网络不可能直接处理——编码器对输入尺寸有硬性要求。MiDaS 的分辨率适配逻辑集中在midas/transforms.py的Resize类理解它就能用好--height和--square两个参数。细节一为什么必须是 32 的倍数。Transformer 骨干网络在内部会把图像切成 patch图像块并逐层降采样。如果输入尺寸不是 32 的倍数最后几层的特征图尺寸就无法对齐直接报错。Resize里的constrain_to_multiple_of方法会自动把目标尺寸就近对齐到 32 的倍数你传一个不规范的--height它也不会崩。细节二保持纵横比还是强制方形。Swin、Swin2、LeViT 这类分层骨干只支持方形输入所以仓库里它们默认keep_aspect_ratioFalse图像会被拉伸。而 BEiT、DPT 系列支持任意宽高比默认会尽量保持原图比例。手动指定--square会强制方形——拉伸带来的透视畸变可能让深度出现偏差非必要不建议开。细节三三种缩放策略。Resize支持三种resize_methodminimal缩放幅度最小输出可能略小于目标尺寸lower_bound保证输出至少达到目标尺寸upper_bound保证输出最多不超过目标尺寸。DPT 系模型用minimal老版卷积模型v2.1用upper_bound。这些细节在你自定义推理管线时决定了预处理质量。三条路径跑通第一次推理命令行、摄像头与 Python API路径一命令行批处理最快见效克隆仓库后先按environment.yaml创建环境环境名midas-py310内含 PyTorch 1.13、OpenCV 等依赖然后把模型权重放进weights/目录git clone https://gitcode.com/gh_mirrors/mi/MiDaS cd MiDaS conda env create -f environment.yaml conda activate midas-py310把待处理图片放入input/执行python run.py \ --model_type dpt_beit_large_512 \ --input_path input \ --output_path output结果会写到output/下每张图同时生成 PNG 和 PFM 两种格式。用--height 768可以尝试更高分辨率会提升细节但可能降精度、增显存占用用--grayscale可以输出灰度而非默认的 Inferno 彩色映射。路径二摄像头实时预览不带输入输出路径模型会直接从摄像头抓帧python run.py --model_type dpt_swin2_tiny_256 --side--side让原图和深度图并排显示方便实时对比。在 Intel i7-1185G7 这类 CPU 上搭配 OpenVINO 版模型openvino_midas_v21_small_256实测可跑到约 22 FPS。路径三Python API 自由控制想要自定义预处理或后处理直接调load_model即可它在midas/model_loader.py中返回模型、预处理变换和网络输入尺寸三件套import cv2, torch from midas.model_loader import load_model device torch.device(cuda if torch.cuda.is_available() else cpu) model, transform, net_w, net_h load_model( device, None, dpt_beit_large_512, optimizeTrue ) img cv2.imread(input/photo.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) / 255.0 sample transform({image: img_rgb})[image] with torch.no_grad(): out model.forward(sample.unsqueeze(0).to(device)) depth torch.nn.functional.interpolate( out.unsqueeze(1), sizeimg.shape[:2], # 上采样回原图分辨率 modebicubic, align_cornersFalse, ).squeeze().cpu().numpy()run.py的process函数内部正是这样做的网络输出小尺寸深度图后用双三次插值放大到与原图一致保证每像素一一对应。输出不止一张图PNG、PFM 与 16 位精度utils.py中的write_depth揭示了输出格式的秘密PNG默认走 Inferno 彩色映射适合人眼查看但只有 8 位精度加--grayscale后输出 16 位灰度 PNG适合后续算法处理因为 16 位能保留更细腻的深度层次。PFM浮点格式直接保存推理出的原始相对深度值供科研或二次开发使用不丢失任何信息。如果你要拿深度图做三维重建、点云生成这类严肃用途推荐始终保留 PFM 版本可视化展示再用彩色 PNG。一张排查清单从显存溢出到条纹伪影下面是我在实践中最常遇到的三个问题直接给你可执行的处置顺序显存溢出CUDA out of memory把--height逐档下调例如 512 → 384 → 256每档都是 32 的倍数开启--optimize把模型切到半精度float16显存占用近乎减半仍然溢出就换轻量模型dpt_swin2_tiny_256是最稳妥的兜底。深度图出现条纹或噪点关掉--square恢复原始纵横比检查 PyTorch 版本Transformer 相关 bug 在 1.10 已修复environment.yaml里锁定的 1.13 是安全版本换骨干网络试一次Swin2 对某些场景比 BEiT 更稳。推理速度慢到不可用确认是否误用了 512 分辨率的大模型——它本身就只有个位数 FPS换dpt_levit_224约 73 FPS或 v2.1 小模型CPU 上部署时考虑 OpenVINO 版本模型Intel 平台有明显加速。三个容易被误解的点误区一分辨率越高深度一定越准。实际并非如此。仓库的精度表里BEiT-L-512 在 384 高度推理时误差反而比 512 时更大且不同数据集表现不一。分辨率提高带来的是细节密度不必然带来数值精度提升。先小分辨率验证流程再逐步放大是更稳妥的做法。误区二--optimize对所有模型都安全。run.py里有一句明确的警告Swin 系列模型在半精度下可能产生非有限的深度值。所以 Swin 系慎开半精度BEiT 系则问题不大。误区三MiDaS 输出的深度可以直接当真实距离用。不能。它是相对深度尺度未知。想要绝对距离米制需要像 ZoeDepth 这类在 MiDaS 基础上追加度量深度模块的方案或者自己标定尺度因子。还能往哪走四条延伸路线MiDaS 的价值不止于单机脚本仓库提供了多条落地路径移动端mobile/目录下有完整的 Android 与 iOS 工程内置 TFLite 转换与调用示例把深度估计塞进手机应用并不难机器人ros/目录提供了 ROS1 的 C 与 Python 封装包含 talker/listener 示例可直接接入机器人感知管线模型转换tf/目录包含 ONNX 与 TensorFlow 的转换和推理脚本便于接入其他推理框架实时应用官方仓库中的 LDM3D文本生成图像深度和 ZoeDepth米制深度都建立在 MiDaS 之上说明它已经是被验证过的地基。结尾从第一张深度图开始回顾一下整条路径先根据硬件选型大模型离线、小模型实时再理解分辨率适配的三个细节32 倍数、纵横比、缩放策略然后用命令行或 Python API 跑通第一次推理最后根据输出格式与排查清单持续调优。这套流程走完你就已经掌握了单目深度估计落地的基本功。下一步不妨把 MiDaS 接到你的三维重建或机器人项目里看看一张照片能给你的系统带来多少空间信息。【免费下载链接】MiDaSCode for robust monocular depth estimation described in Ranftl et. al., Towards Robust Monocular Depth Estimation: Mixing Datasets for Zero-shot Cross-dataset Transfer, TPAMI 2022项目地址: https://gitcode.com/gh_mirrors/mi/MiDaS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI 浪潮席卷开发行业,程序员还有必要深耕前端吗?

AI 浪潮席卷开发行业,程序员还有必要深耕前端吗?

2026 年国内大模型落地进入深水区,AI 编程工具全面渗透研发全流程:Cursor、文心快码、Pixso AI 等工具实现设计稿一键转代码、批量生成后台 CRUD 页面、自动排查代码报错;各大互联网企业纷纷调整研发架构,美团合并前后端研发团队&…

2026/10/13 9:03:07 阅读更多 →
Sunshine游戏串流实战:三步把书房电脑变成客厅里的游戏主机

Sunshine游戏串流实战:三步把书房电脑变成客厅里的游戏主机

Sunshine游戏串流实战:三步把书房电脑变成客厅里的游戏主机 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 周五晚上九点,你瘫在客厅沙发上,盯着…

2026/10/11 3:21:45 阅读更多 →
免费开源的按键映射神器:三步让手柄畅玩键鼠游戏,彻底告别改键烦恼

免费开源的按键映射神器:三步让手柄畅玩键鼠游戏,彻底告别改键烦恼

免费开源的按键映射神器:三步让手柄畅玩键鼠游戏,彻底告别改键烦恼 【免费下载链接】QKeyMapper [按键映射工具] QKeyMapper,Qt开发Win10&Win11可用,不修改注册表、不需重新启动系统,可立即生效和停止。支持游戏手…

2026/10/8 10:23:29 阅读更多 →

最新新闻

DCMTK Windows 64位解压即用:环境配置、命令行工具与C++集成实战

DCMTK Windows 64位解压即用:环境配置、命令行工具与C++集成实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:02:58 阅读更多 →
对象存储跨区域复制与生命周期管理叠加使用的避坑指南

对象存储跨区域复制与生命周期管理叠加使用的避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:02:58 阅读更多 →
陕西各级公路SHP文件处理全攻略:从QGIS加载到MapGIS转换

陕西各级公路SHP文件处理全攻略:从QGIS加载到MapGIS转换

简介:《陕西各级公路shp文件》是一份面向GIS学习者、交通规划与城市规划从业者的矢量数据包,完整覆盖陕西省高速公路、一二级公路和三级公路的分级路网,并附带各地级市行政区划边界,适用于ArcGIS、QGIS等常用平台直接加载与空间分…

2026/10/13 9:02:58 阅读更多 →
微信小程序自定义数字键盘设计与实现

微信小程序自定义数字键盘设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:02:58 阅读更多 →
责任链模式在风控评估系统中的工程化实践

责任链模式在风控评估系统中的工程化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:02:58 阅读更多 →
SGI-STL空间配置器源码剖析:两级配置器与内存池设计

SGI-STL空间配置器源码剖析:两级配置器与内存池设计

第一次翻开SGI-STL源码时&#xff0c;大部分人都会在<stl_alloc.h>和<stl_uninitialized.h>面前停下来。这两个文件不像vector、list那样能让你立刻看到数据结构的样子&#xff0c;它们做的是更底层的事&#xff1a;在还没构造任何对象之前&#xff0c;先把裸内存准…

2026/10/13 9:01:55 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →