PointNet++模型诞生于2017年,是一种将PointNet递归地应用于输入点集的嵌套分区的分层神经网络。通过度量空间距离,PointNet能够随着上下文尺度的增加而学习局部特征。实验表明,PointNet++能够高效、稳健地学习深度点集特征。
论文:Qi, Charles R., et al. "Pointnet++: Deep hierarchical feature learning on point sets in a metric space." arXiv preprint arXiv:1706.02413 (2017).
PointNet++由多级set abstraction组成。每级set abstraction中,通过对一组点云集的处理和抽象,生成一个带有局部特征的新点云集。set abstraction由三个关键层组成:采样层、组合层和PointNet层。采样层从输入的点云中选择一个点来作为局部区域的中心点。然后,分组层通过在中心点周围找到相邻点来构建局部区域集。PointNet层使用迷你PointNet模型对局部区域集进行局部特征提取。
使用的数据集:已对齐的ModelNet40
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
# 运行单机训练
bash scripts/run_standalone_train.sh [DATA_PATH] [SAVE_DIR] [PRETRAINDE_CKPT(optional)]
# 示例:
bash scripts/run_standalone_train.sh modelnet40_normal_resampled save pointnet2.ckpt
# 运行分布式训练
bash scripts/run_distributed_train.sh [RANK_TABLE_FILE] [DATA_PATH] [SAVE_DIR] [PRETRAINDE_CKPT(optional)]
# 示例:
bash scripts/run_distributed_train.sh hccl_8p_01234567_127.0.0.1.json modelnet40_normal_resampled save pointnet2.ckpt
# 评估
bash scripts/run_eval.sh [DATA_PATH] [CKPT_NAME]
# 示例:
bash scripts/run_eval.sh modelnet40_normal_resampled pointnet2.ckpt
在GPU上训练模型
# 运行单机训练
bash scripts/run_standalone_train_gpu.sh [DATA_PATH] [SAVE_DIR] [PRETRAINDE_CKPT(optional)]
# 示例:
bash scripts/run_standalone_train_gpu.sh modelnet40_normal_resampled save pointnet2.ckpt
# 运行分布式训练
bash scripts/run_distributed_train_gpu.sh [DEVICE_NUM] [DATA_PATH] [SAVE_DIR] [PRETRAINDE_CKPT(optional)]
# 示例:
bash scripts/run_distributed_train_gpu.sh 8 modelnet40_normal_resampled save pointnet2.ckpt
# 评估
bash scripts/run_eval_gpu.sh [DATA_PATH] [CKPT_NAME]
# 示例:
bash scripts/run_eval_gpu.sh modelnet40_normal_resampled pointnet2.ckpt
├── PointNet2
├── eval.py # 评估网络
├── export.py
├── README.md
├── README.md
├── scripts
│ ├── run_distributed_train_gpu.sh # 使用GPU进行分布式训练(8卡)
│ ├── run_distributed_train.sh # 使用Ascend进行分布式训练(8卡)
│ ├── run_eval_gpu.sh # 使用GPU进行评估
│ ├── run_eval.sh # 使用Ascend进行评估
│ ├── run_standalone_train_gpu.sh # 使用GPU进行单机训练(单卡)
│ └── run_standalone_train.sh # 使用Ascend进行单机训练(单卡)
├── src
│ ├── callbacks.py # 自定义回调函数
│ ├── dataset.py # 数据预处理
│ ├── layers.py # 网络层初始化
│ ├── lr_scheduler.py # 学习率调度器
│ ├── pointnet2.py # 自定义网络
│ ├── pointnet2_utils.py # 自定义网络工具脚本
│ ├── provider.py # 预处理用于训练的数据
│
│ ├── provider.py # 训练网络
train.py中主要的参数如下:
--batch_size # 批处理大小
--epoch # 总训练epochs数
--learning_rate # 训练学习率
--optimizer # 用于训练的优化器。可选值为Adam和SGD。
--data_path # 训练和评估数据集路径
--loss_per_epoch # 每轮训练的损失值
--save_dir # 保存训练过程中生成的文件的路径
--use_normals # 训练中是否使用法向量数据
--pretrained_ckpt # 加载检查点文件的路径
--enable_modelarts # 是否使用ModelArts
# 运行单机训练
bash scripts/run_standalone_train.sh [DATA_PATH] [SAVE_DIR] [PRETRAINDE_CKPT(optional)]
# 示例:
bash scripts/run_standalone_train.sh modelnet40_normal_resampled save pointnet2.ckpt
# 运行分布式训练
bash scripts/run_distributed_train.sh [RANK_TABLE_FILE] [DATA_PATH] [SAVE_DIR] [PRETRAINDE_CKPT(optional)]
# 示例:
bash scripts/run_distributed_train.sh hccl_8p_01234567_127.0.0.1.json modelnet40_normal_resampled save pointnet2.ckpt
在GPU上运行
# 运行单机训练
bash scripts/run_standalone_train_gpu.sh [DATA_PATH] [SAVE_DIR] [PRETRAINDE_CKPT(optional)]
# 示例:
bash scripts/run_standalone_train_gpu.sh modelnet40_normal_resampled save pointnet2.ckpt
# 运行分布式训练
bash scripts/run_distributed_train_gpu.sh [DEVICE_NUM] [DATA_PATH] [SAVE_DIR] [PRETRAINDE_CKPT(optional)]
# 示例:
bash scripts/run_distributed_train_gpu.sh 8 modelnet40_normal_resampled save pointnet2.ckpt
训练后得到如下损失值:
# 训练日志
epoch: 1 step: 410, loss is 1.4731973
epoch time: 704454.051 ms, per step time: 1718.181 ms
epoch: 2 step: 410, loss is 1.0621885
epoch time: 471478.224 ms, per step time: 1149.947 ms
epoch: 3 step: 410, loss is 1.176581
epoch time: 471530.000 ms, per step time: 1150.073 ms
epoch: 4 step: 410, loss is 1.0118457
epoch time: 471498.514 ms, per step time: 1149.996 ms
epoch: 5 step: 410, loss is 0.47454038
epoch time: 471535.602 ms, per step time: 1150.087 ms
...
模型检查点将保存在SAVE_DIR目录中。
在运行以下命令之前,请检查用于评估的检查点路径。
在Ascend上运行
# 评估
bash scripts/run_eval.sh [DATA_PATH] [CKPT_NAME]
# 示例:
bash scripts/run_eval.sh modelnet40_normal_resampled pointnet2.ckpt
在GPU上运行
# 评估
bash scripts/run_eval_gpu.sh [DATA_PATH] [CKPT_NAME]
# 示例:
bash scripts/run_eval_gpu.sh modelnet40_normal_resampled pointnet2.ckpt
您可以通过文件eval.log查看结果。测试数据集的准确性如下:
# grep "Accuracy: " eval.log
'Accuracy': 0.916
参数 | Ascend | GPU |
---|---|---|
模型版本 | PointNet++ | PointNet++ |
资源 | Ascend 910;CPU 24核;内存256G;EulerOS 2.8 | RTX 3090;GPU内存24268MB;Ubuntu |
上传日期 | 08/31/2021 | 12/20/2021 |
MindSpore版本 | 1.3.0 | 1.5.0rc1 |
数据集 | ModelNet40 | ModelNet40 |
训练参数 | epoch=200, steps=82000, batch_size=24, lr=0.001 | epoch=200, steps=82000, batch_size=24, lr=0.001 |
优化器 | Adam | Adam |
损失函数 | NLLLoss | NLLLoss |
输出 | 概率 | 概率 |
损失 | 0.01 | 0.01 |
速度 | 1.5秒/步(单卡) | 390毫秒/步(单卡) |
总时长 | 27.3小时(单卡) | 8小时8分钟6秒(单卡) |
微调检查点 | 17MB(.ckpt) | 17MB(.ckpt) |
参数 | Ascend | GPU |
---|---|---|
模型版本 | PointNet++ | PointNet++ |
资源 | Ascend 910;CPU 24核;内存256G;EulerOS 2.8 | RTX 3090;GPU内存24268MB;Ubuntu |
上传日期 | 08/31/2021 | 12/20/2021 |
MindSpore版本 | 1.3.0 | 1.3.0 |
数据集 | ModelNet40 | ModelNet40 |
Batch_size | 24 | 24 |
输出 | 概率 | 概率 |
准确率 | 91.5%(单卡) | 91.42%(单卡) |
总时长 | 2.5分钟 | 1.13分钟 |
我们在dataset.py,provider.py和pointnet2_utils.py中设置了随机种子。
请查看官方主页。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。