点云处理:基于Paddle2.0尝试提出Kd-Unet对点云进行分割处理
更新时间:2025-11-04 09:50:35
-
-
bumble最新官方版 v5.376.0
- 类型:聊天交友
- 大小:56.6m
- 语言:简体中文
- 评分:
- 查看详情
点云处理:基于Paddle2.0尝试提出Kd-Unet对点云进行分割处理
本文详细介绍基于Paddle建的Kd-Unet点云分割网络,融合了Kd-Networks特征提取与Unet结构优势,编码器采用下采样,解码器则通过反卷积上采样实现,同时引入跳跃连接以增强网络性能。使用ShapeNet.h据集进行训练后,验证集上的miou达到此方法不仅提高了点云分割的精度,还简化了模型结构并保持了较高的准确率。
点云处理:基于Paddle2.0尝试提出Kd-Unet对点云进行分割处理
项目效果
训练四十轮后的miou:
本次用到的数据集是ShapeNet,储存格式是.h5文件。
Kd-Unet是我首次自行实现的新网络架构,它结合了Kd-Networks中的特征提取与分割技术,并借鉴了Unet的设计理念,是一款针对点云的分割模型,其表现似乎不错。
注:在数据读取这里,可以借助scipy.spatial中的cKDTree很快地生成kdTree。
注:由于数据预处理流程耗时较长,我首先创建了用于读取并预处理训练数据的读取器。这样,在实际使用中,我可以直接导入这些预处理好的数据,大大加快了训练过程的速度(实际上这并没有节省时间,只是为了调试方便和便于读者尝试)。
train_loader = pointDataLoader(mode='train')登录后复制
==========load over==========登录后复制登录后复制
2、开始训练
In [147]
def train(): model = KDNet() model.train() optim = paddle.optimizer.Adam(parameters=model.parameters(), weight_decay=0.001) epoch_num = 100 all_iou = 0 for epoch in range(epoch_num): for batch_id, data in enumerate(train_loader()): split_dims_v = data[0] points_v = data[1] labels = data[2] inputs = paddle.to_tensor(points_v) labels = paddle.to_tensor(labels) predict = model(inputs, split_dims_v) loss = F.cross_entropy(predict, labels) iou, _, _ = paddle.fluid.layers.mean_iou(paddle.unsqueeze(paddle.argmax(predict, axis=-1), axis=-1), labels, 50) all_iou += iou if batch_id % 100 == 0: miou = all_iou / 100 all_iou = 0 print("epoch: {}, batch_id: {}, loss is: {}, miou is: {}".format(epoch, batch_id, loss.numpy(), miou.numpy())) loss.backward() optim.step() optim.clear_grad() if epoch % 4 == 0: paddle.save(model.state_dict(), './model/KDNet.pdparams') paddle.save(optim.state_dict(), './model/KDNet.pdopt')if __name__ == '__main__': train()登录后复制
⑥评估
1、创建评估数据读取器
In [151]
test_loader = pointDataLoader(mode='val')登录后复制
==========load over==========登录后复制登录后复制
2、评估数据(原label)可视化
In [156]
def test(): model = KDNet() model_state_dict = paddle.load('./model/KDNet.pdparams') model.load_dict(model_state_dict) for batch_id, data in enumerate(test_loader()): split_dims_v = data[0] points_v = data[1] labels = data[2] inputs = paddle.to_tensor(points_v) predict = model(inputs, split_dims_v) labels = paddle.to_tensor(labels) break; zdata = [] xdata = [] ydata = [] pre_label = [] for i in points_v[0].T: xdata.append(i[0]) ydata.append(i[1]) zdata.append(i[2]) for i in labels[0].numpy(): pre_label.append(i[0]) print(np.argmax(np.array(pre_label))) map_color = {0:'r', 1:'g', 2:'b', 3:'y'} Color = list(map(lambda x: map_color[x], pre_label)) xdata = np.array(xdata) ydata = np.array(ydata) zdata = np.array(zdata) from mpl_toolkits import mplot3d import matplotlib.pyplot as plt ax = plt.axes(projection='3d') ax.scatter3D(xdata, ydata, zdata, c=Color) plt.show()if __name__ == '__main__': test()登录后复制
- 录后复制登录后复制
<Figure size 432x288 with 1 Axes>登录后复制登录后复制
3、评估数据(预测)可视化
In [155]
def test(): model = KDNet() model_state_dict = paddle.load('./model/KDNet.pdparams') model.load_dict(model_state_dict) for batch_id, data in enumerate(test_loader()): split_dims_v = data[0] points_v = data[1] labels = data[2] inputs = paddle.to_tensor(points_v) predict = model(inputs, split_dims_v) labels = paddle.to_tensor(labels) break; zdata = [] xdata = [] ydata = [] pre_label = [] for i in points_v[0].T: xdata.append(i[0]) ydata.append(i[1]) zdata.append(i[2]) for i in np.argmax(predict[0].numpy(), 1): pre_label.append(i) print(np.argmax(np.array(pre_label))) map_color = {0:'r', 1:'g', 2:'b', 3:'y'} Color = list(map(lambda x: map_color[x], pre_label)) xdata = np.array(xdata) ydata = np.array(ydata) zdata = np.array(zdata) from mpl_toolkits import mplot3d import matplotlib.pyplot as plt ax = plt.axes(projection='3d') ax.scatter3D(xdata, ydata, zdata, c=Color) plt.show()if __name__ == '__main__': test()登录后复制
- 录后复制登录后复制
<Figure size 432x288 with 1 Axes>登录后复制登录后复制
以上就是点云处理:基于Paddle2.0尝试提出Kd-Unet对点云进行分割处理的详细内容,更多请关注其它相关文章!
