资讯动态

基于 LibTorch 的 MiDaS ROS1 单目深度估计节点:安装、配置与源码解析

发布时间:2026/10/14 20:41:37 来源:尧图企业网站定制
人工智能计算机视觉深度学习【免费下载链接】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点击查看免费下载导读本文围绕仓库 ros/README.md 展开系统讲解如何将 MiDaSTowards Robust Monocular Depth Estimation以 C 形式封装为 ROS1 节点实现从单张 RGB 图像实时估计深度图的完整链路。你将掌握依赖安装ROS Melodic/Noetic LibTorch OpenCV、catkin 工作区构建、节点话题与消息类型约定、核心 C 推理源码的预处理/后处理细节以及如何用自带 talker/listener 脚本完成端到端视频测试并了解移动端轻量模型的精度与推理速度对比数据。一、方案概述为什么用 LibTorch 把 MiDaS 跑在 ROS 上ROSRobot Operating System是机器人领域事实上的软件框架其核心是节点Node之间通过话题Topic异步发布/订阅消息。而 MiDaS 本身是 Python/PyTorch 生态的深度估计网络为了让机器人端的 C 进程能够直接消费相机话题并产出深度话题ros/README.md 提供了一套ROS1 LibTorch C 集成方案输入话题image_topic类型为sensor_msgs/Image编码为RGB8图像尺寸任意输出话题midas_topic类型为sensor_msgs/Image编码为TYPE_32FC1输出逆相对深度图inverse relative depth map数值范围归一化到 [0, 255]尺寸与原图一致、单通道。也就是说任何机器人只要把相机图像以RGB8发布到image_topicmidas_cpp节点就会在midas_topic上吐出可被下游避障、导航算法直接消费的深度图。整个方案基于 C 前端roscppimage_transportcv_bridge与 LibTorch 推理后端torch::jit::load加载 TorchScript 模型组合而成核心实现位于 ros/midas_cpp/src/main.cpp。二、环境要求根据 ros/README.md 第 3-8 行运行本方案需要满足依赖要求操作系统Ubuntu 17.10 / 18.04 / 20.04Debian StretchROS 发行版Ubuntu 17.10/18.04 与 Debian Stretch 使用ROS MelodicUbuntu 20.04 使用ROS Noetic编程语言标准C11实际编译目标为 C14见下文 CMakeLists深度学习推理库LibTorch 1.6文档示例使用 1.7 CUDA 11.0从 ros/midas_cpp/CMakeLists.txt 可以看到可执行目标midas_cpp实际以CXX_STANDARD 14编译链接TORCH_LIBRARIES、OpenCV_LIBS与catkin_LIBRARIES依赖的 catkin 组件包括cv_bridge、image_transport、roscpp、rospy、sensor_msgs、std_msgs与 ros/midas_cpp/package.xml 中声明的 build/exec 依赖一一对应。三、安装依赖3.1 安装 ROS 发行版仓库在 ros/additions/ 下直接提供了两个一键安装脚本无需手写 apt 命令ROS MelodicUbuntu 17.10 / 18.04install_ros_melodic_ubuntu_17_18.shROS NoeticUbuntu 20.04install_ros_noetic_ubuntu_20.sh两者流程一致配置 ROS 软件源与 GPG 密钥 →apt-get install ros-melodic-desktop-full或 noetic 版→ 将source /opt/ros/distro/setup.bash写入~/.bashrc→rosdep init rosdep update→ 安装 rosinstall 相关 Python 包Melodic 脚本用python-*Noetic 脚本用python3-*。在已经联网但尚未安装 ROS 的机器上可以下载脚本到本地执行脚本内容可在仓库内直接阅读# 以 Ubuntu 18.04 Melodic 为例文件位于仓库 ros/additions/ 目录 ./install_ros_melodic_ubuntu_17_18.sh3.2 安装 LibTorchLibTorch 是 PyTorch 的 C 分发版包含torch::jit::load所需的全部头文件与共享库。文档给出两条安装路径路径 AJetsonARM/aarch64——下载官方预编译的torch-1.7.0-cp36-cp36m-linux_aarch64.whl通过 pip 安装此时 Python wheel 会同时安装到系统 torch 路径供 CMake 发现sudo apt-get install python3-pip libopenblas-base libopenmpi-dev pip3 install Cython pip3 install numpy torch-1.7.0-cp36-cp36m-linux_aarch64.whl路径 BLinuxx86_64——下载并解压 CUDA 11.0 配套的 LibTorch 压缩包cd ~/ # 下载 libtorch-cxx11-abi-shared-with-deps-1.7.0cu110.zip 并解压 unzip libtorch-cxx11-abi-shared-with-deps-1.7.0cu110.zip也可以从源码自行编译 LibTorch。解压后目录默认为~/libtorch这正是 CMakeLists.txt 中list(APPEND CMAKE_PREFIX_PATH ~/libtorch)所查找的路径若不存在~/libtorchCMake 会回退到/usr/local/lib/python3.6/dist-packages/torch/lib或/usr/local/lib/python2.7/dist-packages/torch/lib对应 Jetson 通过 pip 安装 wheel 的情况见 CMakeLists.txt。3.3 创建 OpenCV 符号链接Ubuntu 18.04 之后 OpenCV 4 的头文件位于/usr/include/opencv4而部分依赖按/usr/include/opencv查找因此需要sudo ln -s /usr/include/opencv4 /usr/include/opencv3.4 下载 MiDaS 仓库并构建 catkin 工作区source ~/.bashrc cd ~/ mkdir catkin_ws cd catkin_ws # 克隆 MiDaS 仓库含本 ROS 包 git clone https://gitcode.com/gh_mirrors/mi/MiDaS mkdir src cp -r MiDaS/ros/* src chmod x src/additions/*.sh chmod x src/*.sh chmod x src/midas_cpp/scripts/*.py cp src/additions/do_catkin_make.sh ./do_catkin_make.sh ./do_catkin_make.sh ./src/additions/downloads.sh其中 do_catkin_make.sh 完成mkdir src catkin_make source devel/setup.bash的构建动作downloads.sh 负责从 MiDaS v2.1 release 下载 TorchScript 模型model-small-traced.pt并放置到~/.ros/目录midas_cpp节点默认从当前目录加载该模型放在~/.ros便于roslaunch执行时定位。构建成功后midas_cpp可执行文件会被复制到~/catkin_ws/src/midas_cpp见 CMakeLists.txt 的 POST_BUILD 自定义命令rosrun/roslaunch即可直接使用。四、核心实现解析从 sensor_msgs 图像到深度图ros/midas_cpp/src/main.cpp 是全部推理逻辑所在整体是一个 ROS 节点类Midas其main函数用匿名节点名初始化后调用ros::spin()进入事件循环main.cpp。整个处理流水线可以拆成五步。4.1 参数读取与模型加载构造函数中通过ros::param::param读取私有命名空间参数并给出默认值main.cpp参数默认值作用~input_topicimage_topic订阅的输入图像话题~output_topicmidas_topic发布的深度图话题~model_namemodel-small-traced.ptTorchScript 模型文件名~out_orig_sizetrue是否将深度图恢复为原始输入尺寸~net_width256网络输入宽度~net_height256网络输入高度模型加载使用torch::jit::load(model_name)随后module.eval()、关闭 profiling 并启用图执行器优化若torch::hasCUDA()为真则开启 cuDNN benchmark 并把模型、mean/std 移到 CUDA 设备main.cpp。用于归一化的 ImageNet 统计量mean {0.485, 0.456, 0.406}、std {0.229, 0.224, 0.225}在代码中显式定义与仓库根目录 transforms.py 中 Python 版预处理保持一致。4.2 订阅回调与预处理imageCb是核心回调main.cpp。流程为cv_bridge::toCvCopy(msg, RGB8)将sensor_msgs/Image转为cv::MatToTensor通过torch::from_blob零拷贝包装cv::Mat数据为at::Tensormain.cpp转到推理设备转kFloat做HWC - CHW的permute({2,0,1})unsqueeze(0)增加 batch 维再用at::upsample_bilinear2d缩放到net_height × net_width归一化div(255).sub(mean).div(std)main.cpp最后转回NCHW布局。4.3 前向推理将预处理后的张量包装为std::vectortorch::jit::IValue后调用module.forward(input_to_net).toTensor()得到原始深度 logitsmain.cpp。4.4 后处理min-max 归一化到 [0, 255]网络输出的是相对深度相对尺度的逆深度需要逐帧归一化才能可视化。代码先扫描net_width * net_height个元素求出全局 min/max然后执行output output.sub(min_val).div(range_val).mul(255.0F).clamp(0, 255).to(torch::kF32);即(x - min) / (max - min) * 255并截断到 [0, 255]得到逆相对深度图main.cpp。若out_orig_size为真再用upsample_bilinear2d把深度图恢复到原始输入分辨率main.cpp。4.5 发布深度话题ToCvImage将output以CV_32FC1类型包装为cv::Matmain.cpp再经cv_bridge::CvImage(header, TYPE_32FC1, cv_img).toImageMsg()转为sensor_msgs/Image发布main.cpp。注意输出编码是TYPE_32FC1单通道 32 位浮点因此下游节点可以直接读取浮点深度值而不是被量化后的 8 位灰度。五、启动与运行5.1 单独运行 midas 节点仓库提供了现成的启动脚本 launch_midas_cpp.shsource ~/catkin_ws/devel/setup.bash roslaunch midas_cpp midas_cpp.launch model_name:model-small-traced.pt input_topic:image_topic output_topic:midas_topic out_orig_size:true直接执行~/catkin_ws/src/launch_midas_cpp.sh即可。5.2 launch 文件与全部可调参数ros/midas_cpp/launch/midas_cpp.launch 定义了完整的参数面均可通过roslaunch命令行覆盖arg默认值说明input_topicimage_topic输入 RGB 图像话题output_topicmidas_topic输出深度话题model_namemodel-small-traced.pt模型文件名out_orig_sizetrue深度图是否恢复原图尺寸net_width256网络输入宽net_height256网络输入高loggingfalse日志开关节点以outputlog和respawntrue启动即日志落盘、节点崩溃自动重启。例如切换输入话题roslaunch midas_cpp midas_cpp.launch input_topic:/camera/rgb/image_raw5.3 测试视频推流 双窗口回显仓库自带一套 talker/listener 测试脚本用于验证端到端链路。步骤将任意test.mp4视频放到~/catkin_ws/src/目录下一个终端运行 midas 节点~/catkin_ws/src/launch_midas_cpp.sh另一个终端执行cd ~/catkin_ws/src ./run_talker_listener_test.sh等待约 30 秒。run_talker_listener_test.sh 会依次拉起roscore、talker.py、listener_original.py和listener.py四个进程talker.py用 OpenCVVideoCapture读取test.mp4可通过~use_camera参数切换为摄像头以 30Hz 经cv_bridge转成bgr8的sensor_msgs/Image发布到image_topiclistener_original.py订阅image_topic在video_show_orig窗口显示原始视频listener.py订阅midas_topic在video_show窗口显示深度结果并支持~show_output/~save_output/~output_video_file参数把结果保存为result.mp4XVID 编码25FPS。midas_talker_listener.launchros/midas_cpp/launch/midas_talker_listener.launch将三个 Python 节点整合为一个 launch同样支持use_camera、input_video_file、show_output、save_output、output_video_file参数便于一键启动整条测试链路。兼容性说明脚本默认 shebang 为python3talker.py、listener.py。若需在纯 Python 2 的 ROS Melodic 环境运行可执行文档给出的替换命令sed -i s/python3/python2/ ~/catkin_ws/src/midas_cpp/scripts/*.py。六、移动端轻量模型精度与推理速度除桌面端外仓库同时整理了适用于移动端的两个轻量模型对应mobile/目录下的 Android/iOS 示例其关键规格为MiDaS v2 smallResNet50 主干 默认解码器输入 384×384MiDaS v2.1 smallEfficientNet-Lite3 主干 小解码器输入 256×256。Zero-shot 误差越低越好评估数据集均未参与训练或微调模型DIW WHDREth3d AbsRelSintel AbsRelKitti δ1.25NyuDepthV2 δ1.25TUM δ1.25MiDaS v2 small 384×3840.12480.15500.330021.8115.7317.00MiDaS v2.1 small 256×2560.13440.13440.337029.2713.4314.53相对提升-8%13%-2%-34%15%15%推理速度排除前后处理batch1FPS 越高越好模型Jetson Nano, FPSRTX 2080Ti, FPSMiDaS v2 small 384×3841.6117MiDaS v2.1 small 256×2568.1232加速比5×2×可以看到v2.1 small 以 256×256 输入换来 5 倍Jetson Nano/ 2 倍RTX 2080Ti的速度提升这正是 ROS 节点默认net_width/net_height 256时使用model-small-traced.pt的原因——在机器人边缘设备上兼顾实时性与精度。以上数据为仓库 ros/README.md 中记录的结果具体数值会因硬件、驱动与预处理方式而波动。七、引用本方案使用的 MiDaS 模型对应论文Towards Robust Monocular Depth Estimation: Mixing Datasets for Zero-shot Cross-dataset Transfer René Ranftl, Katrin Lasinger, David Hafner, Konrad Schindler, Vladlen Koltun如使用本代码或模型请按 ros/README.md 中的 BibTeX 条目引用article{Ranftl2020, 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}, }八、进一步阅读节点 C 实现ros/midas_cpp/src/main.cpplaunch 参数定义ros/midas_cpp/launch/midas_cpp.launch、ros/midas_cpp/launch/midas_talker_listener.launch构建配置ros/midas_cpp/CMakeLists.txt、ros/midas_cpp/package.xml一键脚本ros/additions/install_ros_melodic_ubuntu_17_18.sh、ros/additions/install_ros_noetic_ubuntu_20.sh、ros/additions/do_catkin_make.sh、ros/additions/downloads.sh测试脚本ros/run_talker_listener_test.sh、ros/midas_cpp/scripts/talker.py、ros/midas_cpp/scripts/listener.py、ros/midas_cpp/scripts/listener_original.py仓库根目录下的 Python 推理入口与预处理run.py、midas/transforms.py、midas/model_loader.py赞分享人工智能计算机视觉深度学习【免费下载链接】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点击查看免费下载相关推荐sd-webui-controlnet 内嵌 MiDaS 的 ROS1 部署指南基于 LibTorch 的 C 单目深度估计节点实战sd webui controlnet 内嵌 MiDaS 的 ROS1 部署指南基于 LibTorch 的 C 单目深度估计节点实战 导读 本指南围绕 s人工智能媒体生成计算机视觉深度学习在 ROS1 中集成 MiDaS 单目深度估计基于 LibTorch 的 C 节点构建与端到端测试指南在 ROS1 中集成 MiDaS 单目深度估计基于 LibTorch 的 C 节点构建与端到端测试指南 MiDaS 是一种从单张 RGB 图像计算相对深度人工智能大模型媒体生成本地部署深度学习MiDaS Android 端源码解析基于 TensorFlow Lite 的移动端单目深度估计实现指南MiDaS Android 端源码解析基于 TensorFlow Lite 的移动端单目深度估计实现指南 本文以 mobile/android/EXPLORE人工智能计算机视觉深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑