Ubuntu18.04复现RandLA-Net(SemanticKITTI数据集)----2.代码复现

文章详细介绍了如何在Ubuntu18.04上下载和配置RandLA-Net项目及SemanticKITTI数据集,包括数据集的文件结构、环境激活、所需包的安装、数据体素化处理和模型训练。此外,还提到了使用GPU进行训练的监控以及PyCharm的安装用于项目管理。
摘要由CSDN通过智能技术生成

接着上一篇文章:

Ubuntu18.04复现RandLA-Net(SemanticKITTTI数据集)----1.环境配置_努力弹琴的大风天的博客-CSDN博客

1.RandLA项目和SemanticKITTI数据集下载

1.1RandLA-Net项目下载

RandLA-Net项目链接:

https://github.com/QingyongHu/RandLA-Net/tree/master

进入项目直接点击code下面的Download ZIP

 下载完成之后,解压放到桌面上,以下是这个项目包含的内容:

1.2 SemanticKITTI数据集下载

下载链接:SemanticKITTI - A Dataset for LiDAR-based Semantic Scene Understanding

直接拉到网页最下面Download为止,下载Velodyne point clouds、calibration data和labeldata三个包。

下载完成后,是3个以data开头的压缩文件:

 1.3数据集文件夹结构

在项目中创建RandLA-Net-master/data/semantic_kitti/dataset/sequences文件夹

将前述KITTI Odometry Benchmark Velodyne point clouds (80 GB), KITTI Odometry Benchmark calibration data (1 MB) 和 SemanticKITTI label data (179MB)等数据集整理为如下结构形式:

dataset
  ├── sequences
  │ ├── 00
  │ │ ├── velodyne
  │ │ │ ├── 000000.bin
  │ │ │ ├── 000001.bin
  │ │ │ └── ...
  │ │ ├── labels
  │ │ │ ├── 000000.label
  │ │ │ ├── 000001.label
  │ │ │ └── ...
  │ │ ├── calib.txt
  │ │ ├── poses.txt
  │ │ └── times.txt
  │ ├── 01
  │ │ ├── velodyne
  │ │ ├── labels
  │ │ ├── calib.txt
  │ │ ├── poses.txt
  │ │ └── times.txt
  │ └── ...

下图是我项目中整理好的结果:

2.复现

上一篇文章中已经创建好环境,现在开始安装项目需要的包。

首先,激活创建好的环境:

conda activate randlanet

激活之后,进入到环境中:

RandLA-Net-master中有一个helper_requirements.txt是项目需要的包,按照下面内容进行修改。

numpy
h5py==2.10.0
cython==0.29.15
open3d-python==0.3.0
pandas==0.25.3
scikit-learn==0.21.3
scipy==1.4.1
PyYAML

在终端运行安装命令,安装这些包:

pip install -r helper_requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple  --timeout=120

安装完成之后,编译一下:

sh compile_op.sh

然后,直接在RandLA-Net-master中运行项目:

  • Preparing the dataset:

打开RandLA-Net-master项目中utils/data_prepare_semantickitti.py文件,在第20和21行,路径/data前面加一个.表示当前文件夹下:

  • 00~21总共22个序列,处理时间视计算机性能而定,半个小时到一个小时左右

 运行:

python utils/data_prepare_semantickitti.py

运行之后会一直准备数据,占用内存比较大,装系统的时候提前分配大一点的内存给/home。utils/data_prepare_semantickitti.py文件第20行和21行分别是SemanticKITTI源数据集和输出数据集路径。准备数据就是将原始数据体素化,体素化将三维空间划分为一系列的体素,类似于二维图像的像素,体素是三维空间中的像素,通过体素化简化点云数据的处理难度(处理每个体素数据比直接处理电云数据要简单的多)。grid_size=0.06意味着每个体素大小是0.06m x 0.06m x 0.06m,每个体素的边长是0.06米。

体素化完成后,会在RandLA-Net-master/data/semantic_kitti/dataset文件夹下形成一个178.7G左右的文件夹sequences_0.06。

  • Start training:
python main_SemanticKITTI.py --mode train --gpu 0

训练过程中,数据量很大,分成不同的batch依次放入网络中进行训练;一个epoch,即整个训练集训练一遍,需要4750个batch。训练完成后,代码会自动进行一次评估,显示mIoU(平均交并比)和平均准确率(eval accuracy)以及每一类的交并比。(注意:使用GPU训练,速度是非比cpu训练快的,我3060显卡,batch_size=4。一个小时2个epoch.如果训练速度很慢,说明你环境没有配置好,是在用cpu训练

训练过程中,查看gpu占用情况:

watch -n 2 nvidia-smi

 可以看到使用GPU训练,显卡占用是很大的。我用的是3060的显卡,总共训练99个epoch(在RandLA-Net-master/helper_tool.py中,显示有训练的最大epoch数)。

训练一遍用了54个小时左右,训练结束后,会自动停止:

  • Evaluation:

使用如下命令:

sh jobs_test_semantickitti.sh

评估过程会将训练时,形成的results/Log*/snapshots/*文件夹中恢复数据进行评估:

  • Vision

结果的可视化命令:

# 可视化指定区域  区域可设置为 08, 11,12,13,14,15,16,17,18,19,20,21
python main_SemanticKITTI.py --gpu 0 --mode VIS --test_area 16

# 随机区域可视化
python main_SemanticKITTI.py --gpu 0 --mode VIS
  • 终端命令: 

  • 可视化结果(随机选取的几个图片结果):

注意:鼠标定位在可视化结果界面,按H键,在终端显示帮助信息

 

pycharm安装:

安装pycharm去管理这个项目。

在Ubuntu Software中,搜索pycharm,安装社区版本,这个版本是免费的。

安装完成后,打开项目,进行管理。

参考:

环境感知算法——1.简介与GPU驱动、CUDA和cudnn配置_环境感知需要哪些算法-CSDN博客

环境感知算法——4.RandLA-Net基于SemanticKITTI训练-CSDN博客

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
RandLA-Net是一种基于点云数据的深度学习模型,用于点云分割和场景理解。下面是使用PyTorch实现RandLA-Net的简单步骤: 1. 安装依赖库 在Python环境中安装以下库: - PyTorch - NumPy - Open3D - Scikit-learn 其中PyTorch是必须的,其余库是为了可视化和数据预处理。 2. 下载数据集 下载点云数据集,例如S3DIS数据集,该数据集包含了用于建筑物场景的点云数据。可以从官方网站下载数据集。 3. 数据预处理 使用Open3D库读取点云数据并进行预处理。具体来说,可以使用Open3D库将点云数据转换为numpy数组,然后将其分为小的块,以便在GPU上进行训练。 ```python import open3d as o3d import numpy as np import os def load_data(path): pcd = o3d.io.read_point_cloud(path) points = np.asarray(pcd.points) return points def process_data(points, block_size=3.0, stride=1.5): blocks = [] for x in range(0, points.shape[0], stride): for y in range(0, points.shape[1], stride): for z in range(0, points.shape[2], stride): block = points[x:x+block_size, y:y+block_size, z:z+block_size] if block.shape[0] == block_size and block.shape[1] == block_size and block.shape[2] == block_size: blocks.append(block) return np.asarray(blocks) # Example usage points = load_data("data/room1.pcd") blocks = process_data(points) ``` 这将生成大小为3x3x3的块,每个块之间的距离为1.5。 4. 构建模型 RandLA-Net是一个基于点云的分割模型,它使用了局部注意力机制和多层感知器(MLP)。这里给出一个简单的RandLA-Net模型的实现: ```python import torch import torch.nn as nn class RandLANet(nn.Module): def __init__(self, input_channels, num_classes): super(RandLANet, self).__init__() # TODO: Define the model architecture self.conv1 = nn.Conv1d(input_channels, 32, 1) self.conv2 = nn.Conv1d(32, 64, 1) self.conv3 = nn.Conv1d(64, 128, 1) self.conv4 = nn.Conv1d(128, 256, 1) self.conv5 = nn.Conv1d(256, 512, 1) self.mlp1 = nn.Sequential( nn.Linear(512, 256), nn.BatchNorm1d(256), nn.ReLU(), nn.Linear(256, 128), nn.BatchNorm1d(128), nn.ReLU(), nn.Linear(128, num_classes), nn.BatchNorm1d(num_classes) ) def forward(self, x): # TODO: Implement the forward pass x = self.conv1(x) x = self.conv2(x) x = self.conv3(x) x = self.conv4(x) x = self.conv5(x) x = torch.max(x, dim=-1)[0] x = self.mlp1(x) return x ``` 这个模型定义了5个卷积层和一个多层感知器(MLP)。在前向传递过程中,点云数据被送入卷积层,然后通过局部最大池化层进行处理。最后,通过MLP将数据转换为预测的类别。 5. 训练模型 在准备好数据和模型之后,可以使用PyTorch的内置函数训练模型。这里使用交叉熵损失函数和Adam优化器: ```python import torch.optim as optim device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # TODO: Initialize the model model = RandLANet(input_channels=3, num_classes=13).to(device) # TODO: Initialize the optimizer and the loss function optimizer = optim.Adam(model.parameters(), lr=0.001) loss_fn = nn.CrossEntropyLoss() # TODO: Train the model for epoch in range(num_epochs): running_loss = 0.0 for i, batch in enumerate(train_loader): # Move the batch to the GPU batch = batch.to(device) # Zero the gradients optimizer.zero_grad() # Forward pass outputs = model(batch) loss = loss_fn(outputs, batch.labels) # Backward pass and optimization loss.backward() optimizer.step() # Record the loss running_loss += loss.item() # Print the epoch and the loss print('Epoch [%d], Loss: %.4f' % (epoch+1, running_loss / len(train_loader))) ``` 这里使用Adam优化器和交叉熵损失函数进行训练。训练完成后,可以使用预测函数对新数据进行分类: ```python def predict(model, data): with torch.no_grad(): # Move the data to the GPU data = data.to(device) # Make predictions outputs = model(data) _, predicted = torch.max(outputs.data, 1) # Move the predictions back to CPU predicted = predicted.cpu().numpy() return predicted # Example usage data = load_data("data/room2.pcd") data = process_data(data) data = torch.from_numpy(data).float().permute(0, 2, 1) predicted = predict(model, data) ``` 这将返回点云数据的分类预测。
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值