1.ModelNet40数据集介绍
ModelNet40数据集是用于分类的点云数据集,包含了40个类别,训练集有9843个点云数据,验证集有2468个点云数据,数据集目录结构如下:

"filelist.txt":记录着40个类别所有点云数据的路径,共12311个点云数据;
"modelnet40_shape_names.txt":记录着40个类别的名称;
"modelnet40_test.txt":记录着验证集的点云数据,共2468个点云数据;
"modelnet40_train.txt":记录着训练集的点云数据,共9843个点云数据;
以类别命名的文件夹:保存着本类别的所有点云数据。
例如,"airplane"文件夹保存着所有类别为"飞机"的点云数据(txt格式),如下图所示:

每一个点云数据(txt格式)表示一个具体的类别对象,点云数据由很多的点组成,在ModelNet40数据集中,每个点包含6个维度的信息,分别是[x,y,z,nx,ny,nz],其中,(x,y,z)表示该点在空间中的坐标,(nx,ny,nz)表示该点在空间中的法向量。如下图所示:

2.点云数据可视化
点云数据包含6个维度的信息,前三个维度(x,y,z)表示点在空间的坐标,后三个维度(nx,ny,nz)表示点在空间的法向量,我们可以利用matplotlib来绘制出点云数据的3D散点图,如下图所示:

可视化代码实现如下:
from matplotlib import pyplot as plt
# 四个点云数据的路径
path1="./modelnet40_normal_resampled/airplane/airplane_0001.txt"
path2="./modelnet40_normal_resampled/plant/plant_0002.txt"
path3="./modelnet40_normal_resampled/chair/chair_0001.txt"
path4="./modelnet40_normal_resampled/person/person_0006.txt"
path=[path1,path2,path3,path4]
# 点在空间的坐标(x,y,z)
x,y,z=[],[],[]
for i in range(len(path)):
data=open(path[i],"r")
t1=[]
t2=[]
t3=[]
for line in data:
tx,ty,tz,nx,ny,nz=line.split(",")
t1.append(eval(tx))
t2.append(eval(ty))
t3.append(eval(tz))
x.append(t1)
y.append(t2)
z.append(t3)
# 绘制3D散点图
# x,y,z:三个维度坐标
# c:颜色
# s:大小
# alpha:透明度(0-1)
# marker:形状("o"-圆形;"."-点)
fig=plt.figure()
# 子图1
ax1=fig.add_subplot(221,projection="3d")
ax1.scatter3D(x[0],y[0],z[0],c="b",s=10,alpha=0.8,marker=".")
ax1.set_title("airplane",c="r")
ax1.set_xlabel("X")
ax1.set_ylabel("Y")
ax1.set_zlabel("Z")
# 子图2
ax2=fig.add_subplot(222,projection="3d")
ax2.scatter3D(x[1],y[1],z[1],c="b",s=10,alpha=0.8,marker=".",)
ax2.set_title("plant",c="r")
ax2.set_xlabel("X")
ax2.set_ylabel("Y")
ax2.set_zlabel("Z")
# 子图3
ax3=fig.add_subplot(223,projection="3d")
ax3.scatter3D(x[2],y[2],z[2],c="b",s=10,alpha=0.8,marker=".")
ax3.set_title("chair",c="r")
ax3.set_xlabel("X")
ax3.set_ylabel("Y")
ax3.set_zlabel("Z")
# 子图4
ax4=fig.add_subplot(224,projection="3d")
ax4.scatter3D(x[3],y[3],z[3],c="b",s=10,alpha=0.8,marker=".")
ax4.set_title("person",c="r")
ax4.set_xlabel("X")
ax4.set_ylabel("Y")
ax4.set_zlabel("Z")
plt.pause(50)