ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

YOLO26深度估计实战:从单目相机到像素级距离感知

2026/9/2 16:23:39 拓冰建站 浏览量
YOLO26深度估计实战:从单目相机到像素级距离感知 YOLO26 这次的更新重点不只是“检测更快”或者“模型精度更高”而是把深度估计任务直接纳入了 Ultralytics 的统一工作流。过去我们要做单目深度估计需要单独找模型、单独写推理脚本、单独搭服务现在从训练、验证、推理到导出都能沿用 YOLO 那套 API。对于做机器人感知、辅助驾驶、AR 空间计算、工业视觉的朋友来说这等于少搭一条链路。看到这次更新的你最该关注四个点部署门槛、模型权重、批量推理和任务衔接。深度估计功能并不是把检测结果“换个颜色”那么简单它解决的是“画面里每个像素离我有多远”这个问题。和两个相机做立体匹配不同这类方法通常用单个相机的 RGB 图像直接预测深度带来的好处是传感器简单、标定成本低坏处是绝对尺度不一定准确。理解这一点对你的场景选型和效果评估非常重要。这篇文章会从核心能力、使用场景、环境准备、安装启动、功能测试、接口 API、性能观察和排错清单几个部分展开。你可以把它当作一张 YOLO26 深度估计功能的“验收流程表”跟着走一遍很快能判断这个功能在你的硬件上能不能用、效果够不够用。1. YOLO26 深度估计核心能力速览能力项说明任务类型单目深度估计输入单张 RGB 图像输出深度信息或深度图所属框架Ultralytics YOLO 生态与目标检测、实例分割共用一套 Python API 与 CLI输入形式单张图片、目录、视频文件、视频流输出形式深度估计可视化结果、深度数据以及可接入后续任务的推理结果启动方式Python 调用 / yolo 命令行接口能力通过 Python 调用本地推理可通过导出中间格式接 REST 服务或边缘部署批量任务支持目录批量推理适合线下数据回灌和批量处理推荐硬件常规 NVIDIA GPU 可入门边缘设备Jetson、RK3588 等可作为部署目标显存占用与模型规模、输入分辨率、批量大小有关需实测确认CPU 支持从框架惯例看可用 CPU 推理速度较慢适合功能验证部署表达可导出 ONNX、TensorRT也可转换到 RKNN 等边缘工具链这张表里我特意把“部署表达”放在最后。很多时候一个算法能不能在真实业务中活下来不完全取决于推理精度而是取决于它能不能从 Python 环境迁到 C 服务或者能不能跑到手机、开发板这类资源受限设备上。YOLO26 深度估计能复用整套导出链路这是它值得单独写一篇的原因。需要说明一点深度估计任务是 YOLO26 版本引入的扩展能力实际模型结构、权重名称、接口字段都应以官方发布为准。下面的步骤我会给出通用可执行的流程你只需要把模型名和路径替换成你下载到的真实权重即可。2. 深度估计的适用场景与使用边界2.1 适合解决的场景深度估计在工程上的价值很直接让软件理解“三维世界”。第一类是机器人导航与避障。机器人有了深度信息才能在规划路径时判断前方障碍物距离而不是只看得到“前面有一团东西”。第二类是辅助驾驶和低速车辆。比如低速泊车、园区无人物流在毫米波雷达或激光雷达还没上车的阶段用深度估计做低成本的环境感知补充。第三类是 AR/VR 空间计算。把虚拟物体按照真实场景的远近关系摆放就需要深度信息。第四类是工业视觉中的堆叠检测、抓取位姿估算、货架深度判断。第五类是低光环境下的目标前后景判断。普通 RGB 相机在晚上画面容易过暗目标检测容易把背景误判成目标如果同时拿到深度趋势就可以把“远方背景”和“近处物体”分开减少误检。2.2 不适合的场景首先是高精度测量。单目深度估计给出的通常是相对深度缺少可靠的真实尺度直接拿去做毫米级测量误差会很大。其次是复杂大范围三维重建。单张图像能提供的信息有限做大场景重建还是要靠多视角几何或者激光雷达。再次是无照明的全黑环境。没有可见光输入单目 RGB 方法就无法工作这时需要考虑红外相机或 ToF 传感器。最后是安全级别极高的自动驾驶主传感器。深度估计可以作为辅助但不能替代经过标定的雷达传感器更不能在没有冗余的情况下作为唯一判断依据。2.3 使用边界与合规提醒深度估计本身属于计算机视觉任务但它涉及的场景有明确合规要求。如果你把深度估计用在驾驶辅助、机器人自主决策、公共区域人流分析等场景必须遵守相关的交通安全、隐私保护和数据合规要求。不能因为“这只是个视觉算法”就忽略授权问题。用于训练或测试的图片、视频也要确认来源是否有版权和肖像授权。特别是涉及人脸、车牌、住宅小区或受限区域时要先做脱敏处理。在商用流程里建议把“敏感数据不出本地”作为默认策略尽量在自有服务器或边缘设备上完成推理不把原始视频上传到不可控的外部服务。3. 环境准备与前置条件3.1 基础环境清单下面这份清单是很多 Ultralytics 用户的通行选择。你的具体版本不必一字不差但需要保持兼容。操作系统Windows 10/11、Ubuntu 20.04/22.04 均可Python建议 3.9 或 3.10PyTorch建议根据显卡和 CUDA 版本安装CUDA如果使用 NVIDIA GPU建议安装与 PyTorch 对应的 CUDA磁盘空间至少预留 5GB 给 Python 环境、依赖库和测试图片GPU 显卡拥有 4GB 及以上显存的 NVIDIA 显卡可以入门网络首次运行需要下载模型权重建议提前准备稳定网络3.2 确认本机环境建议在终端里先执行三条命令确认环境没问题再继续。python --version nvidia-smi python -c import torch; print(torch.cuda.is_available())如果nvidia-smi能显示显卡信息但 PyTorch 检测不到 CUDA通常说明 PyTorch 安装时没有选择对应的 CUDA 版本。卸载后从 PyTorch 官网复制正确的安装命令即可。3.3 创建独立虚拟环境新建一个干净的环境能避免不同项目互相干扰。python -m venv yolo26_depth_env source yolo26_depth_env/bin/activate # Windows 下使用 yolo26_depth_env\Scripts\activate3.4 边缘设备准备说明如果你最终打算把 YOLO26 深度估计部署到 RK3588 这类边缘 NPU 设备上环境准备还需要加上目标平台的交叉编译工具链或 RKNN 工具链。这里先不做具体命令展开等模型导出成功后再按目标平台的文档做转换即可。4. 安装、模型获取与启动4.1 安装 Ultralyticspip install -U ultralytics如果网络慢可以换成镜像pip install -U ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后最好做一次环境自检。import ultralytics ultralytics.checks()从框架惯例看ultralytics.checks()会输出当前版本、Python 版本、PyTorch/CUDA 状态和 GPU 信息。这里看到的信息可以帮助你在后续排查时快速定位问题。4.2 获取 YOLO26 深度估计权重模型权重文件一般会随官方发布或模型库提供。你可以把它放在项目目录下的weights/文件夹中便于管理yolo26_depth_project/ ├── weights/ │ └── yolo26-depth.pt ├── inputs/ │ └── test.jpg └── outputs/代码中用本地路径加载模型from ultralytics import YOLO model YOLO(weights/yolo26-depth.pt)需要注意yolo26-depth.pt是一个示例文件名。实际文件名可能是yolo26-depth.pt也可能是其他命名请以你下载到的文件为准。加载模型后可以打印模型信息确认任务类型是深度估计而不是默认检测。print(model.task)4.3 第一次启动推理用一张图片快速跑通流程results model.predict(sourceinputs/test.jpg, saveTrue, imgsz640)运行结束后控制台会打印推理耗时、输入分辨率和保存路径。第一次运行时如果模型权重不存在Ultralytics 会尝试联网下载。这时候要保证网络畅通否则会卡在下载阶段。4.4 启动结果说明Ultralytics 这类框架通常会为每次运行自动创建runs/目录并把可视化结果写进去。由于深度估计的输出和检测的输出不一样最终保存目录名称可能不同。你只需要看控制台打印的实际路径不要凭经验猜。5. 功能测试与效果验证5.1 测试一单图深度估计准备一张场景层次清楚的测试图比如室内视角、街道视角或者一个桌子上摆着不同距离物件的图。执行from ultralytics import YOLO model YOLO(weights/yolo26-depth.pt) results model.predict(sourceinputs/test.jpg, saveTrue, imgsz640)预期结果输出一张深度可视化图图上不同远近的区域有明显亮度或颜色梯度。判断标准有三个。第一近处物体和远处物体的相对深浅是否符合常识第二物体边缘是否清晰是否出现大范围的边缘糊掉第三深度图是否有明显的区域破碎。如果结果接近这三项说明模型加载和推理链路已经跑通。5.2 测试二目录批量推理把一批测试图放到inputs/images/下执行model.predict(sourceinputs/images, saveTrue, imgsz640)批量推理主要看两点吞吐是否稳定以及是否出现中途显存暴涨或进程崩溃。如果在批量过程中突然卡住优先怀疑单张异常图片导致预处理崩溃可以在后续用单图循环加 try/except 来定位。5.3 测试三自定义分辨率与参数深度估计对分辨率比较敏感。分辨率太低边缘细节容易丢失分辨率太高显存压力变大。建议先测试几组分辨率对比效果和资源消耗for size in [480, 640, 832]: results model.predict(sourceinputs/test.jpg, saveTrue, imgszsize)实际运行时让每次循环用不同的 project/name 区分保存目录避免结果互相覆盖。调整分辨率时如果显存不够优先降低imgsz或减小批量而不是直接换更大的显卡。5.4 测试四视频输入测试深度估计常用于视频或实时流。可以先拿一段本地视频试model.predict(sourceinputs/test_video.mp4, saveTrue, imgsz640)视频测试要看三点单帧推理耗时是否稳定、帧与帧之间的深度估计是否平滑、会不会出现间歇性的黑帧或异常值。如果单帧耗时太长说明当前分辨率对目标设备来说偏高需要降低分辨率或导出更快的引擎格式。5.5 测试五低光环境验证低光环境是 YOLO26 应用里常见的实际痛点。准备一张暗光图片与正常亮度图片一起推理。对比两种情况下深度图的前后景分离效果。如果低光下深度估计明显退化可以先做亮度归一化或去噪预处理再跑深度估计。也可以同时结合目标检测结果做交叉验证检测框的类别、位置和深度估计的远近关系是否互相矛盾。如果出现“检测框显示是近处的人深度图却把这块区域标成远背景”说明两个任务的结果还没对齐需要进一步调参或做后处理。5.6 判断功能是否可用的标准把功能从“跑通”升级到“可用”至少满足四个标准深度趋势与真实场景一致边缘质量在可接受范围在目标硬件上单帧耗时满足业务需求显存占用没有异常增长。这几个标准比单看某个指标更接近真实业务。6. 接口 API 与批量任务6.1 Python API 的基本调用深度估计能力通过 Ultralytics 的统一 Python API 暴露。核心代码很简单from ultralytics import YOLO model YOLO(weights/yolo26-depth.pt) results model.predict( sourceinputs/images, saveTrue, imgsz640, projectoutputs, namebatch_run, exist_okTrue, )这里的project和name可以控制输出目录exist_okTrue让多次运行不因目录已存在而报错。如果你是写脚本跑任务这组参数很有用。6.2 命令行调用不写 Python 脚本也可以用命令行yolo predict modelweights/yolo26-depth.pt sourceinputs/test.jpg saveTrue imgsz640命令行适合快速验证Python 脚本适合批量流程和后续服务化。6.3 导出 ONNX 与 TensorRT如果要在 C 或服务端部署建议先导出为 ONNX再按目标平台转成 TensorRT 或 RKNN。yolo export modelweights/yolo26-depth.pt formatonnx imgsz640 yolo export modelweights/yolo26-depth.pt formatengine device0导出时要注意源模型在导出前后输入输出张量保持不变但后处理可能不同。换句话说Python 推理输出的深度图可视化和 C 加载 ONNX 后的结果不一定完全一致。用 C 部署时要重新检查输出解析逻辑不要直接把 Python 的处理代码硬搬过去。6.4 一个简单的 REST 服务模板YOLO26 本身不一定自带深度估计 REST 服务这里给出一个通用的 FastAPI 包装模板。它可以用在本地或者局域网环境具体请求字段、输出格式需要按你的项目接口调整。from pathlib import Path from fastapi import FastAPI, UploadFile, File from ultralytics import YOLO app FastAPI() model YOLO(weights/yolo26-depth.pt) TEMP_DIR Path(./temp) TEMP_DIR.mkdir(exist_okTrue) app.post(/api/depth) async def depth_estimate(file: UploadFile File(...)): input_path TEMP_DIR / file.filename input_path.write_bytes(await file.read()) results model.predict( sourcestr(input_path), saveTrue, imgsz640, projectoutputs, nameapi_result, exist_okTrue, ) return { status: ok, image: file.filename, result_dir: str(Path(outputs/api_result)), }启动方式uvicorn app:app --host 127.0.0.1 --port 8000再次提醒这个模板只是展示“如何把 YOLO26 Python 推理包成服务”不是框架自带的官方接口。你实际使用时要根据模型输出格式调整返回值并考虑鉴权、并发和任务队列。6.5 批量任务与失败重试深度估计的批量任务可以按下面的思路组织。用一个脚本遍历输入目录每张图单独推理并记录日志。单个图失败不中断整个批次。这样在几十万张图片回灌时不会因为一两张坏图导致全部重跑。import logging from pathlib import Path from ultralytics import YOLO logging.basicConfig(levellogging.INFO, format%(asctime)s %(levelname)s %(message)s) logger logging.getLogger(__name__) model YOLO(weights/yolo26-depth.pt) input_dir Path(inputs/images) output_dir Path(outputs) for img_path in sorted(input_dir.iterdir()): if img_path.suffix.lower() not in {.jpg, .jpeg, .png, .bmp}: continue try: result model.predict( sourcestr(img