从零部署点云实例分割项目SoftGroup

一、下载 

论文地址:arxiv.org/pdf/2203.01509v1.pdf

文献翻译:(引用)【文献翻译CVPR2022】SoftGroup for 3D Instance Segmentation on Point Clouds-CSDN博客 

Github地址:thangvubk/SoftGroup: [CVPR 2022 Oral] SoftGroup for Instance Segmentation on 3D Point Clouds (github.com)

二、环境配置

conda create -n softgroup python=3.7
conda activate softgroup

pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116    # 这里选择与自己电脑cuda匹配的版本
pip install spconv-cu116
pip install -r requirements.txt
sudo apt-get install libsparsehash-dev

# 安装外部扩展
python setup.py build_ext develop
报错:TypeError: expected string or bytes-like object,找到报错的那一行代码,在version外面加上str()

cd SoftGroup

三、数据准备——本文以S3DIS数据集为例

 下载 Stanford3dDataset_v1.2数据集,网盘可参考

S3DIS场景点云数据集_s3dis/stanford3ddataset_v1.2_aligned_version-CSDN博客

放在SoftGroup/dataset/s3dis目录下

cd dataset/s3dis
bash prepare_data.sh

预处理后数据解析】:

preprocess/*.pth:内部为一个元组,总共有6个元素。

第一个元素是一个维度为(N, 3)的数组,为点云三维坐标;

第二个元素是一个维度为(N, 3)的数组,为归一化到[-1, 1]的点云rgb颜色;

第三个元素是一个维度为(N, 1)的数组,为该场景内该点云每个点的语义标签;

第四个元素是一个维度为(N, 1)的数组,为该场景内该点云每个点的实例标签,-100为ignore_label;

第五个元素是一个维度为(1, 1)的数组,为该场景的空间类型编号(例如 洗手间5/办公室3等);

第六个元素是一个字符串,为该场景的具体名字,如Area_1_conferenceRoom_1,标识该场景所在区域是Area_1,该场景是一个conferenceRoom,且序号是1;

preprocess_sample/*.pth:存储数据同上,区别在于将点云做了随机采样。

val_gt/*.txt:是一个维度为(N, 1)的数组,N为该场景房间的点总个数,存放着这个房间所有点的标签值(计算方式=(语义标签+1)*1000 + 实例标签 +1,例如3001=(2+1)*1000 + 2 + 1)

四、代码分析

Dataset——S3DISDataset

Dataloader——torch.utils.data.DataLoader

Model——SoftGroup

Optimizer——torch.optim.Adam

Scheduler——

Loss——F.cross_entropy交叉熵函数

五、训练流程分析

1.使用预训练模型进行训练

(1)下载预训练模型

https://drive.google.com/file/d/1FABsCUnxfO_VlItAzDYAwurdfcdK-scs/view?usp=sharing

将该模型放在SoftGroup/目录下。

(2)修改若干配置

学习率:./configs/softgroup/softgroup_s3dis_backbone_fold5.yaml中的optimizer.lr改为0.001(与GPU个数相同)

分割场景:./configs/softgroup/softgroup_s3dis_backbone_fold5.yaml中的x4_split改为False(如果为True的话,后续会报错)

(3)基于dist_train.sh进行第一步训练——对backbone进行finetune

./tools/dist_train.sh configs/softgroup/softgroup_s3dis_backbone_fold5.yaml 1

(4)修改若干代码

①在softgroup/model/softgroup.py文件的cur_proposals_idx = proposals_idx[mask_inds].long()之前加入一行,proposals_idx = proposals_idx.to(mask_inds.device)

(5)基于dist_train.sh进行第二步训练——使用冻结的backbone进行训练

其中 ,将configs/softgroup/softgroup_s3dis_fold5.yaml文件中的pretrain值改为上一步训练结束后产生的.pth文件

./tools/dist_train.sh configs/softgroup/softgroup_s3dis_fold5.yaml 1

2.从头开始训练

ToDo

六、推理流程分析

./tools/dist_test.sh configs/softgroup/softgroup_s3dis_fold5.yaml work_dirs/softgroup_s3dis_fold5/latest.pth 1 --out=output_folder/

之后便可在output_folder目录下看到一系列输出,其中,预测的实例标签被分为一个个文件,独立存储。

七、外部知识扩展

1.from munch import Munch

Munch是一个Python库,它可以将字典和对象结合在一起,使得可以像访问属性一样访问字典的键和值。

Munch库的主要作用是将字典转换为一个可访问的对象,以便可以使用点号(.)语法来访问其中的键和值。这样可以使代码更简洁、可读性更高。

2.torch.cuda.amp.GradScaler

torch.cuda.amp.GradScaler 是 PyTorch 中的一个工具类,用于在混合精度训练中缩放梯度。混合精度训练是一种训练技术,通过使用较低精度的数值表示来加速模型训练,同时保持模型的相对准确性。

GradScaler 的作用是处理和管理使用混合精度训练时的梯度缩放。在混合精度训练中,将一部分操作(例如权重更新)以较低的精度执行,可以减少计算和内存开销,并加快训练速度。然而,较低的精度也可能导致梯度下降过大,从而使训练过程不稳定。

GradScaler 可以自动缩放梯度,以便在梯度计算和梯度更新之间保持数值范围的稳定性。它通过将梯度乘以一个缩放因子来实现这一点,然后在更新权重之前将其恢复到原始范围。GradScaler 还可以处理 NaN 和 Inf 值,以确保训练的数值稳定性。

使用 GradScaler,可以简化混合精度训练的代码实现,并提高训练的稳定性和效率。

3.torch.cuda.amp.autocast

torch.cuda.amp.autocast 是 PyTorch 中的一个上下文管理器,用于自动混合精度训练。在这个上下文中,所有位于其中的操作都会自动进行混合精度计算。

混合精度计算是指在训练过程中使用较低的数值精度(如半精度浮点数)来加速计算,同时尽量保持数值精度的一致性。这种技术可以在保持模型精度的同时,减少计算和存储开销,从而提高训练速度。

使用 torch.cuda.amp.autocast 上下文管理器,可以将需要进行混合精度计算的操作包裹在其中。在这个上下文中,PyTorch 会根据输入的数据类型自动选择合适的数值精度来进行计算,例如将 float32 类型的输入转换为 float16 类型。这些操作将自动进行缩放和转换,以在不损失显著精度的情况下加快计算。

使用 torch.cuda.amp.autocast 上下文管理器可以简化混合精度训练的实现,减少手动精度转换的工作量,并提供了一种灵活的方式来加速模型训练。

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值