最近在学三维点云处理网络,想自己把pointnet跑一下,但我的笔记本是CPU的,据说跑起来很慢而且电脑很烫,所以就想利用云端服务器提供的GPU来跑一下。在此记录一下实现过程。
为了方便上传自己的数据集,我选择了在极客云租用GPU,按小时计费,有很多GPU选择,总算是能够成功实现pointnet了,目前我只运行了分类模型(classcification),下面我来介绍一下步骤。
首先,在pointnet的官网有github的链接,注册github后可以直接下载源代码。记得要注册github,我刚开始直接下载,下载了半天都没成。。。
从github下载的文件包如图,打开README.md文件可以看到pointnet的官方介绍和使用指南。
注意,图中的.py文件是分类模型的源码,如果要运行part segmentation模型或semantic
segmentation模型,则对应part_seg或sem_seg文件夹的代码。
不知道为什么,在源码的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]')
在provider.py文件中有自动下载数据集的代码,建议自己先下载好数据集到本地。 (如果使用国外的服务器,可以直接在服务器上下载。)
由于官方下载数据集太慢了,这里给出classification的数据集的网盘链接。
modelnet40_ply_hdf5_2048.zip
提取码:gu5q
在对应train.py所在的目录中新建文件夹data,把数据集下载到里面。先不要解压。然后将provider.py中红框圈起来部分注释掉。(注意:使用不同的模型,需要在不同的文件夹下载不同的数据集,需要修改对应不同的provider.py文件)
由于数据集下载很慢,我只下载了分类网络的数据集。我是根据另一个博主的推荐用Free Download Manager下载的,但还是下载了很久,建议夜间下载。听说迅雷下载也会快一点,可以试试。
做完上述工作后,把文件夹压缩保存为文件。
注册极客云。极客云提供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极客云服务器
先了解一下数据集构成,点云文件由h5格式存储。
训练集含有5个h5文件,train_files中是这5个h5文件的路径。
测试集含有2个h5文件,test_files中是这2个h5文件的路径。
查看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
使用tensorboard可以查看训练过程的超参数变化
我是将log文件夹下面这个文件下载到本地,用自己的tensorflow查看。
打开Anaconda Prompt,激活tensorflow,输入代码:
activate tensorflow
tensorboard -logdir="上面那个文件的绝对路径"
下面是曲线被90%平滑后,我的accuracy变化(背景是未平滑,smothing=0)