PyTorch复现PointNet++——模型训练+模型测试

本博文主要实现对PointNet++源码进行调试,模型训练+模型测试。

一、下载源码和数据集

论文:PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
GitHub源码:Pointnet2_pytorch
数据集包括三种:分类、零部件分割和场景分割
分类数据集:modelnet40_normal_resampled
零部件分割数据集:shapenetcore_partanno_segmentation_benchmark_v0_normal
场景分割数据集:s3dis/Stanford3dDataset_v1.2_Aligned_Version
(科学上网)

PointNet++源码结构如下:
在这里插入图片描述
看起来还是比较清晰的,大概可能知道项目中主要包括三个功能:分类classification零部件分割partseg场景分割semseg
在这里插入图片描述
老规矩,先看README.md

作者安装的是CUDA10.1,PyTorch 1.6和Python 3.7
可以通过anaconda进行安装conda install pytorch==1.6.0 cudatoolkit=10.1 -c pytorch
在这里插入图片描述
我是在Anaconda下创建一个新的虚拟环境空间部署项目测试
大概用到的就这些了,后面调试项目时候缺少安装啥就行了

torch                     2.0.0+cu117
torchvision               0.15.0+cu117
python                    3.8.19
numpy                     1.24.3
matplotlib                3.7.5
opencv-python             4.10.0.84

其实,认认真真看了PyTorch复现PointNet——模型训练+可视化测试显示这篇博文之后,再看README.md就简单的多了

二、分类任务Classification,数据集为ModelNet10/40

先看README.md
在这里插入图片描述
下载所用到的数据集放到data文件夹下,我这边场景分割数据集因为网不好总是失败~~这里就下载好了两个数据集,一个是分类用的,一个是零部件分割用的,场景分割数据集没下载成功…

将用到的分割数据集modelnet40_normal_resampled放到data文件夹下
在这里插入图片描述

2.1 训练模型——train_classification.py

1,由README.md可知运行分类任务的命令如下:

# ModelNet40
## Select different models in ./models 

## e.g., pointnet2_ssg without normal features
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg
python test_classification.py --log_dir pointnet2_cls_ssg

## e.g., pointnet2_ssg with normal features
python train_classification.py --model pointnet2_cls_ssg --use_normals --log_dir pointnet2_cls_ssg_normal
python test_classification.py --use_normals --log_dir pointnet2_cls_ssg_normal

## e.g., pointnet2_ssg with uniform sampling
python train_classification.py --model pointnet2_cls_ssg --use_uniform_sample --log_dir pointnet2_cls_ssg_fps
python test_classification.py --use_uniform_sample --log_dir pointnet2_cls_ssg_fps

# ModelNet10
## Similar setting like ModelNet40, just using --num_category 10

## e.g., pointnet2_ssg without normal features
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg --num_category 10
python test_classification.py --log_dir pointnet2_cls_ssg --num_category 10

有四组可以供选择,这里我就选用第一组,不用法向量特征的pointnet2_ssg训练模型作为测试

## e.g., pointnet2_ssg without normal features
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg
python test_classification.py --log_dir pointnet2_cls_ssg

2,需要给定的参数有:--model pointnet2_cls_ssg 和 --log_dir pointnet2_cls_ssg

修改参数:

parser.add_argument('--epoch', default=1, type=int, help='number of epoch in training')
parser.add_argument('--model', default='pointnet2_cls_ssg', help='model name [default: pointnet_cls]')
parser.add_argument('--log_dir', type=str, default="pointnet2_cls_ssg", help='experiment root')
parser.add_argument('--batch_size', type=int, default=8, help='batch size in training')

使用的模型为:models\pointnet2_cls_ssgmodels文件夹里面还有很多模型
训练好的模型信息存放路径为:log\classification\pointnet2_cls_ssg
在这里插入图片描述
在这里插入图片描述
训练模型所使用的数据集存放位置
在这里插入图片描述

3,右击运行

开始训练
在这里插入图片描述
训练完成

模型存放在:log\classification\pointnet2_cls_ssg\checkpoints
在这里插入图片描述

2.2 测试模型——test_classification.py

1,由README.md可知运行分类任务的命令如下:

## e.g., pointnet2_ssg without normal features
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg
python test_classification.py --log_dir pointnet2_cls_ssg

2,需要给定的参数有:--log_dir pointnet2_cls_ssg

修改参数:

parser.add_argument('--log_dir', type=str, default="pointnet2_cls_ssg", help='Experiment root')

在这里插入图片描述
测试集位置和使用的测试模型
在这里插入图片描述

3, 右击运行

测试完成
在这里插入图片描述
模型测试信息
在这里插入图片描述

三、零部件分割任务Part Segmentation,数据集为ShapeNet

先看README.md
在这里插入图片描述

下载所用到的数据集shapenetcore_partanno_segmentation_benchmark_v0_normal放到data文件夹下
在这里插入图片描述

3.1 训练模型——train_partseg.py

1,由README.md可知运行零部件分割任务的命令如下:

## Check model in ./models 
## e.g., pointnet2_msg
python train_partseg.py --model pointnet2_part_seg_msg --normal --log_dir pointnet2_part_seg_msg
python test_partseg.py --normal --log_dir pointnet2_part_seg_msg

2,需要给定的参数有:--model pointnet2_part_seg_msg--normal--log_dir pointnet2_part_seg_msg

修改参数:

parser.add_argument('--model', type=str, default='pointnet2_part_seg_msg', help='model name')
parser.add_argument('--normal', action='store_true', default=False, help='use normals')
parser.add_argument('--log_dir', type=str, default="pointnet2_part_seg_msg", help='log path')

在这里插入图片描述
使用的模型为:models\pointnet2_part_seg_msgmodels文件夹里面还有很多模型
在这里插入图片描述
训练好的模型信息存放路径为:./log/part_seg/pointnet2_part_seg_msg
在这里插入图片描述

3,右击运行,报错

AttributeError: module 'numpy' has no attribute 'float'.
`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:

在这里插入图片描述
翻译:在这里插入图片描述

解决:np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float64))
在这里插入图片描述
在这里插入图片描述

4,右击继续运行,报错

提示显卡内存不足
在这里插入图片描述
解决:将batch_size设置小点,例如设置为4,具体情况根据自己的电脑配置来

parser.add_argument('--batch_size', type=int, default=4, help='batch Size during training')

为了快速训练演示,把epoch设置为1
在这里插入图片描述

5,右击继续运行

开始模型训练
在这里插入图片描述
训练完成
在这里插入图片描述

训练好的模型保存在log\part_seg\pointnet2_part_seg_msg\checkpoints/best_model.pth
在这里插入图片描述
模型训练好了,接下来开始测试

3.2 测试模型——test_partseg.py

1,由README.md可知运行零部件分割任务的命令如下:

## Check model in ./models 
## e.g., pointnet2_msg
python train_partseg.py --model pointnet2_part_seg_msg --normal --log_dir pointnet2_part_seg_msg
python test_partseg.py --normal --log_dir pointnet2_part_seg_msg

2,需要给定的参数有:--normal--normal--log_dir pointnet2_part_seg_msg

修改参数:

parser.add_argument('--log_dir', type=str, default="pointnet2_part_seg_msg", help='experiment root')
parser.add_argument('--normal', action='store_true', default=False, help='use normals')
parser.add_argument('--batch_size', type=int, default=4, help='batch size in testing')

在这里插入图片描述

3,右击运行,报错

又是遇到的这个问题
在这里插入图片描述
解决:
改成np.float64即可

np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float64))

4,右击继续运行

输出测试每个类型的mIoU得分
在这里插入图片描述
结果会存放到log\part_seg\pointnet2_part_seg_msg\eval.txt日志文件中
在这里插入图片描述

四、场景分割任务Semantic Segmentation,数据集为S3DIS

先看README.md
在这里插入图片描述
首先把下载好的数据集解压放到data/s3dis/Stanford3dDataset_v1.2_Aligned_Version/
data文件夹下创建一个s3dis文件夹,数据集解压到/data/s3dis下即可

哈哈哈哈哈,数据集我没下载成功

在这里插入图片描述
主要是场景分割任务对我而言也用不到
我就按着README.md大致说下流程

4.1 转换数据集

查看下data_utils/collect_indoor3d_data.py,可以得知数据集的存放路径,看来好像跟README.md给的不太一样,按照代码里面的来哈,可能是作者不小心整错路径了
在这里插入图片描述
数据集存放路径:data\stanford_indoor3d
在这里插入图片描述

4.2 训练模型——train_semseg.py

1,由README.md可知运行场景分割任务的命令如下:

## Check model in ./models 
## e.g., pointnet2_ssg
python train_semseg.py --model pointnet2_sem_seg --test_area 5 --log_dir pointnet2_sem_seg
python test_semseg.py --log_dir pointnet2_sem_seg --test_area 5 --visual

2,需要给定的参数有:--model pointnet2_sem_seg --test_area 5--log_dir pointnet2_sem_seg

修改参数:
要我的话我会修改这些参数

parser.add_argument('--model', type=str, default='pointnet_sem_seg', help='model name [default: pointnet_sem_seg]')
parser.add_argument('--test_area', type=int, default=5, help='Which area to use for test, option: 1-6 [default: 5]')
parser.add_argument('--log_dir', type=str, default="data/stanford_indoor3d", help='Log path [default: None]')
parser.add_argument('--epoch', default=4, type=int, help='Epoch to run [default: 32]')

3,能不能正常运行我也不清楚,我没下载成功数据集~~,抱歉各位老爷们

4.3 测试模型——test_semseg.py

1,由README.md可知运行场景分割任务的命令如下:

## Check model in ./models 
## e.g., pointnet2_ssg
python train_semseg.py --model pointnet2_sem_seg --test_area 5 --log_dir pointnet2_sem_seg
python test_semseg.py --log_dir pointnet2_sem_seg --test_area 5 --visual

2,需要给定的参数有:--log_dir pointnet2_sem_seg --test_area 5--visual

修改参数:

parser.add_argument('--batch_size', type=int, default=4, help='batch size in testing [default: 32]')
parser.add_argument('--log_dir', type=str, default="pointnet2_sem_seg", help='experiment root')
parser.add_argument('--test_area', type=int, default=5, help='area for testing, option: 1-6 [default: 5]')
parser.add_argument('--visual', action='store_true', default=False, help='visualize result [default: False]')

3,能不能正常运行我也不清楚,我没下载成功数据集~~,抱歉各位老爷们

五、总结

其实由先前的PyTorch复现PointNet——模型训练+可视化测试显示,家人们应该都知道如何调试了,大差不差,但是得需要多动手,光说不练假把式,天道酬勤!
加油!!!

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 好的,以下是使用PyTorch复现PointNet++的步骤: 1. 安装PyTorch和其他必要的库,如numpy、scipy、h5py等。 2. 下载PointNet++的代码和数据集。可以从官方GitHub仓库下载代码,数据集可以从官方网站下载。 3. 将数据集转换为PyTorch可以处理的格式。可以使用h5py库读取数据集,然后将数据转换为PyTorch张量。 4. 编写模型代码。PointNet++模型代码可以在PointNet++的GitHub仓库中找到。将代码转换为PyTorch版本并进行必要的修改。 5. 训练模型。使用PyTorch的优化器和损失函数训练模型。可以使用PyTorch的DataLoader加载数据集,并使用PyTorch的GPU加速训练过程。 6. 测试模型。使用测试测试模型的性能。可以使用PyTorch的评估函数计算模型的准确率和其他指标。 7. 调整模型。根据测试结果调整模型的参数和架构,以提高模型的性能。 以上是使用PyTorch复现PointNet++的基本步骤。需要注意的是,这只是一个大致的指导,具体的实现过程可能会因为数据集和模型的不同而有所不同。 ### 回答2: PointNet 是一种用于点云数据的深度学习模型,其对点云进行全局池化(global pooling)以及局部特征学习(local feature learning)的方法使得其在各种场景中取得了非常好的结果。本文将介绍如何使用 PyTorch 复现 PointNet 模型。 首先,我们需要准备数据。PointNet 接收的输入是点云,我们可以通过采样或者转换方法将 mesh 数据转换为点云数据。在转换为点云后,我们可以将点云转换为 numpy array,并使用 PyTorch 的 DataLoader 进行数据预处理。在这里我们使用 ModelNet40 数据集进行实验。 接下来,我们需要定义 PointNet 模型的结构。PointNet 包括两个编码器和一个分类器。编码器用于从点云中提取特征信息,分类器用于将提取的特征映射到具体的分类标签。这里我们定义一个函数 PointNetCls,将编码器和分类器都封装在这个函数中。 ```python import torch.nn as nn import torch.nn.functional as F import torch.optim as optim class PointNetCls(nn.Module): def __init__(self, k=40): super(PointNetCls, self).__init__() self.k = k self.conv1 = nn.Conv1d(3, 64, 1) self.conv2 = nn.Conv1d(64, 128, 1) self.conv3 = nn.Conv1d(128, 1024, 1) self.fc1 = nn.Linear(1024, 512) self.fc2 = nn.Linear(512, 256) self.fc3 = nn.Linear(256, k) def forward(self, x): batchsize = x.size()[0] x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = torch.max(x, 2, keepdim=True)[0] x = x.view(-1, 1024) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return F.log_softmax(x, dim=1) ``` 具体来讲,我们先使用三个卷积层提取特征信息,然后使用 max pooling 进行池化,最后通过三个全连接层将提取的特征映射到具体的分类标签。特别的,我们将最后一层的输出使用 softmax 函数来进行分类。 训练过程如下: ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = PointNetCls().to(device) optimizer = optim.Adam(model.parameters(), lr=0.001) for epoch in range(300): model.train() for batch_id, (data, label) in enumerate(train_loader): optimizer.zero_grad() data, label = data.to(device), label.to(device) pred = model(data) loss = F.nll_loss(pred, label) loss.backward() optimizer.step() print(f'Epoch {epoch}: Training Loss: {loss.item()}') model.eval() correct = 0 for data, label in test_loader: data, label = data.to(device), label.to(device) pred = model(data) pred = pred.data.max(1)[1] correct += pred.eq(label.data).cpu().sum() accuracy = correct.item() / float(len(test_loader.dataset)) print(f'Epoch {epoch}: Testing Accuracy: {accuracy}') ``` 可以看到,在训练阶段我们使用 Adam 优化器来优化模型,并使用负对数似然对数函数作为损失函数。在测试阶段我们将模型设置为评价模式,并使用预测结果和真实标签的比对结果计算准确率。 通过以上步骤,我们已经完成了一个 PointNet 的 PyTorch 实现。当然,为了提高准确率我们还可以对模型结构进行优化,如引入 dropout、batch normalization 等结构,或者将模型拓展到 PointNet++ 等更加优秀的架构。 ### 回答3: PointNet是一种针对点云数据进行分类和分割的深度学习模型,其在处理三维几何数据方面具有很好的效果,也被广泛应用于许多领域。为了复现PointNet模型,我们可以使用Pytorch框架进行实现。下面是针对PointNet复现的详细步骤: 一、准备数据 首先需要准备点云数据集,我们可以使用ShapeNet数据集中的某些部分进行测试。我们需要将点云数据转化为numpy数组形式,并将其划分为训练集和验证集。 二、数据预处理 在进行训练工作之前,我们需要将点云数据进行预处理,包括点云的标准化和噪声过滤等操作。处理后的数据可以使用dataloader以batch的形式进行加载。 三、搭建模型 我们可以按照PointNet的论文中的模型结构进行搭建。线性变换、最大池化和ReLU激活层的堆叠是构成模型的主要部分。我们需要使用Pytorch中定义模型的方法实现PointNet模型。 四、训练模型 我们可以使用Pytorch自带的优化器,如Adam优化器来训练PointNet模型。在每个epoch结束后,我们可以计算模型在验证集上的精度和准确度,以评估模型性能。 五、测试模型 完成模型训练后,我们可以使用Pytorch中的模型预测方法对新的未见数据进行分类和分割预测。 这些就是复现PointNet模型的详细步骤。此外,还需要注意一些细节问题,例如使用GPU加速训练、采用KNN算法处理最近邻等。借助Pytorch框架,我们可以轻松地实现PointNet模型,从而应用到更多的实际场景中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond谚语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值