尧图精选

YOLO26深度估计实战:从原理到RK3588部署

🕒 发布时间:2026/9/2 17:09:18 📁 来源:尧图网络
深度估计Depth Estimation一直是计算机视觉里“有点门槛”的任务。早年做机器人抓取用双目相机要标定、要校正稍一震动两张图就对不齐换深度相机近处反光、户外强光又全是噪声。现在 Ultralytics 把深度估计直接做成了和目标检测、实例分割并列的原生任务意味着同一套 API、同一套训练推理流程可以同时输出检测框和像素级的深度信息。本文围绕 YOLO26 的深度估计新功能展开先解释这个任务解决什么问题再带你从环境安装、快速推理跑到自定义数据集训练最后给出 RK3588 边缘设备和 C 部署的落地思路适合有一定深度学习基础、想把深度信息接入实际项目的开发者。1. 深度估计任务到底是什么1.1 从“识别物体”到“测量距离”普通的目标检测网络输出的是矩形框、类别和置信度它回答的问题是“画面里有什么、在哪里”。而深度估计回答的是另外一个问题画面里每一个像素离相机到底有多远。所谓深度图就是一张和原图尺寸相同的单通道图像每个像素的灰度值代表该点距离相机的远近。近处的物体亮度高远处的物体亮度低为了便于人眼观察工程上经常把深度图映射成伪彩色图像蓝紫色表示远处红黄色表示近处。深度估计根据输入相机的数量可以分为两类多目深度估计输入左右两幅图像利用视差计算深度原理直观但需要严格的双目标定单目深度估计只输入一张普通 RGB 图像直接回归出深度图硬件成本低但算法难度更高因为同一张图在不同尺度下可能对应完全不同的真实距离这就是著名的“尺度模糊”问题。YOLO26 这次新增的内容主要集中在单目深度估计方向。1.2 单目深度估计为什么难很多同学第一次接触深度估计时会想既然有深度相机直接用硬件读距离不就行了真实项目里深度相机确实很常用但在户外强光下结构光容易被环境光干扰在玻璃、水面、透明塑料这类场景深度相机经常直接失效而双目方案对纹理稀疏的白墙和暗光环境几乎没有效果。单目深度估计不需要额外硬件算法本身替代了昂贵的传感器但它有三个主要难点第一尺度不确定。单目图像没有三角测量信息网络通常只能输出“相对深度”也就是估计出远近关系却不一定能给出精确到毫米的真实距离。第二边缘与遮挡。深度在物体边缘处通常发生剧烈跳变检测框可以只给一个粗粒度位置深度估计却要求每个像素都准确这对网络的高频细节恢复能力要求很高。第三材质与光照干扰。低光、反光、透明物体都会导致深度回归结果不稳定这也是行业内一直在攻坚的方向。1.3 常见应用场景深度估计的实际应用非常广凡是需要“知道物体离我多远”的视觉系统几乎都可以用它自动驾驶与辅助驾驶用于前向障碍物测距和可通行区域判断。机器人避障与机械臂抓取让机械臂知道目标在三维空间中的位置。AR/VR 虚实遮挡虚拟物体需要被真实场景中的物体遮挡按深度图合成可以实现较好的遮挡关系。工业质检与体积测量通过深度信息计算目标物体的长宽高。视频监测与安防判断人员、车辆与监控设备的距离辅助异常预警。这些场景以前大多依赖激光雷达或深度相机成本高、安装复杂。如果模型的单目深度估计精度足够可以显著降低整机成本这也是 YOLO26 把深度估计做成内置任务后很多开发者第一时间关注它的原因。1.4 YOLO26 与 Ultralytics 生态的关系YOLO 系列本身是目标检测模型但 Ultralytics 的定位并不仅仅是“YOLO 官方仓库”而是一个统一视觉任务框架。在同一个框架里检测、分割、姿态估计、旋转目标检测、分类已经可以共用数据加载、训练、验证、导出、部署流程。YOLO26 把深度估计引入后框架的使用路径进一步统一模型定义用 YAML训练命令用yolo train推理用YOLO类部署用 ONNX/TensorRT/RKNN整体学习成本比单独维护一套深度估计代码库低很多。2. 环境准备与版本说明2.1 Python 与 GPU 环境在动手之前先确认本机环境。Ultralytics 基于 PyTorch 开发所以 Python 环境建议使用 3.8 及以上版本推荐 3.10 或 3.11GPU 环境需要安装 CUDA 和 cuDNN。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。建议使用 Anaconda 创建一个独立环境避免和已有项目产生依赖冲突conda create -n yolo26 python3.10 -y conda activate yolo26然后安装 PyTorch。PyTorch 的安装命令会根据 CUDA 版本变化建议到 PyTorch 官网选择对应本机 CUDA 版本的命令不要直接复制网上任意一条命令。2.2 安装 Ultralytics深度估计作为新任务强烈建议使用最新版 Ultralytics 源码或最新发布包老版本可能不包含depth任务的定义和训练逻辑pip install ultralytics如果希望使用尚未发布到 PyPI 的最新功能可以从源码安装git clone https://github.com/ultralytics/ultralytics cd ultralytics pip install -e .源码安装的好处是你可以直接查看ultralytics/models或任务相关目录下深度估计的实现也能在需要修改模型结构时快速定位对应文件。2.3 验证安装安装完成后在 Python 中执行import ultralytics ultralytics.checks()正常情况下会输出 Ultralytics 版本号、Python 版本、PyTorch 版本、CUDA 是否可用等信息。如果看到类似“YOLO”和“Ultralytics”的字样且没有报错就说明基础环境没问题。2.4 硬件要求深度估计模型对显存的需求比普通检测要高因为输出是密集的像素级预测图。训练阶段建议至少 8GB 以上显存推理阶段根据模型大小可以在 GPU、CPU 甚至 RK3588 这类边缘 NPU 上运行。如果显存不足可以调小batch、降低输入分辨率或者使用ampTrue混合精度训练来缓解。另外要提醒一点Ultralytics 仓库使用的是 AGPL-3.0 开源协议商用或者集成到闭源项目前需要仔细确认许可证要求必要时联系官方获取商业授权。3. 快速上手用 YOLO26 跑深度估计3.1 命令行推理环境就绪后最直接的验证方式是使用命令行。按照 Ultralytics 的习惯可以用yolo命令指定taskdepth来执行深度估计推理yolo predict taskdepth modelyolo26n-depth.pt source./images/demo.jpg其中taskdepth表示指定任务类型model是权重路径或模型名称source是输入图片路径。模型文件如果本地不存在首次运行时框架会自动下载下载速度取决于网络环境。命令行推理结束后会在当前目录生成runs/segment或runs/predict目录输出可视化结果图。需要特别说明不同版本的模型命名和默认保存路径可能有差异yolo26n-depth.pt是一种示例写法具体文件名以官方发布为准。如果你在某个版本中看到的是yolo26-depth.pt或带其他后缀的权重按实际文件名替换即可。3.2 Python 推理与结果可视化命令行适合快速验证但实际工程里更常用 Python API。把上面的命令改写成 Pythonfrom ultralytics import YOLO # 加载模型 model YOLO(yolo26n-depth.pt) # 推理 results model.predict(sourcedemo.jpg, taskdepth) # 遍历结果 for r in results: # 深度图通常以单通道矩阵形式返回 depth r.depth print(深度图形状:, depth.shape, 数据类型:, depth.dtype) # 保存带深度可视化的结果图 annotated r.plot() import cv2 cv2.imwrite(demo_depth_result.jpg, annotated)这段代码的核心在r.depth。如果你不确定当前版本返回的字段名可以在 Jupyter 或 Python 里先执行print(dir(r))查看结果对象包含哪些属性。不同版本之间字段命名可能略有调整但深度估计输出一般会保留在一个与depth相关的属性中。3.3 把深度矩阵变成可读的伪彩色图模型返回的深度矩阵是浮点类型直接保存成普通图片可能是全黑或全白的因为像素范围没有归一化。为了方便观察可以把它转成伪彩色图import cv2 import numpy as np depth results[0].depth depth_norm cv2.normalize(depth, None, 0, 255, cv2.NORM_MINMAX) depth_uint8 depth_norm.astype(uint8) depth_color cv2.applyColorMap(depth_uint8, cv2.COLORMAP_JET) cv2.imwrite(depth_visualization.png, depth_color)这里使用的cv2.normalize只是把深度值线性拉伸到 0 到 255方便可视化。它改变的是灰度范围并没有改变像素之间的远近关系所以视觉上可以明显看出近处物体偏红、远处物体偏蓝。3.4 批量推理与视频流推理深度估计通常不只处理一张图批量推理和视频流的写法和检测任务几乎一致model YOLO(yolo26n-depth.pt) # 推理整个文件夹 results model.predict(source./test_images, saveTrue, save_txtTrue) # 视频流推理 results model.predict(source0, streamTrue) for r in results: depth r.depth # 在这里做后续业务处理source0表示读取默认摄像头。如果用的是网络摄像头或 RTSP 视频流需要替换成对应的 RTSP 地址并确保你有合法的访问授权不要在未经授权的情况下采集或处理他人视频数据。4. 训练自己的深度估计数据集4.1 数据集结构想要在自己的业务场景里取得好效果只拿预训练权重推理是不够的。建议收集与业务分布相近的 RGB 图像和对应的深度标签整理成以下结构depth_dataset/ ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ └── 0002.jpg │ └── val/ │ ├── 1001.jpg │ └── 1002.jpg └── depths/ ├── train/ │ ├── 0001.png │ └── 0002.png └── val/ ├── 1001.png └── 1002.png这里的images存放 RGB 原图depths存放对应深度图。深度标签通常是 16 位 PNG 或浮点格式的 numpy 文件具体格式取决于数据来源。如果深度标签是通过激光雷达或深度相机采集的还需要做配准、差值填充和单位换算确保与 RGB 图像逐像素对齐。4.2 编写数据集 YAMLUltralytics 的习惯是使用 YAML 文件描述数据集路径和配置深度估计也是类似思路# 文件路径depth_dataset.yaml path: ./depth_dataset train: images/train val: images/val depth: depths/train需要提醒的是depth这个字段名在不同版本的实现中可能不同有些版本可能要求分别指定depth_train和depth_val。建议打开当前版本仓库中的数据集配置文件做对照不要只依赖网上旧文章里的字段。4.3 训练命令数据集准备好之后可以用下面的命令启动训练yolo train taskdepth datadepth_dataset.yaml modelyolo26n-depth.pt epochs100 batch16 imgsz640参数含义taskdepth指定训练深度估计任务。data数据集 YAML 路径。model预训练权重或模型 YAML 路径。若使用预训练权重会加载对应的网络结构并把之前学习到的特征迁移到你的数据上。epochs训练轮数小数据集可以先从 100 轮开始观察验证损失的变化。batch批大小根据显存调整。imgsz输入分辨率分辨率越高细节越好但显存占用也越大。训练过程中终端会输出每个 epoch 的损失值和验证指标。训练结束后会在runs/depth/train目录下保存权重文件和训练曲线可以通过曲线判断模型是否过拟合、学习率是否合适。4.4 在 Ultralytics 中训练 RT-DETR 与修改 YAML 文件很多同学关注 RT-DETR-r18/r34 在 Ultralytics 中的用法这是因为 Ultralytics 本身并不只支持 YOLO 结构它还支持 RT-DETR 这类基于 Transformer 的检测器。在框架内部模型结构通常由 YAML 文件描述更换骨干网络、检测头或尺度分支都可以通过修改 YAML 实现。如果你想把某个自定义结构接入训练第一步是查看官方models目录下已有的 YAML 文件例如 RT-DETR-l 对应的配置。复制一份然后修改其中的 backbone 层、head 层或nc类别数、ch通道数等字段。修改时要注意层与层之间的输入输出通道必须匹配否则会在模型构建阶段直接报错。用修改后的 YAML 启动训练yolo train modelrtdetr-custom.yaml datayour_dataset.yaml epochs200如果你只是想在 Ultralytics 框架里训练默认的 RT-DETR-r18 或 r34也可以直接指定已有权重或配置yolo train modelrtdetr-r18.pt datayour_dataset.yaml epochs200这里的关键不是把 RT-DETR 强行塞进深度估计任务而是理解 Ultralytics 的“模型即配置”思想。平时我们要改进 YOLO26通常也是改 YAML 文件调整注意力模块、增加分支、替换激活函数框架会在解析 YAML 时动态构建网络不需要把整个框架源码都改一遍。4.5 训练效果验证训练完成后用测试图片验证model YOLO(runs/depth/train/weights/best.pt) results model.predict(sourcetest.jpg, taskdepth)如果发现预测深度图边缘发糊可以调大imgsz或增加数据增强里的色彩抖动如果整体深度偏暗先检查深度标签的取值范围和可视化映射不要急着调模型。5. 部署从低光环境到 RK3588 与 C 落地5.1 低光环境下的处理策略深度估计模型在低光环境下效果退化几乎是必然的因为输入图像本身的纹理和对比度都不足。如果你要处理夜间监控或暗光场景可以从三个层面优化。输入层对图像做预处理例如 gamma 校正、CLAHE 对比度增强或者用现有的暗光增强模型先把图像提亮再输入 YOLO26 深度估计模型。数据层在训练集中加入大量低光数据配合亮度扰动、噪声扰动和 ISO 模拟增强让模型见过更接近真实夜间的分布。这个方案比单纯在推理时做图像增强更有效因为模型学会了在低对比度条件下仍保持深度预测稳定。模型层如果硬件允许使用更大的预训练权重并针对低光数据做微调。注意低光增强前后的深度图在尺度上可能有偏差微调后要在验证集上检查一致性。5.2 导出 ONNX 模型部署深度估计模型的第一步一般是将训练好的 PyTorch 权重导出成 ONNX 格式yolo export modelyolo26n-depth.pt formatonnx dynamicTrue导出后再用 Python API 也可以model YOLO(yolo26n-depth.pt) model.export(formatonnx, dynamicTrue, opset12)导出前需要确认环境里安装了onnx和onnxslim否则会提示缺少依赖。dynamicTrue允许动态输入尺寸方便部署时不受固定分辨率限制但在某些推理引擎上会降低优化效果所以如果业务输入尺寸固定可以关闭 dynamic 换取更好的性能。5.3 RK3588 部署流程RK3588 是瑞芯微推出的边缘 SoC内置 6 TOPS 算力的 NPU适合在边缘设备上跑 YOLO26 深度估计这类视觉模型。整体部署流程大概是第一步先导出 ONNX 模型。第二步使用 RKNNToolkit2 把 ONNX 转换为 RKNN 格式。第三步在开发板上用 RKNN Python API 或 C/C API 加载推理。转换命令大致如下python rknn_convert.py --model yolo26n-depth.onnx --target rk3588 --quantize int8具体参数以 RKNN 工具链文档为准。需要特别注意的是NPU 对算子的支持比 GPU 少深度估计任务里的上采样、残差连接和归一化算子在转换时可能提示“算子不支持”。遇到这类问题可以先在 PC 上用 RKNN-Toolkit2 模拟运行找出不支持的计算图节点然后把对应算子改写成 ONNX 支持的等价实现例如把某些自定义上采样替换成 Resize 算子。在实际边缘项目中深度估计的输出通常是单通道浮点矩阵而 RKNN 在 INT8 量化下输出是 uint8 或 int8需要保存量化的 scale 和 zero point推理后再做反量化。这个细节非常容易踩坑很多同学拿到 NPU 输出后没做反量化导致深度图整体偏色。5.4 C 侧推理示例C 部署是工程落地的常用方案这里给出一个基于 ONNX Runtime 和 OpenCV 的核心示例片段用于演示如何加载 YOLO26 深度估计模型并预处理输入图片。#include opencv2/opencv.hpp #include onnxruntime_cxx_api.h #include vector #include string cv::Mat preprocess(const cv::Mat bgr, int input_w, int input_h) { cv::Mat resized; cv::resize(bgr, resized, cv::Size(input_w, input_h)); cv::Mat float_img; resized.convertTo(float_img, CV_32FC3, 1.0 / 255.0); cv::Mat blob cv::dnn::blobFromImage(float_img); return blob; } int main() { Ort::Env env(ORT_LOGGING_LEVEL_WARNING, yolo26-depth); Ort::SessionOptions opts; opts.SetIntraOpNumThreads(4); opts.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); Ort::Session session(env, yolo26n-depth.onnx, opts); std::vectorconst char* input_names {images}; std::vectorconst char* output_names {depth}; cv::Mat image cv::imread(demo.jpg); int input_w 640; int input_h 640; cv::Mat blob preprocess(image, input_w, input_h); Ort::MemoryInfo memory_info Ort::MemoryInfo::CreateCpu( OrtArenaAllocator, OrtMemTypeDefault); std::vectorint64_t input_shape {1, 3, input_h, input_w}; Ort::Value input_tensor Ort::Value::CreateTensorfloat( memory_info, (float*)blob.data, blob.total(), input_shape.data(), input_shape.size()); std::vectorOrt::Value output_tensors session.Run( Ort::RunOptions{nullptr}, input_names.data(), input_tensor, 1, output_names.data(), output_names.size()); // 输出深度图的形状可从 output_tensors[0].GetTensorTypeAndShapeInfo() 获取 // 这里省略张量内存拷贝和反量化逻辑实际工程中需要按模型输出解析 return 0; }这是一个核心思路演示真正工程化时还需要补全输出张量的 shape 解析、内存拷贝、深度图反量化和后处理。C 部署最花时间的往往是模型输入输出的 shape 映射建议先用 Python 脚本打印一次 ONNX 模型的输入输出信息再对照 C 代码修改维度。6. 常见问题与排查思路问题现象常见原因解决思路模型下载很慢或失败网络受限官方权重文件较大使用代理下载后再放到本地路径通过 model 参数指定本地权重推理报错taskdepth未知当前版本较旧不支持深度估计任务升级 Ultralytics 到最新版或从官方源码安装深度图全黑或全白没有做归一化像素范围压缩用 min-max 归一化映射到 0 到 255再做伪彩色深度图与原图尺寸不一致推理输入做了 letterbox 或 resize记录预处理参数后处理时反算到原图尺寸RKNN 转换算子不支持深度估计网络含 NPU 不支持的算子在 ONNX 图中替换算子或分段部署低光场景深度明显变差训练数据缺少低光样本增加夜间数据配合 gamma 校正和数据增强显存不足导致训练中断batch 或 imgsz 过大调小 batch开启 AMP降低输入分辨率相对深度无法换算真实距离单目估计输出普遍是相对尺度使用真实尺度数据微调或结合相机内参和标定物做尺度恢复遇到深度估计相关的报错先不要急着改模型结构。第一步打印输入张量 shape、输出张量 shape 和 dtype确认数据链路是否正常第二步单独用一张已知距离的测试图验证可视化结果第三步检查预处理和后处理是否对称比如训练时做了 letterbox 缩放到 640推理时也必须先把新图片缩放到同样尺寸再输入模型。7. 最佳实践与工程建议7.1 区分相对深度与真实深度单目深度估计模型输出的是相对深度值时无法直接作为标尺使用。工程上如果项目要求精确到米可以采用两种方式一是在训练集中引入真实深度标签并让网络直接回归真实尺度二是在推理后用一个线性映射或多项式映射把相对深度拟合到真实距离前提是你有少量已知距离的标定样本。切忌把归一化后的深度图当作真实距离去做避障或碰撞检测安全隐患非常大。7.2 与检测、分割任务联合使用YOLO26 的另一个优势是任务间可以共享视觉特征。实际项目里常见做法是先用目标检测定位物体再在物体框内读取深度图的统计信息例如框内深度中位数、最小深度或深度方差从而判断物体距离和表面平整度。相比单独跑一个深度估计网络再跑检测复用统一框架能减少部署和维护成本。7.3 相机与多模态融合单目深度估计在透明物体、镜面、纯色墙面等场景可靠性有限。如果系统要求高安全性建议把单目深度估计作为辅助信息与毫米波雷达、激光雷达或超声波传感器配合使用。模型输出的是候选深度传感器数据用于校验和纠正最终决策逻辑里要有深度异常时的降级策略。7.4 推理性能优化性能优化要分阶段做。先确定实际业务的输入分辨率能固定就固定不要使用动态输入尺寸然后开启半精度或 NPU 量化。GPU 场景下优先使用 TensorRT边缘场景下优先使用 RKNN。深度图后处理也要注意瓶颈伪彩色转换和矩阵拷贝在 Python 中很耗时工程上可以只计算感兴趣区域不要在整幅高分辨率图像上做不必要的转换。7.5 工程质量与监控深度估计模型的监控指标不能只看损失。建议在业务侧持续统计深度图的有效率、深度范围分布和异常帧比例例如某段时间所有预测深度都明显偏离历史分布很可能是输入图像被遮挡或镜头脏污这时应该有自动告警。同时模型版本要纳入训练记录管理保留训练数据、验证曲线、权重文件和导出日志方便出现问题后快速回滚。8. 总结与下一步学习方向跑通一次深度估计推理只是起点。建议你把上面的 Python 可视化脚本改造成一个小工具批量给文件夹里的图片生成深度图再挑几张错得离谱的样本分析原因这比直接上手调训练参数更有收获。接下来可以深入看 Ultralytics 仓库中深度估计头的实现细节尝试修改 YAML 替换骨干网络接着把训练好的模型导出 ONNX 和 RKNN在 RK3588 上完成一次完整的边缘部署。掌握这套流程后检测、分割、深度估计在同一个框架下就能真正统一起来后续接手实际视觉项目会顺手很多。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →