PointNet训练与测试github开源代码(PointNet实现第5步骤pytorch版)

PointNet第5步——PointNet训练与测试github开源代码

在运行github上的代码时,经常版本不匹配会出现大量的不同,或者报错,这篇主要记录我解决相关报错的方法。

本次测试的是github上的yanx27Pointnet_Pointnet2_pytorch
源码资源【点击此处】在此,感激git主的贡献。

第一步:下载代码

本次程序不太适合用自己笔记本的cpu还跑,还是比较适合用服务器。
下载代码链接如上源码资源
在这里插入图片描述

第2步:下载保存数据集

改源码数据集,源码作者已经给出1.59GB
数据集链接【点击此处下载

下载建议通过服务器来实现,服务器如何下载,命令行直接输入下面:

wget https://shapenet.cs.stanford.edu/media/modelnet40_normal_resampled.zip

将下载后的数据集解压保存在代码文件目录下data/modelnet40_normal_resampled/
解压保存(服务器端口操纵)如下:

unzip -d 源代码路径+/data modelnet40_normal_resampled.zip

在这里插入图片描述

其他后台操作可参考我的【这篇博客

第3步:实现与调错

cd 到源码保存的文件路径下,然后
在这里插入图片描述

报错1:no model ‘ModelNetDataLoader’

代码路径的问题
报错点在train_cls.py第5行
from data_utils.ModelNetDataLoader import ModelNetDataLoader
在这里插入图片描述
简单粗暴法:
直接将在data_utils中ModelNetDataLoader.py复制到train_cls.py同目录下。
然后将from data_utils.ModelNetDataLoader import ModelNetDataLoader 改为from ModelNetDataLoader import ModelNetDataLoader

在这里插入图片描述
其他方法:1.添加路径,这个你可以百度一下,sys.path,这里我只介绍最简单的方法。
2.转变为模块,这你也可以在CSDN中查一下,这里忘记截图了,也不打算介绍了。

报错2:no model pathlib

解决:
pip install pathlib

报错3:makedir(exist_ok=True)

原来是版本的不同,python3.5以下版本跟pytorch3.5以上不同,pytorch3.5以下版本没有exist_ok。
解决方法:
pip install pathlib2
train_cls.py代码中的pathlib改为pathlib2

在这里插入图片描述
如果上述方法不可以,可以参考【这里

报错4:SyntaxError: Non-ASCII character ‘\xef’ in file pointnet_util.py

原因:Python的默认编码文件是用的ASCII码,你将文件存成了UTF-8也没用
解决方法:
1.简单粗暴法:
pointnet_util.py中的所有注释(“”" “”")删除。
2. 方法2:
在文件开头加入 # -- coding: UTF-8 -- 或者 #coding=utf-8 就行了

# -*- coding: utf-8 -*-
#!/usr/bin/env python

报错5:cuda out of memory

显存不足
解决方法:
1.加显存(够壕🐶)
2.将batch_size改小,在这里的话我改成8。
在train_cls.py中将默认值修改为8:
在这里插入图片描述
仍然·解决?——》计算一下网络的计算量,再查看一下你自己的GPU容量,看一下是否超过?如果没有,可能是其他设置原因。

报错6:RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED. This error may appear if you passed in a non-contiguous input.

原因:版本不匹配
解决方法:
在train_cla.py 前面加上:

torch.backends.cudnn.enabled = False

在这里插入图片描述

报错7:

ValueError: Expected more than 1 value per channel when training, got input size torch.Size......

问题分析: 模型中用了batchnomolization,训练中用batch训练的时候,应该是有单数,比如dataset的总样本数为17,你的batch_size为8,就会报这样的错误。输入批次只有一个数据点,而由于BatchNorm操作需要多于一个数据计算平均值,因此造成该错误。

解决方法

从dataset中删掉一个sample,在获取数据集时,将DataLoader中drop_last设置为True,把不够一个批次的数据丢弃。

如果这操作不可以,请参考【这篇博客

至此,报错结束,可以运行,上面只记述自己记得的一些报错。

在这里插入图片描述


上面只介绍了PointNet的训练于测试,如果需要了解更多的3D检测可以直接看PointNet作者的介绍:

3D检测发展与未来-PointNet作者

最重要的还可以加一下讲解视频里面的群,群里面有3D检测大佬,有些其他问题可以在群里咨询。上面只是我遇到的一些问题,如果其他没有遇到问题可以先问一下别人是否有相关的解决方案喽。

  • 12
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
### 回答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模型,从而应用到更多的实际场景中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xiaobai_Ry

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

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

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

打赏作者

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

抵扣说明:

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

余额充值