yolov11与双目测距结合,实现目标的识别和定位测距(onnx版本)

一、yolov11+双目测距基本流程 

yolov11 + 双目测距的大致流程就是:

双目标定 --> 立体校正(含消除畸变) --> 立体匹配 --> 视差计算 --> 深度计算(3D坐标)计算  --> 目标检测  --> 目标距离计算及可视化

下面将分别阐述每一个步骤并使用python来实现。

二、双目测距

其中双目测距的原理及过程请查看我下面的博客

保姆级双目测距原理及代码-优快云博客

三、目标检测

在本项目中,我们选用了轻量级且高效的目标检测模型 YOLOv11,并使用其 ONNX格式模型部署,结合OpenCV和ONNX Runtime完成前向推理,实现高性能目标识别。整个检测流程主要包括 模型转换图像预处理、模型推理、后处理 四个步骤,以下是详细解析:

3.1 模型转换(PyTorch → ONNX)

为提升系统在不同平台的兼容性与环境,我们将 PyTorch 格式的 YOLOv11 模型转换为 ONNX 格式,供 onnxruntime 加载使用。

Ultralytics 框架提供了简洁的模型导出接口,支持直接将训练好的 .pt 权重导出为 ONNX 文件。转换代码如下:

from ultralytics import YOLO

# 加载YOLOv11模型
model = YOLO("./weight/yolo11s.pt")

# 转onnxsimplify
model.export(format="onnx", simplify=False, device="cpu", opset=15)

其中参数说明如下:

  • format="onnx":指定导出格式为 ONNX。

  • simplify=False:是否使用 onnxsim 简化模型结构。此处设置为 False,保持模型结构完整。

  • device="cpu":导出时使用 CPU 进行模型加载和转换。

  • opset=15:指定 ONNX 的算子集版本,确保在现代推理环境中兼容性良好。

导出成功后,系统会在当前目录生成名为 yolo11s.onnx 的模型文件。

该模型可直接通过 onnxruntime.InferenceSession 加载,用于后续图像目标检测与测距任务。

3.2 图像预处理(Preprocess)

输入图像在送入YOLOv11模型前,需要经过标准化与尺寸调整。预处理的关键操作包括:

  • 颜色空间转换:BGR转RGB(符合模型训练时的格式要求);

  • 等比例缩放:根据模型输入尺寸(如640x640)对图像缩放,同时添加灰色边框填充,确保图像比例不变;

  • 归一化:将像素值归一到0,10, 10,1;

  • 维度调整:转换为 NCHW 格式,以匹配ONNX模型输入要求。

其中,图像预处理代码如下:

 def preprocess_image(self, image):
        # 调节颜色通道
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        # rsize + padding
        h, w, c = image.shape

        # 求各自缩放到模型的缩放比例,找出最小比例
        r_w = self.model_width / w
        r_h = self.model_height / h

        ratio = 0

        if r_h > r_w:
            tw = self.model_width
            th = int(h * r_w)
            ratio = r_w
            # 填充尺寸
            p_x1 = p_x2 = 0
            p_y1 = int((self.model_height - th) / 2)
            p_y2 = self.model_height - th - p_y1

        else:
            th = self.model_height
            tw = int(w * r_h)
            ratio = r_h
            # 填充尺寸
            p_y1 = p_y2 = 0
            p_x1 = int((self.model_width - tw) / 2)
            p_x2 = self.model_width - tw - p_x1

        image = cv2.resize(image, (tw, th))
        image = cv2.copyMakeBorder(image, p_y1, p_y2, p_x1, p_x2, cv2.BORDER_CONSTANT, (128, 128, 128))
        image2 = image
        # 转换为浮点型并归一化到 [0, 1]
        image = image.astype(np.float32) / 255.0
        # 转换为 NCHW 格式(批次、通道、高、宽)
        image = np.transpose(image, (2, 0, 1))
        image = np.expand_dims(image, axis=0)
        return image, ratio, [p_x1, p_x2, p_y1, p_y2]

3.2 ONNX模型推理

通过 onnxruntime.InferenceSession 加载YOLOv11的ONNX模型,并根据模型定义的输入输出节点,构建推理输入:

self.onnx_session = onnxruntime.InferenceSession(self.onnx_path)
input_feed = {self.input_name[0]: preprocessed_image}
pred_bbox = self.onnx_session.run(None, input_feed)[0]

3.3 后处理(Postprocess)

在目标检测模型完成前向推理后,其输出通常为大量未筛选的候选框(bounding boxes),每个候选框包含位置坐标、各类别置信度等信息。为了从中提取有效的目标信息,并在原始图像上可视化展示,需对模型输出进行后处理。后处理步骤如下:

  1. 维度变换与置信度筛选
    模型输出的张量 pre_box 通过 np.einsum("bcn->bnc", pre_box) 调整维度顺序,得到 [num_boxes, num_channels] 形式的数据。随后提取每个候选框的最大类别置信度,并只保留置信度高于设定阈值 conf_thres 的候选框。

  2. 提取目标框与类别索引
    对保留的候选框,提取其前四个位置坐标、最大置信度和类别索引。类别索引由 np.argmax 得到,即置信度最大的类别。

  3. 非极大值抑制(NMS)
    通过 OpenCV 的 cv2.dnn.NMSBoxes 实现 NMS,去除重叠度(IoU)过高的冗余候选框,保留最优检测结果。

  4. 坐标解码与图像尺度还原
    检测框坐标从中心点形式 cx, cy, w, h 转换为边界框形式 x1, y1, x2, y2,并根据预处理的 padding 和缩放比例 ratio 还原为原始图像坐标。边界值被限制在图像范围内,防止越界。

其中,后处理代码如下:

    def postprocess_image(self, original_image, pre_box, points_3d, ratio, pad_size):

        pre_box = np.einsum("bcn->bnc", pre_box)

        # 获取每个预测框的最大置信度
        conf_scores = np.amax(pre_box[..., 4:], axis=-1)

        # 只保留置信度大于阈值的预测框
        x = pre_box[conf_scores > self.conf_thres]

        x = np.c_[x[..., :4], conf_scores[conf_scores > self.conf_thres], np.argmax(x[..., 4:], axis=-1)]

        # NMS filtering
        x = x[cv2.dnn.NMSBoxes(x[:, :4], x[:, 4], self.conf_thres, self.iou_thres)]

        # Decode and return
        if len(x) > 0:
            # cxcywh -> xyxy
            x[..., [0, 1]] -= x[..., [2, 3]] / 2
            x[..., [2, 3]] += x[..., [0, 1]]

            # 恢复成原图尺寸
            x[..., :4] -= [pad_size[0], pad_size[2], pad_size[1], pad_size[3]]
            x[..., :4] /= ratio

            # 检查边界
            x[..., [0, 2]] = x[:, [0, 2]].clip(0, original_image.shape[1])
            x[..., [1, 3]] = x[:, [1, 3]].clip(0, original_image.shape[0])

四、目标距离计算及可视化

在完成目标检测的后处理阶段后,系统已经获得每个候选目标的二维图像坐标和置信度信息。为了进一步实现三维感知功能,本系统结合双目测距模块输出的 points_3d,实现目标距离的估算与图像可视化展示。

4.1 距离估算(3D中心点提取)

首先,对通过置信度筛选和 NMS 处理后的目标框,计算其中心点坐标:

随后,根据中心点的像素坐标,从稠密深度图中提取该位置对应的三维坐标:

其中,Z表示相机到目标的深度距离。

4.2 类别过滤与绘制逻辑

为提升系统的针对性与应用适应性,引入了可配置的 detection_name 白名单机制。仅当检测到的目标类别存在于该名单中时,才执行可视化绘制与距离估算操作。该策略可适用于特定场景(如仅关注“人”或“汽车”等对象)。

4.3 可视化结果展示

为了观测方便,下面结果仅可视化了行人的检测结果。最终,为提升用户体验并实现直观展示,系统将检测结果绘制回原始图像中,具体包括:

  • 目标框绘制:使用 cv2.rectangle 绘制每个目标的边界框,不同类别采用不同颜色(由 COLORS 字典控制);

  • 距离信息叠加:在目标框上方添加该目标与相机之间的距离信息,格式为 "Distance: 1.52 m"

  • 类别与置信度(可选):支持在框上叠加类别名称与预测置信度,用于辅助判断目标识别准确性。

yolov11双目测距图像

yolov11双目测距深度

五、整体代码介绍

本代码实现了基于双目立体视觉的目标检测与测距系统,涵盖了畸变矫正、立体校正、视差计算及深度计算和目标检测关键步骤。

测距模块从 stereoconfig 模块中加载相机标定参数,包括内外参和畸变系数,利用 OpenCV 的 cv2.stereoRectify() 对左右相机图像进行立体校正,保证图像对齐。随后,采用 SGBM(半全局匹配算法)计算视差图,并结合 WLS(加权最小二乘滤波)滤波器对视差图进行优化,提高视差的平滑性和准确性。接着,通过 cv2.reprojectImageTo3D() 将视差图转换成三维点云,得到每个像素的三维信息。检测模块基于ONNX格式的YOLO模型,结合后处理与非极大值抑制筛选检测框,并计算目标中心点的三维坐标实现距离估计。

系统支持两种运行模式:图片模式(image_mode)用于处理静态双目图像,摄像头模式(camera_mode)支持实时视频流处理,实现动态测距与目标检测。可根据自己需求进行相应选择。

此外,检测模块使用的是 YOLO 官方发布的预训练权重(基于 COCO 数据集),因此支持80类常见目标的检测,包括但不限于:

  • 人类相关:person(人)、bicycle(自行车)、car(汽车)、motorcycle(摩托车)、bus(公交车)、truck(卡车);

  • 动物类:dog(狗)、cat(猫)、bird(鸟)、horse(马);

  • 日常用品:chair(椅子)、sofa(沙发)、bed(床)、tv(电视)、laptop(笔记本电脑)、cell phone(手机);

  • 食物与器具:bottle(瓶子)、cup(杯子)、fork(叉子)、knife(刀)、spoon(勺子)等。

本代码仅依赖 ONNX、NumPy 和 OpenCV 库,无需依赖 PyTorch 等深度学习框架,因而更适合部署在边缘设备上,具有较低的资源消耗和良好的跨平台兼容性。

关于该系统涉及到的完整源码、测试图片视频、说明、安装环境等相关文件,均已打包上传,感兴趣的小伙伴可以通过下载链接自行获取。

yolov11+双目测距代码

<think>好的,我现在需要帮助用户找到关于YOLOv障碍物检测的教程实现方法。用户提到了几个引用,我需要先仔细看看这些引用内容,看看有没有相关的信息。 首先看引用[1],里面提到了导入YOLO模型并加载预训练的YOLOv8模型,用的是Ultralytics库。这可能涉及到如何加载模型进行检测的步骤,应该有用。 引用[2]提到了YOLOv5用于雪糕筒识别,需要自定义的权重utils文件夹里的文件。这说明用户可能需要自己训练模型,或者使用特定权重,这里可能涉及到数据准备训练步骤。 引用[3]是关于使用YOLOv8双目视觉进行目标检测测距的,结合深度图。这部分可能涉及如何将检测结果深度信息结合,用于测距,这可能对用户有帮助,尤其是如果用户需要测距功能的话。 引用[4]提到安装Anaconda搭建Python环境,进行YOLOv7的detecttrain。这说明环境配置是基础步骤,用户可能需要先配置好环境。 接下来,我需要整理这些信息,分步骤回答用户的问题。可能需要包括环境配置、模型选择下载、数据准备、训练模型、检测实现以及测距应用等步骤。同时,要注意使用正确的中文术语,并按照用户的要求使用正确的LaTeX格式,不过这里可能数学公式不多,但如果有的话需要注意格式。 然后要生成相关问题,可能涉及优化方法、环境配置问题、数据标注工具、模型比较等。确保问题用户的需求相关,并且基于提供的引用内容。 需要检查是否有遗漏的信息,比如引用[3]中的深度图分割测距部分,可能需要单独作为一个步骤来讲解。同时,引用[2]中的自定义权重文件可能意味着用户需要特定的训练过程,这部分需要详细说明。 另外,用户可能对如何实际应用YOLO进行障碍物检测的具体代码示例感兴趣,所以需要提供代码片段,并确保代码格式正确,如Python代码块。 最后,确保回答结构清晰,分步骤说明,引用正确的文献来源,并在末尾添加相关问题。</think>以下是关于YOLOv障碍物检测的教程及实现方法的详细说明,结合了引用内容的关键信息: --- ### 一、环境配置工具准备 1. **安装Python环境** 推荐使用Anaconda创建虚拟环境,避免依赖冲突[^4]: ```bash conda create -n yolo_env python=3.8 conda activate yolo_env ``` 2. **安装依赖库** YOLOv系列通常需要`torch`、`ultralytics`等库: ```bash pip install torch ultralytics opencv-python ``` --- ### 二、模型选择加载 1. **预训练模型下载** YOLOv8、YOLOv5等模型权重可从官方仓库获取,例如: ```python from ultralytics import YOLO model = YOLO('yolov8n.pt') # 加载YOLOv8预训练模型[^1] ``` 2. **自定义模型训练** - **数据准备**:标注障碍物数据集(如COCO格式),需包含`images``labels`文件夹。 - **配置文件**:修改`data.yaml`指定数据集路径类别。 - **训练命令**: ```bash yolo detect train data=data.yaml model=yolov8n.pt epochs=100 ``` --- ### 三、障碍物检测代码实现 1. **基础检测示例** ```python import cv2 from ultralytics import YOLO model = YOLO('yolov8n.pt') # 加载模型[^1] results = model.predict(source='test.jpg', conf=0.5) # 检测图像 res_plotted = results[0].plot() # 绘制检测框 cv2.imshow("Result", res_plotted) cv2.waitKey(0) ``` 2. **视频流检测** ```python cap = cv2.VideoCapture(0) # 摄像头输入 while cap.isOpened(): ret, frame = cap.read() results = model.predict(frame) cv2.imshow('Detection', results[0].plot()) if cv2.waitKey(1) == ord('q'): break ``` --- ### 四、结合深度信息的障碍物测距(引用[3]) 1. **双目视觉深度图** - 使用双目摄像头生成深度图,结合YOLOv检测结果定位障碍物。 - 核心公式:$$ \text{距离} = \frac{\text{基线长度} \times \text{焦距}}{\text{视差}} $$[^3] 2. **代码片段** ```python # 伪代码示例:检测后提取目标深度 depth_map = compute_depth_map(left_img, right_img) # 生成深度图 boxes = results[0].boxes.xyxy # 获取检测框坐标 for box in boxes: x_center = (box[0] + box[2]) // 2 y_center = (box[1] + box[3]) // 2 distance = depth_map[y_center, x_center] # 提取中心点深度 print(f"障碍物距离:{distance:.2f}米") ``` --- ### 五、常见问题优化 - **模型轻量化**:使用YOLOv8n/YOLOv5s等小型模型提升实时性[^2]。 - **数据增强**:添加遮挡、光照变化等增强鲁棒性。 - **部署优化**:转换为ONNX/TensorRT格式加速推理。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值