三维点云课程—PointNet-Pytorch运行

三维点云课程---PointNet-Pytorch运行

  • 三维点云课程---PointNet-Pytorch运行
    • 1.分类---Classification
      • 1.1训练
      • 1.2 分类训练可能出现的问题
      • 1.3测试分类后的模型文件
      • 1.4测试分类时源码可能遇到的问题
    • 2.分割---Segmentation
      • 2.1训练
      • 2.2分割训练可能出现的问题
      • 2.3测试分类后的模型文件
      • 2.4测试分类时源码可能遇到的问题

PointNet 源码下载地址:https://github.com/fxia22/pointnet.pytorch

源代码存在一些问题,喜欢折腾的小伙伴可以继续往下看,不喜欢的话,我也会在文章的最后给出我调试好的PointNet_Pytorch的包,直接运行即可。

Windows10的环境

python==3.7.4

torch==1.6.0

cuda=10.1

cudnn=8.0

PointNet包安装

cd pointnet.pytorch-master
pip install -e .

再通过pip list查看终端有没有PointNet包

数据集为shapenet类型

1.分类—Classification

1.1训练

在 pointnet.pytorch-master/utils文件夹下,通过快捷键打开终端:按住Ctrl+L,输入cmd回车,就会快速打开cmd窗口,且定位到该文件夹下。在终端输入

python train_classification.py --dataset=E:\PointNet\pointnet.pytorch-master\pointnet.pytorch-master\shapenetcore_partanno_segmentation_benchmark_v0\ --nepoch=4 --dataset_type=shapenet

不出问题的话,终端开始进行训练,在10个train进行test。出现以下的情况表示训练结束了

此时在该文件夹下会产生分类模型文件夹cls

1.2 分类训练可能出现的问题

报错1: Detected call oflr_scheduler.step()beforeoptimizer.step()`

参考:https://blog.csdn.net/zfjBIT/article/details/105114526

解决方案: 将train_classification.py下的代码 scheduler.step()(在for epoch in range(opt.nepoch)下方)放在每次epoch训练完成之后。更改代码如下

  for epoch in range(opt.nepoch):#scheduler.step()for i, data in enumerate(dataloader, 0):points, target = datatarget = target[:, 0]points = points.transpose(2, 1)points, target = points.cuda(), target.cuda()optimizer.zero_grad()classifier = classifier.train()pred, trans, trans_feat = classifier(points)loss = F.nll_loss(pred, target)if opt.feature_transform:loss += feature_transform_regularizer(trans_feat) * 0.001loss.backward()optimizer.step()pred_choice = pred.data.max(1)[1]correct = pred_choice.eq(target.data).cpu().sum()print('[%d: %d/%d] train loss: %f accuracy: %f' % (epoch, i, num_batch, loss.item(), correct.item() / float(opt.batchSize)))if i % 10 == 0:j, data = next(enumerate(testdataloader, 0))points, target = datatarget = target[:, 0]points = points.transpose(2, 1)points, target = points.cuda(), target.cuda()classifier = classifier.eval()pred, _, _ = classifier(points)loss = F.nll_loss(pred, target)pred_choice = pred.data.max(1)[1]correct = pred_choice.eq(target.data).cpu().sum()print('[%d: %d/%d] %s loss: %f accuracy: %f' % (epoch, i, num_batch, blue('test'), loss.item(), correct.item()/float(opt.batchSize)))scheduler.step()torch.save(classifier.state_dict(), '%s/cls_model_%d.pth' % (opt.outf, epoch))

报错2:The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable.

参考:https://blog.csdn.net/zfjBIT/article/details/105117206

解决方案:将你要运行的代码放到main函数中运行即可,train_classification.py代码更改如下

if __name__=='__main__':optimizer = optim.Adam(classifier.parameters(), lr=0.001, betas=(0.9, 0.999))scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.5)classifier.cuda()num_batch = len(dataset) / opt.batchSizefor epoch in range(opt.nepoch):#scheduler.step()for i, data in enumerate(dataloader, 0):points, target = datatarget = target[:, 0]points = points.transpose(2, 1)points, target = points.cuda(), target.cuda()optimizer.zero_grad()classifier = classifier.train()pred, trans, trans_feat = classifier(points)loss = F.nll_loss(pred, target)if opt.feature_transform:loss += feature_transform_regularizer(trans_feat) * 0.001loss.backward()optimizer.step()pred_choice = pred.data.max(1)[1]correct = pred_choice.eq(target.data).cpu().sum()print('[%d: %d/%d] train loss: %f accuracy: %f' % (epoch, i, num_batch, loss.item(), correct.item() / float(opt.batchSize)))if i % 10 == 0:j, data = next(enumerate(testdataloader, 0))points, target = datatarget = target[:, 0]points = points.transpose(2, 1)points, target = points.cuda(), target.cuda()classifier = classifier.eval()pred, _, _ = classifier(points)loss = F.nll_loss(pred, target)pred_choice = pred.data.max(1)[1]correct = pred_choice.eq(target.data).cpu().sum()print('[%d: %d/%d] %s loss: %f accuracy: %f' % (epoch, i, num_batch, blue('test'), loss.item(), correct.item()/float(opt.batchSize)))scheduler.step()torch.save(classifier.state_dict(), '%s/cls_model_%d.pth' % (opt.outf, epoch))total_correct = 0total_testset = 0for i,data in tqdm(enumerate(testdataloader, 0)):points, target = datatarget = target[:, 0]points = points.transpose(2, 1)points, target = points.cuda(), target.cuda()classifier = classifier.eval()pred, _, _ = classifier(points)pred_choice = pred.data.max(1)[1]correct = pred_choice.eq(target.data).cpu().sum()total_correct += correct.item()total_testset += points.size()[0]print("final accuracy {}".format(total_correct / float(total_testset)))

报错3:PermissionError: [WinError 5] 拒绝访问

解决方案:将训练的workers改为0(默认为4),师妹说这是关于线程的,windows10下改为0没有影响,起作用是在linux下的(我深度学习纯小白),代码更改如下

parser.add_argument('--workers', type=int, help='number of data loading workers', default=0) #4

报错4:如果在运行过程中,提示内存不够的问题

**解决方案:**将batchsize调小一点即可(默认是32,改为8即可),代码更改如下

parser.add_argument('--batchSize', type=int, default=8 ,help='input batch size')  #32

报错5:输入指令后,程序没报错也没有任何响应,正常情况下确实有点慢,但是半天没反应,说明代码出现了问题,这是个隐藏的Bug,我当时也折腾了好几天才解决这个问题。

解决方案: 需要在pytorch引入入drop_last=True参数。代码更改如下。关于drop_last的作用,参考:https://www.jb51.net/article/178398.htm

dataloader = torch.utils.data.DataLoader(dataset,batch_size=opt.batchSize,shuffle=True,num_workers=int(opt.workers),drop_last=True)   ##很重要

以上就是我在分类时遇到的问题,可能你和我遇到的不一样,到时候多百度百度。

1.3测试分类后的模型文件

在pointnet.pytorch-master/utils文件夹下输入

python show_cls.py --model cls/cls_model_0.pth

正常情况下,终端开始打印

1.4测试分类时源码可能遇到的问题

1.出现FileNotFoundError: [Errno 2] No such file or directory: 'shapenetcore_partanno_segmentation_benchmark_v0/synsetoffset2category.txt'

解决方案

实际上是有这个文件的。查看show_cls.py,发现此处root位置为:
root='shapenetcore_partanno_segmentation_benchmark_v0',
需要将路径改为绝对路径:

root='E:\PointNet\pointnet.pytorch-master\pointnet.pytorch-master\shapenetcore_partanno_segmentation_benchmark_v0',

参考:https://www.it610.com/article/1279162735334014976.htm这个博主解决了我大部分问题,嘻嘻。

2.但此时的accuracy都是0。需要修改show_cls.py中的代码:

#correct = pred_choice.eq(target.data).cpu().sum()correct = target.eq(pred_choice.data).cpu().sum().data.numpy()

此处参考:https://github.com/fxia22/pointnet.pytorch/issues/29

2.分割—Segmentation

2.1训练

在pointnet.pytorch-master/utils文件夹下输入

python train_segmentation.py --dataset=E:\PointNet\pointnet.pytorch-master\pointnet.pytorch-master\shapenetcore_partanno_segmentation_benchmark_v0 --nepoch=5 --class_choice=Chair

正常情况下,终端开始进行训练了,出现下图,表示训练结束了,且在utils文件夹下参数seg模型文件夹

2.2分割训练可能出现的问题

代码的修改"参考1.2的分类训练可能出现的问题",这里就不赘述了。

2.3测试分类后的模型文件

在pointnet.pytorch-master/utils文件夹下输入

python show_seg.py --model seg/seg_model_Chair_3.pth --class_choice Airplane

正常情况下,会显示如下

在该指令下,Airplane可以替换成训练好的其他类别。在该图片下也有一些人机交互的快捷键。

q:退出程序,程序是死循环的,强制是关不掉的

t+q:变换颜色

n:放大

m:缩小

r:恢复原状

s:保存图片

具体的快捷键的设置查看show3d_balls.py

2.4测试分类时源码可能遇到的问题

1.出现FileNotFoundError: [Errno 2] 没有那个文件或目录: '~/dengjie/Paper/PointNet/pointnet.pytorch/shapenetcore_partanno_segmentation_benchmark_v0/synsetoffset2category.txt'

解决方案

#root=opt.dataset,
root='/home/dengjie/dengjie/Paper/PointNet/pointnet.pytorch/shapenetcore_partanno_segmentation_benchmark_v0',

2.如果执行以上的指令出现

因为show_seg.py调用show3d_balls.py,而show3d_balls.py使用render_balls_so的库

dll = np.ctypeslib.load_library('render_balls_so', '.'),需要重新生成dll,替换原文件的dll。

参考:https://blog.csdn.net/weixin_43978293/article/details/116175134

具体操作如下

用VS新建一个dll动态链接库工程,头文件为dlltest.h,源文件为dllmain.cpp,编译成功后在\x64\Debug文件夹下有一个render_balls_so.dll,替换即可。

dlltest.h

#include <cstdio>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;struct PointInfo {int x, y, z;float r, g, b;
};extern "C" __declspec(dllexport) void render_ball(int h, int w, unsigned char * show, int n, int * xyzs, float * c0, float * c1, float * c2, int r) {/*r = max(r, 1);vector<int> depth(h*w, -2100000000);vector<PointInfo> pattern;for (int dx = -r; dx <= r; dx++)for (int dy = -r; dy <= r; dy++)if (dx*dx + dy*dy<r*r) {double dz = sqrt(double(r*r - dx*dx - dy*dy));PointInfo pinfo;pinfo.x = dx;pinfo.y = dy;pinfo.z = dz;pinfo.r = dz / r;pinfo.g = dz / r;pinfo.b = dz / r;pattern.push_back(pinfo);}double zmin = 0, zmax = 0;for (int i = 0; i<n; i++) {if (i == 0) {zmin = xyzs[i * 3 + 2] - r;zmax = xyzs[i * 3 + 2] + r;}else {zmin = min(zmin, double(xyzs[i * 3 + 2] - r));zmax = max(zmax, double(xyzs[i * 3 + 2] + r));}}for (int i = 0; i<n; i++) {int x = xyzs[i * 3 + 0], y = xyzs[i * 3 + 1], z = xyzs[i * 3 + 2];for (int j = 0; j<int(pattern.size()); j++) {int x2 = x + pattern[j].x;int y2 = y + pattern[j].y;int z2 = z + pattern[j].z;if (!(x2<0 || x2 >= h || y2<0 || y2 >= w) && depth[x2*w + y2]<z2) {depth[x2*w + y2] = z2;double intensity = min(1.0, (z2 - zmin) / (zmax - zmin)*0.7 + 0.3);show[(x2*w + y2) * 3 + 0] = pattern[j].b*c2[i] * intensity;show[(x2*w + y2) * 3 + 1] = pattern[j].g*c0[i] * intensity;show[(x2*w + y2) * 3 + 2] = pattern[j].r*c1[i] * intensity;}}}*/}//extern "C"

dllmain.cpp

#include <cstdio>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;struct PointInfo {int x, y, z;float r, g, b;
};extern "C" {__declspec(dllexport) void render_ball(int h, int w, unsigned char * show, int n, int * xyzs, float * c0, float * c1, float * c2, int r) {r = max(r, 1);vector<int> depth(h*w, -2100000000);vector<PointInfo> pattern;for (int dx = -r; dx <= r; dx++)for (int dy = -r; dy <= r; dy++)if (dx*dx + dy*dy<r*r) {double dz = sqrt(double(r*r - dx*dx - dy*dy));PointInfo pinfo;pinfo.x = dx;pinfo.y = dy;pinfo.z = dz;pinfo.r = dz / r;pinfo.g = dz / r;pinfo.b = dz / r;pattern.push_back(pinfo);}double zmin = 0, zmax = 0;for (int i = 0; i<n; i++) {if (i == 0) {zmin = xyzs[i * 3 + 2] - r;zmax = xyzs[i * 3 + 2] + r;}else {zmin = min(zmin, double(xyzs[i * 3 + 2] - r));zmax = max(zmax, double(xyzs[i * 3 + 2] + r));}}for (int i = 0; i<n; i++) {int x = xyzs[i * 3 + 0], y = xyzs[i * 3 + 1], z = xyzs[i * 3 + 2];for (int j = 0; j<int(pattern.size()); j++) {int x2 = x + pattern[j].x;int y2 = y + pattern[j].y;int z2 = z + pattern[j].z;if (!(x2<0 || x2 >= h || y2<0 || y2 >= w) && depth[x2*w + y2]<z2) {depth[x2*w + y2] = z2;double intensity = min(1.0, (z2 - zmin) / (zmax - zmin)*0.7 + 0.3);show[(x2*w + y2) * 3 + 0] = pattern[j].b*c2[i] * intensity;show[(x2*w + y2) * 3 + 1] = pattern[j].g*c0[i] * intensity;show[(x2*w + y2) * 3 + 2] = pattern[j].r*c1[i] * intensity;}}}}}//extern "C"

调试好的PointNet包:https://url23.ctfile.com/f/22628623-519017610-1d8c9e 密码:7875

render_balls_so.dll源文件下载:https://url23.ctfile.com/f/22628623-519017617-ce1cd2 密码7875

shapenet数据集下载:https://shapenet.cs.stanford.edu/ericyi/shapenetcore_partanno_segmentation_benchmark_v0.zip

(四) 三维点云课程---PointNet-Pytorch运行相关推荐

  1. (一) 三维点云课程---PCA介绍

    三维点云课程-PCA介绍 三维点云课程---PCA介绍 三维点云课程---PCA介绍 1. 什么是PCA 2.知识铺垫 2.1 SVD分解(奇异值分解 ) 2.1 谱定理 2.2 Rayleigh商 ...

  2. (七) 三维点云课程---ICP应用

    (七)三维点云课程-ICP应用 三维点云课程---ICP应用 (七)三维点云课程---ICP应用 1.代码解读 1.1滤波 1.2 计算特征向量 1.3 特征向量的配准 1.3.1 get_poten ...

  3. 阿里巴巴自动驾驶三维点云分割PointNet实现

    阿里巴巴点云分割(PointNet) 项目地址:https://github.com/Summit11/PointNet_AliData 本项目是点云分割模型PointNet在DataFountain ...

  4. 深蓝学院的三维点云课程:第一章

    一.前言 为什么现在点云应用这么广泛,就是因为他有深度信息. 像人脸识别用来解锁手机,比如Iphnoe手机在前边有一个深度摄像头,所以它产生的点云真的是一个三维点云:然后很多手机他可能就没有深度摄像头 ...

  5. 三维点云课程(七)——特征点描述

    1. 什么是特征点 1.1 图像特征点 ORB slam 1.2 点云特征点 点云配准 :ICP要求有足够好的初始平移旋转矩阵,且有一定的重合率 2. 怎么提取特征点 2.1 图像提取特征点 2.1. ...

  6. 三维点云网络PointNet——模型及代码分析

    PointNet架构 PointNet主要架构如下图所示: 主要包含了点云对齐/转换.mlp学习.最大池化得到全局特征三个主要的部分. -T-Net用于将不同旋转平移的原始点云和点云特征进行规范化: ...

  7. 三维点云课程(六)——三维目标检测

    目录 1.  图像目标检测 ​ 1.1 评价检测好坏 1.2 物体检测的方法 1.2.1 Two-Stage 1.2.2 One-Stage 2. 点云目标检测 2.1 VoxelNet ​2.2 P ...

  8. 三维点云网络——PointNet论文解读

    PointNet1 是斯坦福大学研究人员提出的一个点云处理网络,与先前工作的不同在于这一网络可以直接输入无序点云进行处理,而无序将数据处理成规则的3Dvoxel形式进行处理.输入点云顺序对于网络的输出 ...

  9. 三维点云课程第一章:应用

    核PCA的核心思想就是我们可以把高维空间的运算转化成低维空间的一个核函数,这个思想叫做Kernel track.也就是说我们在学习SVM支持向量机的时候,也会经常的用到这个核的方法.  应用1:如何去 ...

最新文章

  1. Google揭露美国政府通过NSL索要用户资料
  2. 5个案例让Python输出漂亮的表格!
  3. c#和python_IronPython和C#交互
  4. python爬取boss直聘招聘信息_Python笔记-爬取Boss直聘的招聘信息
  5. android 地图放大缩小按钮,Android 百度最新地图隐藏 放大缩小按钮、指南针、缩放比例的方法...
  6. bzoj 2257[Jsoi2009]瓶子和燃料 数论/裴蜀定理
  7. 前端复习笔记(三)——JavaScript和JQuery
  8. Linux系统编程(4)——文件与IO之ioctl函数
  9. 阶段3 1.Mybatis_11.Mybatis的缓存_4 mybatis一对多实现延迟加载
  10. ddtek.oracle.dll使用相关
  11. 工业相机 - - 线阵相机
  12. 【Elasticsearch教程20】Pinyin拼音分词器 以及多音字修改
  13. 用C语言实现推箱子小游戏基础程序
  14. 微信公众号(订阅号)文章阅读数监控V0.1
  15. JavaScript新人总结
  16. 基于AM5728 DSP+ARM阵列麦克风解决方案
  17. mongodb数据库学习日记(一)
  18. 深度产教融合的“山东经验”
  19. php源码如何使用教程,php源码的使用方法是什么?
  20. ADIS16203角度传感器的stm32驱动实现要点

热门文章

  1. 如何使win10避免自动删除程序文件(疑似病毒),且使该文件能运行
  2. elasticsearch教程--中文分词器作用和使用
  3. 非小细胞肺癌计算机软件,Hsp90在中国人群非小细胞肺癌临床诊治应用的Meta分析...
  4. 打造户外找房好帮手,几款APP究竟谁能更胜一筹?
  5. ProgressBar 深入分析
  6. 老友记第一季23集背诵句
  7. ffmpeg的本地视频组播
  8. hdl四位二进制计数器_利用Quartus设计4位同步二进制加法计数器
  9. iSpring Suite教程:iSpring Suite 9系统要求(上)
  10. 浏览器推荐 - Vivaldi 1.6浏览器正式发布