ubuntu18.04 RTX3060 rangnet++训练 bonnetal语义分割

代码链接: https://github.com/PRBonn/lidar-bonnetal
安装anaconda环境为
CUDA 11.0(11.1也可以)

anaconda环境如下

numpy==1.17.2 
torchvision==0.2.2
matplotlib==2.2.3
tensorflow==1.13.1
scipy==0.19.1
pytorch==1.7.1
vispy==0.5.3
opencv_python==4.1.0.25
opencv_contrib_python==4.1.0.25
Pillow==6.1.0
PyYAML==5.1.1

修改anaconda,换源

gedit ~/.condarc 

更换文件信息

channels:
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - defaults
show_channel_urls: true
default_channels:
  - http://mirrors.aliyun.com/anaconda/pkgs/main
  - http://mirrors.aliyun.com/anaconda/pkgs/r
  - http://mirrors.aliyun.com/anaconda/pkgs/msys2
custom_channels:
  conda-forge: http://mirrors.aliyun.com/anaconda/cloud
  msys2: http://mirrors.aliyun.com/anaconda/cloud
  bioconda: http://mirrors.aliyun.com/anaconda/cloud
  menpo: http://mirrors.aliyun.com/anaconda/cloud
  pytorch: http://mirrors.aliyun.com/anaconda/cloud
  simpleitk: http://mirrors.aliyun.com/anaconda/cloud

安装指令

conda install numpy==1.17.2   Pillow==6.1.0 PyYAML==5.1.1 matplotlib==2.2.3 vispy==0.5.3

其中pytorch、torchvision、torchaudio、一起安装。指令如下

conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch

安装和查看python opencv版本 指令

pip install opencv-python==4.1.0.25
pip install opencv-contrib-python==4.1.0.25

python
import cv2
cv2.__version__
或者
conda list

下载数据集链接
官方地址:http://www.semantic-kitti.org/dataset.html#overview

其中80G激光雷达数据的链接:https://pan.baidu.com/s/1OjoWrwE8xIrCmYO2hujJNw 提取码:6381
标签数据在官方地址第三个的179M。

在这里插入图片描述
参考博客:https://blog.youkuaiyun.com/BIT_HXZ/article/details/123539476
将80G的激光雷达数据文件和标签文件放在一起,(只取前10个数据)如下图所示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行训练指令如下

cd xx/xx/xx/semantic
mkdir log
./train.py -d dataset/ -ac config/arch/darknet21.yaml -l log

运行可能有bug,修改文件 lidar-bonnetal-master/train/tasks/semantic/dataset/kitti/parser.py
将unproj_xyz[:unproj_n_points] = torch.from_numpy(scan.points)
改为unproj_xyz[:unproj_n_points] = torch.Tensor(scan.points)

有好几处
torch.from_numpy改为torch.Tensor

Bonnetal语义分割方法并未直接提及于所提供的引用中,但从描述来看,可能与RangeNet++或其他类似的点云语义分割技术存在一定的关联。以下是关于如何实现一种类似于Bonnetal语义分割的方法的详细介绍: ### 方法概述 Bonnetal语义分割方法通常涉及将三维点云数据转化为适合深度学习模型处理的形式,并利用高效的神经网络架构完成语义分割任务。以下是一个通用的实现流程。 --- ### 数据预处理 #### 点云到距离图像的转换 为了便于使用二维卷积神经网络(CNN)进行特征提取,需将原始点云数据投影至球面上并生成距离图像(Range Image)。此过程可以通过如下公式实现[^1]: \[ \text{Range} = \sqrt{x^2 + y^2 + z^2} \] 其中 \(x, y, z\) 表示点的空间坐标。通过这种方式,可将不规则分布的点云数据结构化为固定大小的距离图像。 ```python import numpy as np def point_cloud_to_range_image(points, H=64, W=900): """ 将点云转换为范围图像 (Range Image) 参数: points: N x 3 的数组表示点云 (x, y, z) H: 输出高度 W: 输出宽度 返回: range_image: 距离图像矩阵 """ # 计算极坐标角度 azimuth_angle = np.arctan2(points[:, 1], points[:, 0]) elevation_angle = np.arcsin(points[:, 2] / np.linalg.norm(points, axis=1)) # 映射到像素位置 u = ((azimuth_angle - (-np.pi)) / (2 * np.pi) * W).astype(int) v = ((elevation_angle - (-np.pi/2)) / np.pi * H).astype(int) # 创建距离图像 range_image = np.zeros((H, W), dtype=np.float32) valid_indices = (u >= 0) & (u < W) & (v >= 0) & (v < H) u_valid, v_valid = u[valid_indices], v[valid_indices] ranges = np.sqrt(np.sum(points[valid_indices]**2, axis=1)) range_image[v_valid, u_valid] = ranges return range_image ``` --- ### 特征提取与预测 #### 使用二维卷积神经网络 一旦获得了距离图像,即可采用标准的二维 CNN 架构来提取特征并执行分类任务。RangeNet++ 中使用的是一种轻量化设计的 ResNet 结合 ASPP 模块以增强上下文感知能力。 ```python from tensorflow.keras import layers, models def create_cnn_model(input_shape=(64, 900, 1)): model = models.Sequential() model.add(layers.Conv2D(64, kernel_size=3, activation='relu', input_shape=input_shape)) model.add(layers.MaxPooling2D(pool_size=(2, 2))) model.add(layers.Conv2D(128, kernel_size=3, activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(512, activation='relu')) model.add(layers.Dense(num_classes, activation='softmax')) # num_classes 是类别数量 return model ``` --- ### 后处理优化 由于投影过程中可能存在信息损失以及卷积操作引入的模糊效应,因此需要额外的后处理步骤以提升最终分割精度。具体而言,可通过最近邻插值等方式补充缺失点的信息[^4]。 ```python def post_process(range_image, predicted_labels, original_points): """ 对预测结果进行后处理 参数: range_image: 输入的距离图像 predicted_labels: 预测标签矩阵 original_points: 原始点云列表 返回: final_labels: 完整点云对应标签 """ final_labels = [] for i, point in enumerate(original_points): uv_coords = calculate_uv(point) # 获取当前点在 Range Image 上的位置 if is_within_bounds(uv_coords): # 判断是否超出边界 label = predicted_labels[uv_coords[1], uv_coords[0]] else: label = find_nearest_neighbor_label(predicted_labels, uv_coords) final_labels.append(label) return final_labels ``` --- ### 总结 上述方法综合了 Bonnetal 类似的思想和技术细节,涵盖了从数据准备、特征提取到后处理的关键环节。值得注意的是,在实际应用中还需针对特定场景调整超参数及网络配置以达到最佳性能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值