3D点云数据集制作实录【LiDAR】

news2024/11/22 7:12:42

在过去的两年里,我一直在和机器人打交道。 今年早些时候,我不再只关注相机,而是决定开始使用激光雷达。 因此,经过大量研究后,我选择了 32 束 RoboSense 设备。
在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

我不得不花一些时间来设置它,特别是创建一个合适的支架,也可以携带相机。 经过一番尝试,激光雷达终于准备好了,我宣布我爱上了这种数据。

我项目的下一步是开始开发一个系统,使用 LiDAR 点云检测和跟踪 3D 对象。 应用程序多种多样,但包括检测固定物体(建筑物、交通标志等)以创建 3D 地图,以及检测移动物体(行人、汽车等)以避免碰撞。

在开发上述任何应用程序之前,我首先需要学习如何有效地将点云数据加载到 TensorFlow(我用于深度学习的工具)中。 目前,我的数据集由 12,200 个点云图像对组成。 该图像用作背景来了解激光雷达正在观察什么。 我还对所有点云进行了预处理,以仅显示大约在相机视野内的数据,而不是原始的 360° 视图。
在这里插入图片描述

尝试将数据加载到 TensorFlow 比我预想的更具挑战性。 首先,点云存储为 PCD(点云数据)文件,这是一种用于存储 3D 点云数据的文件格式。 TensorFlow 无法直接处理这种类型的文件,因此需要进行转换。 Open3D 库是一个易于使用的点云操作工具。 使用此工具,我可以轻松加载 PCD 文件并将点提取为 X、Y 和 Z 坐标的 NumPy 数组。 另一个工具 NSDT 3DConvert用于可视化PCD点云并确认在 Google Colab 上正确提取了点:
在这里插入图片描述

https://3dconvert.nsdt.cloud

有了新工具,我将 12,200 个 PCD 和 12,200 个 JPG 上传到我的 Google Drive,并将其连接到 Google Colab。 然后,我创建了一些代码来加载 PCD、提取点并将它们放入 NumPy 数组中,这是 TensorFlow 可以轻松处理的结构。 我自信地运行了代码,并惊恐地看到,等待几分钟后,Colab 抱怨在转换点云时内存不足。 坏消息,因为我计划收集和处理比目前更多的数据。

幸运的是,这是处理大型数据集时的常见问题,而 TensorFlow 等工具具有处理此类情况的功能。 所需的解决方案是 Dataset API,它提供了创建高效输入管道的方法。 引用API的文档:数据集的使用遵循一个常见的模式:

  • 根据你的输入数据创建源数据集。
  • 应用数据集转换来预处理数据。
  • 迭代数据集并处理元素。
  • 迭代以流式传输的方式进行,因此完整的数据集不需要装入内存。

因此,本质上,Dataset API 将允许我创建一个管道,并且数据将根据 TensorFlow 中的训练循环的请求分部分加载,从而避免内存不足。 因此,我回顾了如何使用 API,并创建了一些代码来构建数据管道。 按照上述模式的步骤 1,代码首先加载所有 PCD 和图像的 URL 列表,然后在步骤 2 中,加载 PCD 并将其转换为 NumPy 中的点,然后加载图像并对其进行标准化。 但这时候我又遇到了麻烦。

为了提高效率,Dataset API 中的所有内容(显然还有所有 TensorFlow API)都作为图中的张量运行。 Dataset API 提供了从不同格式加载数据的函数,但没有用于 PCD 的函数。 在研究了不同的可能解决方案后,我决定不再将数据作为多个 PCD 和 JPEG 文件并让 TensorFlow 加载并预处理它们,而是离线预处理所有数据,并将其打包到 HDF5 文件中 。

HDF5 是一种开源文件格式,支持大型、复杂、异构数据。 我显然已经验证了 Dataset API 支持这种类型的文件。 使用这种格式的主要优点除了可以很好地使用 TensorFlow 之外,还在于我可以将所有数据打包到一个结构良好的大文件中,以便我可以轻松移动。 我创建了一个简单的 Python 脚本来加载所有 PCD、提取点,并将它们与相应的上下文文件一起打包到一个漂亮的 HDF5 文件中。

def generate_hdf5_dataset_with_padding(path, run_name, hdf5_filename):

	# Build main path
	path = join(path, run_name)
	
	# Get files
	jpgs = sorted(glob.glob(path+"/jpg/*.jpg"))
	pcds = sorted(glob.glob(path+"/pcd/*.pcd"))

	# Open HDF5 file in write mode
	with h5py.File(hdf5_filename, 'w') as f:
		
		images = []
		point_clouds = []
		
		# Determine the size of largest point cloud for padding
		max_size = 0

		for i, jpg in enumerate(jpgs):

			base_name = jpg[jpg.rfind("/")+1:jpg.find(".jpg")]

			# Load the image
			image = cv2.cvtColor(cv2.imread(jpgs[i]), cv2.COLOR_BGR2RGB) 
			images.append(image)

		
			# Load the point cloud
			cloud = o3d.io.read_point_cloud(pcds[i])
			points= np.asarray(cloud.points)
			point_clouds.append(points)
			
			# Keep track of largest size
			if points.shape[0] > max_size:
				max_size = points.shape[0]
			
			if ((i+1) % 1000 == 0):
				print("Processed ",(i+1)," pairs of files.")
				
		print("Max size ", max_size)
		print("Padding ...")

		# Pad the point clouds with 0s
		padded_point_clouds = []
		for points in point_clouds:
			pad_amount = max_size - points.shape[0]
			
			points_padded = np.pad(points, ((0, pad_amount),(0, 0)), 'constant', constant_values=(0, 0))
			padded_point_clouds.append(points_padded)

		# Create an images and a point clouds dataset in the file
		f.create_dataset("images", data = np.asarray(images))
		f.create_dataset("point_clouds", data = np.asarray(padded_point_clouds))
		
	print("Done!")

将 HDF5 文件(约 18 GB)加载到我的 Drive 中后,我返回 Colab 并添加相应的数据集 API 代码。 本质上,该模式的第 1 步从 HDF5 文件加载图像和点并创建相应的对,第 2 步从点云中随机选择一些点(我将在后面的文章中解释原因),并对图像进行归一化, 步骤 3 已准备好根据请求很好地提供数据。

def resize_and_format_data(points, image):

  # Sample a random number of points
  idxs = tf.range(tf.shape(points)[0])
  ridxs = tf.random.shuffle(idxs)[:SAMPLE_SIZE]
  points = tf.gather(points, ridxs)

  # Normalize pixels in the input image
  image = tf.cast(image, dtype=tf.float32)
  image = image/127.5
  image -= 1
  
  return points, image

def get_training_dataset(hdf5_path):
  # Get the point clouds
  x_train = tfio.IODataset.from_hdf5(hdf5_path, dataset='/point_clouds')
  # Get the images
  y_train = tfio.IODataset.from_hdf5(hdf5_path, dataset='/images')
  # Zip them to create pairs
  training_dataset = tf.data.Dataset.zip((x_train,y_train))
  # Apply the data transformations
  training_dataset = training_dataset.map(resize_and_format_data)
  
  # Shuffle, prepare batches, etc ...
  training_dataset = training_dataset.shuffle(100, reshuffle_each_iteration=True)
  training_dataset = training_dataset.batch(BATCH_SIZE)
  training_dataset = training_dataset.repeat()
  training_dataset = training_dataset.prefetch(-1)

  # Return dataset
  return training_dataset

我使用非常基本的训练代码尝试了数据管道,效果非常好。 不再出现内存不足错误。 我不确定这是否是提供数据的最有效方法,但它确实成功了,特别是,创建管道是点云数据操作的第一个很好的练习。 接下来,使用点云训练第一个 TensorFlow 模型。


原文链接:制作3D点云数据集 — BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch深度分页解决方案

文章目录 概要ElasticSearch介绍es分页方法es分页性能对比表方案对比 From/Size参数深度分页问题Scroll#性能对比向前翻页 总结个人思考 概要 好久没更新文章了,最近研究了一下es的深分页解决方案。和大家分享一下,祝大家国庆节快乐。 ElasticSearch介…

记一次 .NET 某拍摄监控软件 卡死分析

一:背景 1. 讲故事 今天本来想写一篇 非托管泄露 的生产事故分析,但想着昨天就上了一篇非托管文章,连着写也没什么意思,换个口味吧,刚好前些天有位朋友也找到我,说他们的拍摄监控软件卡死了,让…

Android Shape设置背景

设置背景时&#xff0c;经常这样 android:background“drawable/xxx” 。如果是纯色图片&#xff0c;可以考虑用 shape 替代。 shape 相比图片&#xff0c;减少资源占用&#xff0c;缩减APK体积。 开始使用。 <?xml version"1.0" encoding"utf-8"?…

【STM32单片机】u8g2智能风扇设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED模块、DS18B20温度传感器、直流电机、红外遥控等。 主要功能&#xff1a; 初始化后进入温度显示界面&#xff0c;系统初始状态为手动…

探索视听新纪元: ChatGPT的最新语音和图像功能全解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f916; 人工智能 AI: &#x1f9e0; Machine …

【我的创作纪念日】使用pix2pixgan实现barts2020数据集的处理(完整版本)

使用pix2pixgan &#xff08;pytorch)实现T1 -> T2的基本代码 使用 https://github.com/eriklindernoren/PyTorch-GAN/ 这里面的pix2pixgan代码进行实现。 进去之后我们需要重新处理数据集&#xff0c;并且源代码里面先训练的生成器&#xff0c;后训练鉴别器。 一般情况下…

亚马逊要求的UL报告的产品标准是什么?如何区分

亚马逊为什么要求电子产品有UL检测报告&#xff1f; 首先&#xff0c;美国是一个对安全要求非常严格的国家&#xff0c;美国本土的所有电子产品生产企业早在很多年前就要求有相关安规检测。 其次&#xff0c;随着亚马逊在全球商业的战略地位不断提高&#xff0c;境外的电子设…

百度资源搜索平台出现:You do not have the proper credential to access this page.怎么办?

Forbidden site not allowed You do not have the proper credential to access this page. If you think this is a server error, please contact the webmaster. 如果你的百度资源平台&#xff0c;点进去出现这个提示&#xff0c;说明您的网站已经被百度清退了。 如果你的网…

队列的分类及用途

队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;用于存储和管理数据元素。队列通常遵循先进先出&#xff08;FIFO&#xff0c;First-In-First-Out&#xff09;的原则&#xff0c;这意味着最早添加到队列的元素将首先被移除。队列有不同的类型和用途&#x…

VS code本地安装PlantUML

VS code本地安装PlantUML 需要条件vs code安装插件使用常见错误 需要条件 在VS Code上安装PlantUML扩展之前&#xff0c;请确保您具有以下先决条件: : Java与GraphViz(点击可直接跳转下载界面); 安装省略 vs code安装插件 vs code安装以下两个插件&#xff08;PlantUML,Grap…

易云维®智慧工厂数字化管理平台助推工业制造企业数字化转型新动能

近年来&#xff0c;我国正在积极推进工业制造企业数字化转型&#xff0c;工业制造企业数字化转型迎来了密集的利好政策&#xff0c;近期&#xff0c;国家工信部又出台系列政策&#xff0c;实施工业制造企业数字化促进工程&#xff0c;推动工业制造企业更快更好地拥抱数字经济。…

数字安全设备制造有哪几种方式?

数字安全设备制造是指制造用于保护数字信息系统和网络安全的专用设备。以下是几种常见的数字安全设备制造方式&#xff1a; 集成式安全设备制造&#xff1a;集成式安全设备制造是将多种安全功能集成到单一的硬件设备或软件平台中。这种制造方式可以大大降低设备的成本和复杂性&…

vue3 + vite3 addRoute 实现权限管理系统

vue3 vite3 addRoute 实现权限控制 1、前言2、静态路由3、动态路由4、在组建中使用路由5、注意事项 1、前言 在权限系统开发中&#xff0c;根据后端返回的菜单列表动态添加路由是非常常见的需求&#xff0c;它可以实现根据用户权限动态加载可访问的页面。本篇文章我们将重点介…

第二届全国高校计算机技能竞赛——Java赛道

第二届全国高校计算机技能竞赛——Java赛道 小赛跳高 签到题 import java.util.*; public class Main{public static void main(String []args) {Scanner sc new Scanner(System.in);double n sc.nextDouble();for(int i 0; i < 4; i) {n n * 0.9;}System.out.printf(&…

探索公共厕所的数字化治理,智慧公厕完善公共厕所智能化的治理体系

随着城市化进程的不断发展&#xff0c;公共厕所治理成为一个不容忽视的问题。如何通过数字化手段来提升公共厕所管理水平&#xff0c;成为了一个备受关注的话题。本文将以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量精品案例项目实景实图&#xff0c;探讨公共厕所数…

品牌线上假货怎么治理

随着品牌的发展&#xff0c;母婴、家电、百货等行业&#xff0c;链接量暴增&#xff0c;销售店铺也较多&#xff0c;线上仅通过图片销售的形式&#xff0c;也导致了假货链接地滋生&#xff0c;假货分两种情况&#xff0c;一种是只销售假货的店铺&#xff0c;一种是真假混卖的店…

用numpy生成18种特殊数组

文章目录 单值数组特殊矩阵范德蒙德矩阵数值范围坐标网格绘图代码 所有创建数组的函数中&#xff0c;都有一个可选参数dtype&#xff0c;表示创建的数组的数据类型。 指定维度empty, eye, identity, ones, zeros, full模仿维度empty_like, ones_like, zeros_like, full_like特…

【Linux】C语言实现对文件的加密算法

异或加密 解密方式是进行第二次加密后自动解密 #define BUF_SIZE (16384) //16k /************************************************************** 功能描述: 加密实现 输入参数: --------------------------------------------------------------- 修改作者: 修改日期…

【小尘送书-第五期】《巧用ChatGPT快速提高职场晋升力》用ChatGPT快速提升职场能力,全面促进自身职业发展

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

qq录屏快捷键大全,玩转录制就这么简单(干货)

“qq有录屏快捷键吗&#xff1f;有点好奇&#xff0c;现在用qq录制屏幕&#xff0c;总是得去点击屏幕录制才可以出来&#xff0c;太麻烦了&#xff0c;如果可以通过快捷键的方式打开&#xff0c;会轻松许多&#xff0c;想问问大家&#xff0c;知道qq录屏快捷键是多少吗&#xf…