一、下载
论文地址:arxiv.org/pdf/2203.01509v1.pdf
文献翻译:(引用)【文献翻译CVPR2022】SoftGroup for 3D Instance Segmentation on Point Clouds-CSDN博客
二、环境配置
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 上下文管理器可以简化混合精度训练的实现,减少手动精度转换的工作量,并提供了一种灵活的方式来加速模型训练。

535

被折叠的 条评论
为什么被折叠?



