【单目测距】3D检测框测距

这篇具有很好参考价值的文章主要介绍了【单目测距】3D检测框测距。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

  1. 3D 检测模型用的 fcos3D。
  2. 如何对 3D 框测距?
  3. 3D 检测框测距对比 2D 检测框测距优势在哪?

二、2D框测距局限性

(1) 横向测距偏差。当目标有一定倾斜角度时,尤其近距离目标。如下图id = 0目标白车,如果是2D检测框测距,会误认为车尾在点 A 处,而实际应该在图像最左侧外部

(2) 无法测量目标的本身的长宽高。如图id = 4目标骑行者。如果是2D检测框,可以估算出目标离自身的距离。但是无法测量目标本身的深度。也无法精确测量目标的宽与高,对后续多目标跟踪、相机雷达融合带来未知的挑战。

【单目测距】3D检测框测距,自动驾驶,python,目标检测

三、3D框测距

为了弥补或解决2D检测框的局限性。我们可以采用3D检测框检测测距。3D检测当下主要困难在于:3D数据标注;数据集;模型优化等。

3.1、确定接地点

【单目测距】3D检测框测距,自动驾驶,python,目标检测

当前帧3D检测信息。第1位数是类别。后面16位数分别是8个点x像素、y像素。

(1) 对8个点以y像素进行排序。最大的四个y 确定为底边四个点。另四个y确定为顶边四个点。
(2) 在对底边四个点排序。得出前方两个点,后方两个点。再根据x像素排序,得出最终底边结果。
(3) 底边四个点结果得出,根据x像素一致,得出对应的顶边四个顶点。确定最终8个点顺序

【单目测距】3D检测框测距,自动驾驶,python,目标检测

窗外的雨水争先恐后拍打河面,寒气(降薪、裁员)冲击大家的心灵。回归初心、不惧困难。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。

3.2、测距结果对比

2D检测 yolov5 3D检测 fcos3D
【单目测距】3D检测框测距,自动驾驶,python,目标检测 【单目测距】3D检测框测距,自动驾驶,python,目标检测

注:我这里直接用了原图,没有进行校正

左图:2D 检测 接地点像素: (231, 720) 坐标(10.02413002, 5.98502587)

右图:3D 检测 接地点像素: (127, 726) 坐标 (10.15053704, 7.33307718)

雷达检测目标 坐标为(10.12,8.13)

如果把雷达近似当做真值,对于白车这个目标,2D框测距横向测距误差偏大。

3D 检测还可以计算出 center_x = 11.17567131, center_y = 7.01885511, width = 1.27463446, length = 2.15826759, angle = 73.30978614

3.3、代码

import yaml
import numpy as np
import cv2


def read_yaml(path):
    with open(path, 'r', encoding='utf-8') as f:
        result = yaml.load(f.read(), Loader=yaml.FullLoader)
    return result


def get_r_t_mtx(path, f_r_b_l):
    sensor_list = ["front_center", "right_center", "back_center", "left_center"]
    yaml_result = read_yaml(path)["camera"]  # 读取yaml配置文件h
    res_pitch = yaml_result[sensor_list[f_r_b_l]]["pitch"]
    res_h = yaml_result[sensor_list[f_r_b_l]]["height"]
    res_r = np.array(yaml_result[sensor_list[f_r_b_l]]["rotation"]).reshape(3, 3)
    res_t = np.array(yaml_result[sensor_list[f_r_b_l]]["translation"]).reshape(3, 1)
    res_mtx = np.array(yaml_result[sensor_list[f_r_b_l]]["K"]).reshape(3, 3)
    return [res_pitch, res_h, res_mtx, res_r, res_t]


def get_distance(pixe_x, pixe_y, param):
    pitch, h, K, R, T = param
    sigma = np.arctan((pixe_y - K[1][2]) / K[1][1])
    z = h * np.cos(sigma) / np.sin(sigma + pitch)  # 深度
    x_pixe, y_pixe = 2 * K[0][2] - pixe_x, 2 * K[1][2] - pixe_y
    camera_x = z * (x_pixe / K[0][0] - K[0][2] / K[0][0])
    camera_y = z * (y_pixe / K[1][1] - K[1][2] / K[1][1])
    camera_z = z
    x = R[0][0] * camera_x + R[0][1] * camera_y + R[0][2] * camera_z + T[0]
    y = R[1][0] * camera_x + R[1][1] * camera_y + R[1][2] * camera_z + T[1]
    z = R[2][0] * camera_x + R[2][1] * camera_y + R[2][2] * camera_z + T[2]
    return x, y, z


# show image
def show_img(img):
    cv2.namedWindow("show")
    cv2.imshow("show", img)
    cv2.waitKey(0)


# 画线
def draw_line(img, points, lines, color):
    list_line = []  # 存储 12 根线
    for i, point in enumerate(points):
        line = np.array([points[lines[i][0]], points[lines[i][1]]], np.int32).reshape((-1, 1, 2))  # 3D框8条横线
        list_line.append(line)
        if i < 4:
            line_col = np.array([points[i], points[i + 4]], np.int32).reshape((-1, 1, 2))  # 3D框4条竖线
            list_line.append(line_col)
    cv2.polylines(img, list_line, True, color)  # cv2.polylines 一次性可视化画线
    return img


# 获取类别颜色。不同类别对应不同颜色
def get_color(label):
    # car truck trailer bus vehicle bicycle motorcycle pedestrian traffic_cone barrier
    colors_list = [(96, 48, 176),
                   (105, 165, 218),
                   (18, 153, 255),
                   (15, 94, 56),
                   (203, 192, 255),
                   (34, 139, 34),
                   (211, 102, 160),
                   (171, 89, 61),
                   (140, 199, 0),
                   (0, 69, 255),
                   (31, 102, 156),
                   (42, 42, 128)]
    return colors_list[int(label)]


def point_to_point_distance(point1, point2):
    x1, y1 = point1
    x2, y2 = point2
    res = np.sqrt(np.power(x2 - x1, 2) + np.power(y2 - y1, 2))
    return res


def get_3D_distance(points, param):
    x0, y0, z0 = get_distance(points[0][0], points[0][1], param)
    x1, y1, z1 = get_distance(points[1][0], points[1][1], param)
    x2, y2, z2 = get_distance(points[2][0], points[2][1], param)
    x3, y3, z3 = get_distance(points[3][0], points[3][1], param)
    c_y = (y0 + y1 + y2 + y3) / 4
    c_x = (x0 + x1 + x2 + x3) / 4
    w = point_to_point_distance((x0, y0), (x1, y1))
    l = point_to_point_distance((x0, y0), (x3, y3))
    angle = np.arctan((x3 - x0) / (y0 - y3)) * 180 / np.pi
    return c_x, c_y, w, l, angle


# 根据底面四个点顺序 确定 顶面四个点顺序
def four_point_sort(bottom_four_point, top_four_point):
    res = [[]] * 4
    for i in range(4):
        for x, y in top_four_point:
            if -2 < x - bottom_four_point[i][0] < 2:  # 底面点对应顶面点 x 像素应一致 保险起见 约束在两个像素内
                res[i] = [x, y]
                break
    return res


def visual_detect(path, img):
    msg = np.loadtxt(path)
    for index, object in enumerate(msg):
        if index != 0:
            continue
        color = get_color(object[0])
        point_list = []
        for i in range(8):
            x, y = int(object[1 + 2 * i]), int(object[2 + 2 * i])
            x, y = int(x * 1920 / 1600), int(y * 1080 / 900)
            point_list.append([x, y])
        point_list.sort(key=lambda x: x[1], reverse=True)
        point_res = [[]] * 8
        point_res[:2] = point_list[:2] if point_list[0] < point_list[1] else point_list[:2][::-1]
        point_res[2:4] = point_list[2:4] if point_list[2] > point_list[3] else point_list[2:4][::-1]
        point_res[4:] = four_point_sort(point_res[:4], point_list[4:])
        c_x, c_y, w, l, angle = get_3D_distance(point_res, front_param)
        img = draw_line(img, point_res, lines, color)
        for index, point in enumerate(point_res):
            cv2.circle(img, (point[0], point[1]), 2, color, thickness=2, lineType=None, shift=None)
            cv2.putText(img, str(index), (point[0], point[1]), 2, 1, color, thickness=None, lineType=None)
    show_img(img)


if __name__ == '__main__':
    front_param = get_r_t_mtx("sensor_param.yaml", 0)  # 获取相机外参
    img = cv2.imread("366.jpg")
    lines = [[0, 1], [1, 2], [2, 3], [3, 0], [4, 5], [5, 6], [6, 7], [7, 4]]
    visual_detect("./366.txt", img)

3.4、代码解析

函数 read_yaml 与函数 get_r_t_mtx 是读取相机标定文件,然后获取相机内参、外参。为了后续计算距离。

函数 get_distance 主要是计算接地点距离;看过我之前单目测距博客的朋友应该很熟悉这套公式了。

函数 get_color 获取不同类别对应不同颜色;函数draw_line 画 3D 框

函数 four_point_sort 获取对应点排序,如图 0 1 2 3 4 5 6 7 确定每个点最终顺序。get_3D_distance 计算框中心点、长、框、框朝向角。

函数 visual_detect 对点进行排序与可视化。

四、后记

博客就写到这里吧。有任何疑问,都可提出,欢迎大家私信交流。文章来源地址https://www.toymoban.com/news/detail-817464.html

到了这里,关于【单目测距】3D检测框测距的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动驾驶:低阶可部署的单目测距算法-基于YOLO与透视变换

    一、开发环境 部署平台:英伟达的Jetson Nano 环境:Linux + ROS 语言:C++ 设备:1920*1080像素的摄像头、开发板。 模型:yolo-v8s 二、单目测距实现思路 0、标定相机和车辆(假设已经标定完成) 1、通过yolo对目标检测,获得ROI区域 2、根据ROI计算车辆和地面接触的中心点 3、根据车

    2024年02月02日
    浏览(46)
  • 综述:自动驾驶中的多模态 3D 目标检测

    在驾驶场景中,自动驾驶车辆需要精准高效的感知运算,时刻预测其所处的驾驶环境。 其中,感知系统将各种传感器数据转化为语义信息,是自动驾驶系统的核心和不可缺少的组成部分。 图像具有丰富的语义信息,点云包含深度信息。 两者具有互补特性,可以提高三维物体

    2024年02月03日
    浏览(43)
  • Mediapipe实时3D目标检测和跟踪(自动驾驶实现)

    3D目标检测是根据物体的形状、位置和方向来识别和定位物体的任务。在2D目标检测中,被检测到的物体仅表示为矩形边界框。3D目标检测任务通过预测物体周围的包围框,可以获取物体的三维位置信息。 3D目标检测在各行各业都有广泛的应用。一些常见的用途包括: 🎯 机器

    2024年02月09日
    浏览(37)
  • 用于自动驾驶的基于深度学习的图像 3D 目标检测:综述

    论文地址:https://ieeexplore.ieee.org/abstract/document/10017184/ 准确、鲁棒的感知系统是理解自动驾驶和机器人驾驶环境的关键。自动驾驶需要目标的 3D 信息,包括目标的位置和姿态,以清楚地了解驾驶环境。 摄像头传感器因其颜色和纹理丰富且价格低廉而广泛应用于自动驾驶中。摄

    2024年02月03日
    浏览(51)
  • 基于 Transformation-Equivariant 的自动驾驶 3D 目标检测

    论文地址:https://arxiv.org/abs/2211.11962 论文代码:https://github.com/hailanyi/TED 三维场景中的物体分布有不同的方向。普通探测器不明确地模拟旋转和反射变换的变化。需要大的网络和广泛的数据增强来进行鲁棒检测。 equivariant networks 通过在多个变换点云上应用共享网络显式地模拟

    2024年02月09日
    浏览(39)
  • PSEUDO-LIDAR++:自动驾驶中 3D 目标检测的精确深度

    论文地址:PSEUDO-LIDAR++: ACCURATE DEPTH FOR 3D OBJECT DETECTION IN AUTONOMOUS DRIVING 论文代码:https://github.com/mileyan/Pseudo_Lidar_V2 3D 检测汽车和行人等物体在自动驾驶中发挥着不可或缺的作用。现有方法很大程度上依赖昂贵的激光雷达传感器来获取准确的深度信息。虽然最近推出了伪激光雷

    2024年01月23日
    浏览(45)
  • [论文阅读]MV3D——用于自动驾驶的多视角3D目标检测网络

    Multi-View 3D Object Detection Network for Autonomous Driving 用于自动驾驶的多视角3D目标检测网络 论文网址:MV3D 这篇论文提出了一个多视角3D目标检测网络(MV3D),用于自动驾驶场景下高精度的3D目标检测。主要的创新点有: 提出了一种紧凑的多视角表示方法来编码稀疏的3D点云数据。该方法

    2024年02月08日
    浏览(54)
  • 计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

    该项目一个基于深度学习和目标跟踪算法的项目,主要用于实现视频中的目标检测和跟踪。 该项目使用了 YOLOv5目标检测算法和 DeepSORT 目标跟踪算法,以及一些辅助工具和库,可以帮助用户快速地在本地或者云端上实现视频目标检测和跟踪! 教程博客_传送门链接-------单目测

    2024年02月08日
    浏览(51)
  • 睿智的目标检测——Pytorch搭建YoloV7-3D单目图像目标检测平台

    睿智的目标检测——Pytorch搭建YoloV7-3D单目图像目标检测平台 学习前言 源码下载 YoloV7-3D改进的部分(不完全) YoloV7-3D实现思路 一、整体结构解析 二、网络结构解析 1、主干网络Backbone介绍 2、构建FPN特征金字塔进行加强特征提取 3、利用Yolo Head获得预测结果 三、预测结果的解

    2024年02月16日
    浏览(43)
  • 【3D目标检测】基于伪雷达点云的单目3D目标检测方法研宄

    本文是基于单目图像的3D目标检测方法,是西安电子科技大学的郭鑫宇学长的硕士学位论文。 【2021】【单目图像的3D目标检测方法研究】 研究的问题: 如何提高伪点云的质量 伪点云体系中如何提高基于点云的检测算法的效果 提出的方法: 一种基于置信度的伪点云采样方法

    2024年02月06日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包