最近在学三维点云处理网络,想自己把pointnet跑一下,但我的笔记本是CPU的,据说跑起来很慢而且电脑很烫,所以就想利用云端服务器提供的GPU来跑一下。在此记录一下实现过程。

为了方便上传自己的数据集,我选择了在极客云租用GPU,按小时计费,有很多GPU选择,总算是能够成功实现pointnet了,目前我只运行了分类模型(classcification),下面我来介绍一下步骤。

1. 下载源码

首先,在pointnet的官网有github的链接,注册github后可以直接下载源代码。记得要注册github,我刚开始直接下载,下载了半天都没成。。。

从github下载的文件包如图,打开README.md文件可以看到pointnet的官方介绍和使用指南。

注意,图中的.py文件是分类模型的源码,如果要运行part segmentation模型或semantic
segmentation模型,则对应part_seg或sem_seg文件夹的代码。

2. 对源代码作一些改动准备

不知道为什么,在源码的README.md文件中,写明每个点云是在实体表面上均匀采集的2048个点,但是train.py的文件中默认的num_point是1024,所以我将pointnet-master下train.py文件中的num_point默认值改成2048

一些博客上说需要改动train.py中数据集的路径信息,我亲自测试过,只要按照步骤3下载数据集,不用更改路径信息。

#源码中的默认点数为1024
#parser.add_argument('--num_point', type=int, default=1024, help='Point Number [256/512/1024/2048] [default: 1024]
#改成2048
parser.add_argument('--num_point', type=int, default=2048, help='Point Number [256/512/1024/2048] [default: 2048]')

3. 下载数据集

在provider.py文件中有自动下载数据集的代码,建议自己先下载好数据集到本地。 (如果使用国外的服务器,可以直接在服务器上下载。)
由于官方下载数据集太慢了,这里给出classification的数据集的网盘链接。
modelnet40_ply_hdf5_2048.zip
提取码:gu5q

在对应train.py所在的目录中新建文件夹data,把数据集下载到里面。先不要解压。然后将provider.py中红框圈起来部分注释掉。(注意:使用不同的模型,需要在不同的文件夹下载不同的数据集,需要修改对应不同的provider.py文件)

由于数据集下载很慢,我只下载了分类网络的数据集。我是根据另一个博主的推荐用Free Download Manager下载的,但还是下载了很久,建议夜间下载。听说迅雷下载也会快一点,可以试试。

做完上述工作后,把文件夹压缩保存为文件。

4. 上服务器

注册极客云。极客云提供GPU云服务,极客云上可以根据不同版本的tensorflow和python创建环境。
极客云注册传送门(刚注册可以申请5元新人体验券哦)
(这是我的邀请码:fknS1fQ2L5TPZkIq1mTi7g==,填写邀请码后,被邀请者充值满10元后,我们都能获得10元优惠劵 ^ _ ^* )

!!!先上传数据再创建实例!!!

将步骤3准备好的压缩包上传。然后将data文件夹下的数据集解压。

下图是选择界面


根据README.md文件描述,选择python2.7+tensorflow1.0.1
GPU类型自己选,有很多不同型号和价格

我选择的是 GTX 1070 G3930 2核16G 1.5TB硬盘 网速D100/U30 (独占2.8元每小时)

接下来的部分我借鉴了下面这篇博文

pointnet代码运行------by极客云服务器

5. 输出的结果都是什么?

(1) 关于数据集

先了解一下数据集构成,点云文件由h5格式存储。
训练集含有5个h5文件,train_files中是这5个h5文件的路径。

测试集含有2个h5文件,test_files中是这2个h5文件的路径。

(2)关于输出的理解

查看train.py代码得知,
每一轮(EPOCH)分别进行training和testing两个任务。

       for epoch in range(MAX_EPOCH):log_string('**** EPOCH %03d ****' % (epoch))sys.stdout.flush()train_one_epoch(sess, ops, train_writer)eval_one_epoch(sess, ops, test_writer)# Save the variables to disk.if epoch % 10 == 0:save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt"))log_string("Model saved in file: %s" % save_path)

在training阶段,训练集每个h5文件的数据分批次输入网络训练,对每个文件输出一次【平均分类误差和分类准确率】。然后重置loss和acc,5个文件的这两个参数并不累加。

在testing阶段,测试集每个h5文件的数据分批次输入网络训练,2个h5文件输入网络后,输出【总的平均分类误差、分类准确率和40个类别召回率的平均值】,2个文件的这些参数值累加。

#这是Terminal的输出,保存在log_train.txt文件中
**** EPOCH 000 ****
----0-----
mean loss: 3.741447
accuracy: 0.220703
----1-----
mean loss: 2.662842
accuracy: 0.332031
----2-----
mean loss: 2.233688
accuracy: 0.416667
----3-----
mean loss: 2.018896
accuracy: 0.463379
----4-----
mean loss: 1.819018
accuracy: 0.503906
----0-----
----1-----
eval mean loss: 1.642117
eval accuracy: 0.549919
eval avg class acc: 0.470893
Model saved in file: log/model.ckpt

每10个EPOCH保存一次模型,保存在pointnet-master文件夹下log/model.ckpt中

        # Save the variables to disk.if epoch % 10 == 0:save_path = saver.save(sess, os.path.join(LOG_DIR, "model.ckpt"))log_string("Model saved in file: %s" % save_path)

默认最大训练轮数为250,我最终训练到第137个EPOCH,一共花了超过4个半小时。训练集准确率为95.5%左右,测试集准确率只有约88.3%,召回率约为85.5%

**** EPOCH 137 ****
----0-----
mean loss: 0.113151
accuracy: 0.958984
----1-----
mean loss: 0.125070
accuracy: 0.955078
----2-----
mean loss: 0.138621
accuracy: 0.948242
----3-----
mean loss: 0.127347
accuracy: 0.958333
----4-----
mean loss: 0.127848
accuracy: 0.955078
----0-----
----1-----
eval mean loss: 0.496802
eval accuracy: 0.882711
eval avg class acc: 0.855228

6. tensorboard数据可视化

使用tensorboard可以查看训练过程的超参数变化
我是将log文件夹下面这个文件下载到本地,用自己的tensorflow查看。

打开Anaconda Prompt,激活tensorflow,输入代码:

activate tensorflow
tensorboard -logdir="上面那个文件的绝对路径"


复制最后的网址到浏览器打开即可。

下面是曲线被90%平滑后,我的accuracy变化(背景是未平滑,smothing=0)


classificaton_loss:

Trainig loss:

pointnet实现相关推荐

  1. PointNet++:(1)网络完成的任务分析

    -----------物体形状分类任务(Shape Classfication)------- 一.数据准备 modelnet40_normal_resampled.zip 解压后下边有: (1)有4 ...

  2. PointNet++论文个人理解

    点击上方"视学算法",选择"星标" 干货第一时间送达 作者丨zmYD@知乎 来源丨https://zhuanlan.zhihu.com/p/157489233 ...

  3. 细嚼慢咽读论文:PointNet论文及代码详细解析

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨刘昕宸@知乎 来源丨https://zhuanlan.zhihu.com/p/264627148 ...

  4. 一文搞懂PointNet全家桶——强势的点云处理神经网络

    作者:黎国溥,3D视觉开发者社区签约作者,CSDN博客专家,华为云-云享专家 首发:公众号[3D视觉开发者社区] 前言 PointNet是由斯坦福大学的Charles R. Qi等人在<Poin ...

  5. pointnet 结果可视化_PointNet论文复现及代码详解

    写在前面 本文主要对PointNet(之前有解读论文)的代码进行了分析和解读,有助于进一步理解其思想.可以发现,PointNet的结构并不复杂,比起CNN还要简单一些.理解PointNet关键在于理解 ...

  6. 点云配准 PointNet + Concat + FC

    原文: https://yongqi.blog.csdn.net/article/details/109759708 这个推荐有几个: https://zhuanlan.zhihu.com/p/107 ...

  7. 点云配准网络 PCRNet: Point Cloud Registration Network using PointNet Encoding 2019

    本文使用PointNet对点云提取全局特征,不需要计算点云之间的一一对应关系,因此能够实现快速的点云配准. PCRNet根本没有用到局部特征,因此在速度上有优势,精度上会有所妥协.加入了局部特征信息的 ...

  8. pointnet分割自己的点云数据_点云学习历史文章大汇总

    LaserNet:一种高效的自动驾驶概率三维目标探测器 从相机标定到SLAM,极简三维视觉六小时课程视频(附PPT) 计算机图形学遇上深度学习,为3D图像任务打造的深度学习利器TensorFlow G ...

  9. 【pointnet++点云识别】基于pointnet++的点云地理数据识别的MATLAB仿真

    1.软件版本 matlab2021a 2.本算法理论知识 根据http://stanford.edu/~rqi/pointnet2/中关于pointnet++的介绍可知,该算法的基本构架如下所示: 根 ...

  10. 基于matlab的pointnet++深度学习网络点云数据分类

    这里,采用的pointnet++网络结构如下图所示: 在整体网络结构中, 首先进行set abstraction,这一部分主要即对点云中的点进行局部划分,提取整体特征,如图可见,在set abstra ...

最新文章

  1. edge chrome 浏览器 底色调黑 反色
  2. JDK与JRE的关系和path的作用浅谈
  3. 【转】Oracle SPARC SuperCluster全能王:不改大道至简本色
  4. Kali 渗透测试—Metasploit
  5. Uncaught TypeError: Object #Document has no method 'load'
  6. stl-map的一道很好的题目
  7. PHP的单引号双引号
  8. git上托管的代码如何部署在阿里云上_居然仅用浏览器搞定Spring Boot应用的开发与部署...
  9. 奖学金c语言程序,奖学金 (C语言代码)
  10. android 推送的小图标,android - 推送通知中没有声音并且没有自定义的小图标 - 堆栈内存溢出...
  11. 球迷 如何在Linux纯命令行玩转谷歌浏览器,边看欧洲杯,边看足球宝贝
  12. Git教程_1 简介
  13. bzoj2705 [SDOI2012]Longge的问题
  14. 如何手动安装wxpython_如何在Ubuntu中安装wxPython的方法及命令
  15. 数据结构与算法——左程云07
  16. c# directory.getfiles按照文件名称
  17. xiunobbs装插件
  18. 如何在word中删除一段文字的所有空格
  19. Tungsten Fabric(6):部署更高版本的TF
  20. Linux_day02

热门文章

  1. java同步调用异步方法_关于同步方法里面调用异步方法的探究
  2. java mybatis XML文件中大于号小于号转义
  3. 部署Kubernetes集群(二进制 v1.18.5版)
  4. R语言dplyr包group_by函数、quantile函数、summarise函数计算dataframe数据中指定数值数据列在每个分组中的多个分位数值
  5. “关爱空巢老人”社区小程序开源
  6. linux 查看已加载模块,Linux怎么查看加载内核模块之lsmod命令
  7. helloword的忠实追随者
  8. 基于MATLAB与SOIDWORKS的关节型六轴机械臂仿真
  9. android 下载图片到相册
  10. 什么是 spring boot?为什么要用?