AutoCV第八课:3D基础

目录

  • 3D基础
    • 注意事项
    • 一、2023/5/11更新
    • 二、2023/5/15更新
    • 前言
    • 1. nuScenes数据集
    • 2. nuScenes数据格式
    • 3. 点云可视化
    • 4. 点云可视化工具
    • 5. 点云可视化(补充)
    • 总结

3D基础

注意事项

一、2023/5/11更新

新增工具可视化点云,即第 4 节内容

二、2023/5/15更新

经杜老师指正,之前实现的 3D 可视化的效果并不是不好,而是输入数据存在问题!!!这边看了下,利用 mayavi.malb 库重新来可视化点云数据,新增第 5 小节内容

前言

手写 AI 推出的全新保姆级从零手写自动驾驶 CV 课程,链接。记录下个人学习笔记,仅供自己参考。

本次课程主要学习点云数据的可视化。

课程大纲可看下面的思维导图。

在这里插入图片描述

1. nuScenes数据集

nuScenes 数据集是一种用于自动驾驶研究的大规模开放式数据集,其中包含了从多个传感器收集的高清三维激光雷达数据、高清摄像头数据、GPS 和 IMU 数据以及其它传感器等多种数据类型,总数据量达到了超过 1000 小时的行驶数据。各个传感器在车辆的具体位置可参考 图1-1(from chatGPT)

nuScenes 数据集由 nuTonomy 公司于 2019 年发布,后被 Aptiv 收购并维护。数据集中包含了超过 1000 个行驶场景,每个场景长度约为 20 秒,包括了各种驾驶情况,如城市、高速公路和居住区等场景

nuScenes 数据集中的传感器数据可以用于多种自动驾驶研究任务,如目标检测、语义分割、行为预测等。

关于 nuScenes 数据集更多的描述可见官网

nuScenes 官网:https://www.nuscenes.org/nuscenes?sceneId=scene-0100&frame=0&view=lidar

nuScenes 教程:https://www.nuscenes.org/nuimages#tutorial

nuScenes mini 数据集下载网盘链接:https://pan.baidu.com/s/1BNuDTDCN37rkWRYBdF8C7Q?pwd=yolo

在这里插入图片描述

图1-1 车辆传感器位置

2. nuScenes数据格式

本次我们使用 v1.0-mini 数据集来进行后续的学习工作,它是 nuScenes 数据集的一个子集,解压后包含以下五个文件:

1.maps

  • 包含有关城市街道的地图数据,包括道路、车道、交叉口、建筑物和树木等信息

2.samples

  • 包含有关车辆传感器数据的信息,如激光雷达、相机和毫米波雷达等一些样本数据
  • 相机数据是以图片的格式存储的,LiDAR 数据是以二进制的格式存储的,Radar 数据则是以 PCD 的格式进行存储的
  • PCD 全称 Point Cloud Data,是一种用于存储三维点云数据的文件格式。每个 .pcd 文件包含了 x、y、z 的三维坐标以及反射强度等信息
  • 后续点云数据的可视化是读取的 LiDAR_TOP 中的某一个二进制文件

3.sweeps

  • 包含了一系列车辆传感器数据的信息

4.v1.0-mini

  • 包含有关数据集中每个样本的元数据信息,如时间戳、旋转矩阵等。元数据以 JSON 格式存储

5.v1.0-mini.txt

  • 说明文档

3. 点云可视化

我们来对 LiDAR 的点云数据来进行可视化,其点云数据格式是一个二进制文件,其 shape 为 [n,5]

  • n 代表点云的数量
  • 5 分别代表 x、y、z、intensity、ring index
  • x、y、z 代表基于激光雷达的 3D 坐标
  • intensity 是反射强度,指的是激光接收器接受的反射次数,通常用于区分物体或地面
  • ring index:点所在激光雷达扫描线的编号,比如 32 线激光雷达,其值就为 1-32

示例代码如下:

import numpy as np
import cv2file = "./data/n015-2018-11-21-19-38-26+0800__LIDAR_TOP__1542800855949460.pcd.bin"# [x, y, z, intensity, ring index]
pc = np.frombuffer(open(file, "rb").read(), dtype=np.float32)
pc = pc.reshape(-1, 5)[:, :4]x, y, z, intensity = pc.T# 设置图像的尺寸1024x1024
image_size = 1024# 数据归一化
# 点的坐标范围大概是100
pc_range = 100
x = x / pc_range    # [-1,1]
y = y / pc_range# 缩放到图像大小,并平移到图像中心
half_image_size = image_size / 2
x = x * half_image_size + half_image_size
y = y * half_image_size + half_image_size# opencv的图像,可以用numpy进行创建
image = np.zeros((image_size, image_size, 3), np.uint8)for ix, iy, iz in zip(x, y, z):ix = int(ix)iy = int(iy)# 判断是否在图像范围内if ix >= 0 and ix < image_size and iy >= 0 and iy < image_size:image[iy, ix] = 255, 255, 255cv2.imwrite("pointcloud.jpg", image)
cv2.imshow("image", image)
cv2.waitKey(0)

该示例代码主要是对 nuScenes 数据集中的激光雷达点云数据进行了可视化,具体流程如下:

  • 读取 nuScenes 数据集中的一个 .pcd.bin 文件,该文件中存储了激光雷达采集的点云数据。
  • 读取文件中的点云数据,并将其转换为 numpy 数组。
  • 解析 numpy 数组,得到点云数据中的 x, y, z, intensity 四个维度。
  • 由于点云数据的坐标值范围比较大,需要进行归一化操作。本代码采用将点云数据的范围缩放到 [-1, 1] 的方法进行归一化。
  • 缩放点云数据,并将其平移至图像中心。
  • 创建一个黑色的 1024x1024 的图像,并遍历所有点云数据中的点,将其所在位置的像素点设为白色。
  • 将生成的图像保存并显示

可视化图如下:

在这里插入图片描述

图3-1 激光雷达数据的二维可视化

我们可以考虑高度信息,绘制一张 3D 的点云图

  • 参考自:https://blog.csdn.net/Fzc_Ztt/article/details/116668330

示例代码如下:

import numpy as np
import mayavi.mlab# pip install mayavi
# pip install pyqt5# lidar_path换成自己的.bin文件路径
pointcloud2 = np.fromfile("./data/n015-2018-11-21-19-38-26+0800__LIDAR_TOP__1542800855949460.pcd.bin", dtype=np.float32, count=-1).reshape([-1, 4])# 提取点云坐标和反射强度
x = pointcloud2[:, 0]  # x position of point
y = pointcloud2[:, 1]  # y position of point
z = pointcloud2[:, 2]  # z position of point
r = pointcloud2[:, 3]  # reflectance value of point# 计算点云距离和高度角
d = np.sqrt(x ** 2 + y ** 2)  # Map Distance from sensor 
degr = np.degrees(np.arctan(z / d))# 设置颜色
vals = 'height'
if vals == "height":col = z
else:col = d# 可视化点云数据
fig = mayavi.mlab.figure(bgcolor=(0,0,0),size=(640, 500))
mayavi.mlab.points3d(x, y, z,col,  # Values used for Colormode="point",colormap='spectral',  # 'bone', 'copper', 'gnuplot'# color=(0, 1, 0),   # Used a fixed (r,g,b) insteadfigure=fig,)mayavi.mlab.show()

上述示例代码使用了 numpy 和 mayavi 库,用于读取并解析激光雷达二进制数据,然后将点云数据可视化为 3D 效果图。首先从二进制数据中提取点的 x、y、z 坐标和反射强度,然后计算出每个点到传感器的距离,最后根据距离或高度值对点进行着色,并使用 mayavi 的 point3d() 函数将点云可视化出来。通过设置不同的参数,可以调整点云的颜色、大小和透明度等属性。最后使用 mayavi 的 show() 函数显示 3D 效果图

可视化图如下:

在这里插入图片描述

图3-2 激光雷达数据的三维可视化

我们还可以将不同视角的图片进行保存,然后利用 imageio 模块绘制动态图

示例代码如下:(from chatGPT)

import numpy as np
import mayavi.mlab as mlab
import os
import imageio# 读取点云数据
pointcloud = np.fromfile('./data/n015-2018-11-21-19-38-26+0800__LIDAR_TOP__1542800855949460.pcd.bin', dtype=np.float32, count=-1).reshape([-1, 4])# 提取点云坐标和反射强度
x = pointcloud[:, 0]
y = pointcloud[:, 1]
z = pointcloud[:, 2]
r = pointcloud[:, 3]# 创建 mayavi 场景
fig = mlab.figure(bgcolor=(0,0,0), size=(800, 600))# 绘制点云
points = mlab.points3d(x, y, z, r, mode='point', colormap='spectral')# 设置相机位置和视角
mlab.view(azimuth=0, elevation=90, distance=500, focalpoint=[0,0,0])
mlab.move(forward=-100)# 创建保存点云数据的文件夹
if not os.path.exists('./lidar_images'):os.makedirs('./lidar_images')# 保存不同视角的点云数据到文件夹
for i in range(36):mlab.view(azimuth=i*10, focalpoint=[0,0,0])mlab.move(forward=-20)mlab.savefig('./lidar_images/lidar_view_{}.png'.format(i))# # 文件夹路径
folder_path = './lidar_images/'# 获取文件夹下的所有图片路径
image_paths = sorted([os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.png')])# 读取所有图片并保存到列表中
images = []
for image_path in image_paths:images.append(imageio.imread(image_path))# 将所有图片合成为一张动态图
imageio.mimsave('./lidar.gif', images, fps=9)

可视化图如下所示,效果并不是很好,凑合看吧😂

在这里插入图片描述

图3-3 激光雷达数据的不同视角图

顺便想看看毫米波雷达的点云数据,但是其数据格式不是很清楚,就没去折腾解析工作了,主要是通过工具 pcl-tools 来查看的

首先安装 pcl-tools 库

sudo apt-get install pcl-tools

然后运行对应的毫米波雷达的 pcd 数据就行

pcl_viewer xxx.pcd

可视化效果如下:

在这里插入图片描述

图3-4 毫米波雷达数据的可视化

好像没啥好看的,就一堆点,而且相比于激光雷达来说点云非常稀疏

毫米波雷达是通过发送一束毫米波,利用物体对毫米波的反射来确定物体的位置。它可以探测物体的反射并测量反射的时间和强度,从而确定物体的距离、角度和速度等信息。毫米波雷达的点云密度相对较低,需要更多的数据处理和算法优化来进行点云重建和应用。

4. 点云可视化工具

我们在 vscode 中利用插件 vscode-pc-viewer 可以将点云数据进行可视化

启动 vscode 按照以下操作

  • 点击扩展商店
  • 输入插件名称 vscode-pc-viewer
  • 选择插件
  • 点击安装

流程如下图所示:

在这里插入图片描述

图4-1 点云可视化工具安装流程

安装完成之后,可以任意点击一个激光雷达的 .pcd.bin 文件查看点云可视化结果如下图所示:

在这里插入图片描述

图4-2 vscode-pc-viewer直接可视化点云数据

似乎和我之前 3D 可视化的结果差不多呀,不过看不出啥玩意,格式存在问题,我们来看看关于 vscode-pc-viewer 插件的相关描述

在这里插入图片描述

图4-3 vscode-pc-viewer插件描述

可以看到它支持 ply、pcd、xyz、obj、bin 等格式,但是二进制文件只支持 KITTI 数据集,那么需要将 nuScenes 数据集中激光雷达的二进制点云数据转换为 KITTI 数据集格式。

转换示例代码如下:

import numpy as npfile = "./data/n015-2018-11-21-19-38-26+0800__LIDAR_TOP__1542800855949460.pcd.bin"pc = np.frombuffer(open(file, "rb").read(), dtype=np.float32)
pc = pc.reshape(-1, 5)[:, :4]x, y, z, intensity = pc.Tarr = np.zeros(x.shape[0] + y.shape[0] + z.shape[0] + intensity.shape[0], dtype=np.float32)
arr[::4] = x
arr[1::4] = y
arr[2::4] = z
arr[3::4] = intensity
arr.astype('float32').tofile('kitti.bin')

参考自:https://github.com/PRBonn/lidar-bonnetal/issues/78

转换完成后在当前文件夹下会生成对应的 kitti.bin 文件,再次通过 vscode-pc-viewer 插件打开,就是我们想看到的样子了,如下图所示:

在这里插入图片描述

图4-4 vscode-pc-viewer可视化KiTTI格式

当然你也可以查看 .pcd 格式结尾的毫米波雷达数据,如下图所示:

在这里插入图片描述

图4-5 vscode-pc-viewer可视化Radar数据

5. 点云可视化(补充)

利用 mayavi.mlab 实现点云数据的 3D 可视化

参考:读取.bin激光雷达文件格式并可视化的三种方法

示例代码如下:

import numpy as np
import mayavi.mlabfile = "./data/n015-2018-11-21-19-38-26+0800__LIDAR_TOP__1542800855949460.pcd.bin"pc = np.frombuffer(open(file, "rb").read(), dtype=np.float32)
pc = pc.reshape(-1, 5)[:, :4]x, y, z, intensity = pc.Td = np.sqrt(x**2 + y**2)    # Map Distance from sensordegr = np.degrees(np.arctan(z / d))fig = mayavi.mlab.figure(bgcolor=(0, 0, 0), size=(1280, 1280))
mayavi.mlab.points3d(x, y, z,z, # Values used for Colormode="point",colormap='spectral',figure=fig)mayavi.mlab.savefig("pointcloud.png", figure=fig)
mayavi.mlab.show()

可视化后的结果如下:

在这里插入图片描述

图5-1 激光雷达数据的三维可视化

总结

本次课程为 3D 基础,主要了解了 nuScenes 数据集,并了解了其中的激光雷达传感器采集到的数据格式,其 shape 为 [n,5],其中 n 为采集到的点云数量,5 个维度分别代表 x、y、z、intensity、ring index,利用 numpy 数据库对激光雷达的数据进行了解析,并利用 opencv、mayavi、imageio 等库对点云进行了可视化,整体效果还是比较 OK 的。
之后利用工具 vscode-pc-viewer 对激光雷达点云进行了相关可视化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53469.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python轨迹绘制:让数据可视化更易懂

Python轨迹绘制&#xff1a;让数据可视化更易懂 在数据可视化中&#xff0c;轨迹图应该是最为常见的一种类型了。轨迹图通过展示物体或用户在一定时间范围内移动的路径&#xff0c;帮助我们更加直观地理解和分析数据。 在Python中&#xff0c;我们可以使用多种库来绘制轨迹图…

chatgpt赋能python:Python坐标表示:让您的数据可视化更加精确!

Python坐标表示&#xff1a;让您的数据可视化更加精确&#xff01; 在数据可视化中&#xff0c;通过准确的坐标表示数据点的位置是非常重要的。Python作为最受欢迎的编程语言之一&#xff0c;有多种方法来表示坐标。在本文中&#xff0c;我们将深入探讨Python中坐标表示的不同…

chatgpt赋能python:Python色板介绍:让数据可视化更加迷人

Python色板介绍&#xff1a;让数据可视化更加迷人 在数据可视化中&#xff0c;合适的配色方案是非常重要的。Python色板是一种常用的工具&#xff0c;可以帮助数据分析师和科学家创建漂亮、易于阅读的图表。本文将为大家介绍Python色板&#xff0c;包括一些主流的Python色板、…

人生意义

一块蛋糕最终还是会被吃完&#xff0c;那么你吃它的目的是什么&#xff1f; 1.你不能因为一样美好的东西最终会消失而否定它的意义。 2.生命是一场馈赠。它和所有我们收到的其它礼物&#xff0c;比如蛋糕一样&#xff0c;本身并没有意义&#xff0c; 但如果你能享受它的美好…

程序员:我终于知道post和get的区别

效率工具传送门 推荐20套实战源码 程序员你可以考虑安装的15款谷歌插件 99%的人不知道搜索引擎的6个技巧 12款好用的Visual Studio插件&#xff0c;最后一款良心推荐 IT界知名的程序员曾说&#xff1a;对于那些月薪三万以下&#xff0c;自称IT工程师的码农们&#xff0c;其…

chatgpt赋能python:Python通过IP连接同一局域网中的电脑

Python通过IP连接同一局域网中的电脑 在日常工作中&#xff0c;我们常常需要在本地局域网内进行电脑之间的通信&#xff0c;这时候就需要借助一些工具来进行IP连接。而对于Python编程来说&#xff0c;实现这个过程也非常简单。 什么是IP连接 IP连接指的是使用IP地址和端口号…

chatgpt赋能python:Python获取电脑IP地址方法与实例

Python获取电脑IP地址方法与实例 什么是IP地址 IP地址是一个数字标识符&#xff0c;是指在Internet协议中用作网络接口标识和定位地址的32位二进制数&#xff0c;通常表现为四个十进制数&#xff0c;每个数用“.”分隔&#xff0c;如192.168.0.1。在不同的网络协议中&#xf…

win10计算机ip如何更改,Win10本地连接ip怎么更改_Win10怎么更改ip地址?-192路由网...

问&#xff1a;Win10本地连接IP地址怎么更改&#xff1f; 本人是电脑小白&#xff0c;新买的电脑&#xff0c;是Win10系统&#xff1b;请问Win10电脑中的IP地址在哪里更改&#xff1f; 答&#xff1a;Win10系统IP地址需要在“本地连接”的 属性 中进行更改的。所以&#xff0c;…

chatgpt赋能python:Python获得电脑IP地址

Python获得电脑IP地址 在进行网络编程时&#xff0c;通常需要获取本机的IP地址。对于Python开发者来说&#xff0c;获取电脑IP地址可能是开发过程中常见需求之一。本文将介绍如何使用Python获取电脑IP地址&#xff0c;以及其中的一些常见问题和解决方案。 什么是IP地址&#…

万字长文 | ChatGPT的工作原理(二)

— 6 — 嵌入的概念 神经网络 —— 至少在它们目前的设置中 —— 从根本上说是基于数字的。因此&#xff0c;如果我们要用它们来处理像文本这样的东西&#xff0c;我们就需要一种方法来用数字表示我们的文本。 当然&#xff0c;我们可以开始&#xff08;基本上就像 ChatGPT 那…

You don't have permission to access 权限问题

修改pip.ini配置文件如下&#xff1a; 综合搜索案例如下&#xff1a; 我遇到的情况是修改了&#xff0c;第一张图的配置&#xff0c;还是不行&#xff0c;那就是其他情况&#xff0c;虽然第二张图的这种写法&#xff0c;在线上是可以用的&#xff0c;但是在线下是不能用的&…

网络错误:windows无法访问\\,你没有权限访问\\

网络错误:windows无法访问\\&#xff0c;你没有权限访问\\ 电脑突然不能网络访问。 客户端&#xff1a;win10 服务器端&#xff1a;win2003 处理办法&#xff1a; 设置/控制面板/用户帐户/管理windows凭证 检查是否存在登录过的ip信息&#xff1a; 如果存在&#xff0c;删除…

关于访问权限控制问题

实际上Java中是有访问权限控制的&#xff0c;就是我们个人的隐私的一样&#xff0c;我不允许别人随便来查看我们的隐私&#xff0c;只有我们自己同意的情况下&#xff0c;才能告诉别人我们的名字、年龄等隐私信息。 所以说Java中引入了访问权限控制(可见性)&#xff0c;我们可…

解决“你没有权限访问,请与网络管理员联系”

局域网共享时提示你"没有权限访问&#xff0c;请与网络管理员联系请求访问权限".局域网共享无法访问被共享的文件夹。 方法/步骤 1 找到你要共享的文件夹&#xff0c;选中并且右键&#xff0c;选中属性&#xff0c;选择安全选项卡 2 点击安全选项卡下面的编辑&#x…

解决局域网共享文件时提示“没有权限访问,请与网络管理员联系请求访问权限“

在两台或者多台装有Windows中的PC之间进行大文件传输时&#xff0c;如何比较快速、便捷的传输呢&#xff1f;当时是Windows局域网共享&#xff01; 右击想要共享的文件或文件夹&#xff0c;在弹出的菜单栏选择“属性”&#xff1a; 在弹出的文档“属性”选项卡中&#xff0c;点…

智能感知编码优化与落地实践

作者 | XHF 导读 基于人眼视觉特性出发的感知编码优化技术&#xff0c;成为互联网短视频、OTT 等 UGC 场景的重点优化手段&#xff0c;可以在降低视频码率的同时&#xff0c;提升视频的观看体验。 今天主要有 4 个方面的内容。首先给大家介绍一下感知编码的技术背景&#xff1b…

诺基亚与微软完成交易 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 25 日&#xff0c;在 2005 年的今天&#xff0c;网易 CEO 丁磊确认&#xff0c;《环球企业家》原总经理兼执行主编李甬将在 5 月 1 日后正式出任网易副总裁…

英特尔锐炫™ 显卡运行类 ChatGPT 的开源大语言模型(LLM) Dolly 2.0 | 开发者实战...

点击蓝字 关注我们,让开发变得更有 前言 以下为当前一代大型语言模型&#xff08;LLM&#xff09;的基石说明。 人类偏好强化学习Reinforcement learning with human preferences&#xff08;RLHF&#xff09;和 InstructGPT 等技术一直是 ChatGPT 和 GPT-4 等突破的核心基础。…

对比Google翻译、百度翻译和有道翻译

上周&#xff0c;关于有道翻译出现了一则新闻。 网易有道上线神经网络翻译&#xff0c;质量提升超过去十年总和 我个人经常使用Google翻译(Google翻译没有被墙)。然后便对Google翻译、百度翻译和有道翻译做了个对比。 测试了句子&#xff0c;一个问号便说明了问题。