python空间法向量可视化_深度学习在⼏何空间中的应⽤
(⼀):三维可视化
深度学习在⼏何空间中的应⽤(⼀):三维可视化
前⾔⽬前点云⽅⾯的研究是⼀个热门⽅向,点云分类、零件分割、语义分割等研究正处于热门研究时期;
深度学习⼤热以来,渐渐地把⼆维世界⾥的框架,或移植,或改进,运⽤到三维世界中来,那么如何将点云可视化呢?This is a question.
下⾯让我们⼀起来探索。
可视化
点云数据准备
如⽆特别说明,本系列使⽤的数据是ModelNet40,ModelNet40包含了来⾃40类的12311个三维形状,其中9843个⽂件⽤来训
练,2468个⽂件⽤来测试。
系统环境操作系统:ubuntu16.04或者windows10,建议在Ubuntu下开发
编程软件:PyCharm
语⾔环境:Python3.6
python包依赖
使⽤python3.6读取点云⽂件,需要提取安装numpy、h5py、mayavi、matplotlib,其中安装mayavi的⽅法如下(前提:python3.x和64位系统):1
2pip install mayavi
pip install PyQt5 # GUI
故所需要的包有:1
2
3
4
5
6
7import os
import sys
import numpy as np
import h5py
from mayavi import mlab
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
在线⽅式(ubuntu16.04系统下)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 当前py⽂件所在的路径print(BASE_DIR) # 显⽰py⽂件当前路径
sys.path.append(BASE_DIR) # 加⼊到系路径⾥
# download modelnet40 dataset
# 将数据集下载到当前py⽂件所处路径⾥的data⽂件夹⾥,假设当前py⽂件在
# BASE_DIR=E:/PointCloud路径⾥,那么数据集将下载到E:/PointCloud
DATA_DIR = os.path.join(BASE_DIR, 'data')
if not ists(DATA_DIR): # 如果不存在此⽂件夹
os.mkdir(DATA_DIR) # 新建data⽂件夹
# 数据集应在BASE_DIR/data/modelnet40_ply_hdf5_2048⾥,如果不存在
# BASE_DIR/data/modelnet40_ply_hdf5_2048⽂件夹,则下载数据集
# modelnet40_ply_hdf5_2048.zip并解压,且输出.zip⽂件
if not ists(os.path.join(DATA_DIR, 'modelnet40_ply_hdf5_2048')):
# 数据集⽂件⽹址
www = 'shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip'
# 返回path最后的⽂件名,即zipfile=modelnet40_ply_hdf5_2048.zip
zipfile = os.path.basename(www)
os.system('wget %s; unzip %s' % (www, zipfile)) # wget:下载,unzp: 解压
# zipfile=modelnet40_ply_hdf5_2048.zip
# zipfile[:-4]=modelnet40_ply_hdf5_2048
# 把解压后的⽂件夹modelnet40_ply_hdf5_2048移到BASE_DIR/data/路径下
os.system('mv %s %s' % (zipfile[:-4], DATA_DIR))
os.system('rm %s' % (zipfile)) # 删除压缩包
离线⽅式(ubuntu16.04系统或windows10)
如果没有合适的ubuntu环境,那么我们⾸先通过⽹站下载数据集,然后利⽤windows上的解压⼯具解压到对应的⽂件夹,⽂件夹可以对应到在线⽅式⾥的路径,本⽂采⽤的这种⽅法,简单粗暴,但是不推荐,不利于代码的⾃动化。
运⾏代码或者解压⽂件夹,将在BASE_DIR/data/modelnet40_ply_hdf5_2048/⽂件夹⾥看到⼀下内容,注意BASE_DIR指的是当前py ⽂件的路径。
读取点云
由上图可以看到,点云⽂件由.h5⽂件格式来存储,有关h5格式的介绍请移步这⾥,下⾯我们就来读取点云⽂件,代码如下(以读取
ply_data_train1.h5为例):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20"""
读取H5⽂件⾥的键值
"""
import h5py
# ply_data_train1.h5路径
H5_FILE = './data/modelnet40_ply_hdf5_2048/ply_data_train1.h5'
def (h5_filename): # 定义python函数,函数体前后空两⾏
"""
读取H5⽂件⾥的键值
:param h5_filename:
:return:
"""
with h5py.File(h5_filename) as f:
return [item for item in f.keys()]
keys = read_h5file_keys(H5_FILE)
print("key is : %s" % keys)
运⾏,得到以下结果:1key is : ['data', 'faceId', 'label', 'normal']
其中
'data'对应点云xyz坐标
'label'对应标签
'normal'对应法向量
'faceId'未知
我们感兴趣的是键值data和label
紧接着,读取点云数据,代码如下:1
2
3with h5py.File(H5_FILE) as f:
data = f['data'][:]
label = f['label'][:]
由于数据集较⼤,所以是否读取成功,可以利⽤PyCharm⾥的Scientific Mode来查看,开启姿势位View——>Scientific Mode,可追踪变量变化,如下图
运⾏程序后,就会看到这样的情形,
点击变量data后的View as Array,就可以在右边的SciView⾥看见数据,ply_data_train1.h5⾥共有 2048个物体的点云数据,所以范围在data[0]到data[2047]之间,每⼀个物体共有 2048 个点,每个点的坐标位(x, y, z).
可以打印出data和label的形状:1
2print(data.shape) # (2048, 2048, 3)
免费编程软件python下载print(label.shpae) # (2048, 1)
显⽰点云获取坐标1
2
3
4
5
6
7
8
9
10
11
12
13import numpy as np
from mayavi import mlab
x = []
y = []
z = []
num_obj = 1079 # ⽐如显⽰第756 + 1个物体
max_num_point = 2048 # 最⼤渲染点的个数,最⼤是2048个点
# 依次获取x、y、z的坐标 —— 1D array
x = data[num_obj, 0:max_num_point, 0] # shape为(max_num_point, 1) y = data[num_obj, 0:max_num_point, 1] # shape为(max_num_point, 1) z = data[num_obj, 0:max_num_point, 2] # shape为(max_num_point, 1)点云可视化⽅法⼀ —— mayavi1
2
3
4
5
6
7
8
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论