PointNet.pytorch程序注释(二)点云分割

本文介绍了使用PointNet.pytorch库进行点云数据的3D分割和分类任务。首先,详细说明了训练过程,包括环境配置、训练脚本参数、数据集设置以及模型加载与评估。然后,展示了测试阶段如何加载预训练模型并进行点云的预测与可视化。通过运行提供的代码,可以观察到点云中不同类别的颜色区分,从而验证模型的分割效果。
摘要由CSDN通过智能技术生成

PointNet.pytorch程序注释(二)点云分割

论文及程序地址

论文原文
PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

源程序
链接: https://github.com/fxia22/pointnet.pytorch.

自己标注的程序
链接: https://github.com/jiangdi1998/PointNet.pytorch.

运行环境

硬件:i7-6700HQ、GTX960M-2G
软件:Ubuntu18.04、Python3.6、Pytorch1.6.0、cuda10.2
训练集:ShapeNet

训练train

pointnet.pytorch/Utils/train_classification.py
由于显存只有2G,故将训练的batch_size = 4
运行程序命令

python3 train_segmentation.py --dataset '/home/jiangdi/Downloads/jiangdi1998-pointnet.pytorch-master/pointnet.pytorch/shapenetcore_partanno_segmentation_benchmark_v0' --nepoch='2' --batchSize='4'

注释代码

from __future__ import print_function
from show3d_balls import showpoints
import argparse
import numpy as np
import torch
import torch.nn.parallel
import torch.utils.data
from torch.autograd import Variable
from pointnet.dataset import ShapeNetDataset
from pointnet.model import PointNetDenseCls
import matplotlib.pyplot as plt


#showpoints(np.random.randn(2500,3), c1 = np.random.uniform(0,1,size = (2500)))

parser = argparse.ArgumentParser()

parser.add_argument('--model', type=str, default='/home/jiangdi/Downloads/jiangdi1998-pointnet.pytorch-master/pointnet.pytorch/utils/seg/seg_model_Chair_1.pth', help='model path')#模型路径
parser.add_argument('--idx', type=int, default=0, help='model index') #选取model,例如0/704
parser.add_argument('--dataset', type=str, default='/home/jiangdi/Downloads/jiangdi1998-pointnet.pytorch-master/pointnet.pytorch/utils/shapenetcore_partanno_segmentation_benchmark_v0', help='dataset path')#数据集的路径
parser.add_argument('--class_choice', type=str, default='Chair', help='class choice') #选择识别的类别,例如椅子

opt = parser.parse_args()
print(opt) #打印路径、类别等信息

d = ShapeNetDataset(
    root=opt.dataset,
    class_choice=[opt.class_choice], #类别选择
    split='test', #测试集
    data_augmentation=False)

idx = opt.idx

print("model %d/%d" % (idx, len(d))) #选取model,例如0/704
point, seg = d[idx]
print(point.size(), seg.size()) #输出点云点数,seg
point_np = point.numpy()

cmap = plt.cm.get_cmap("hsv", 10)#上色
cmap = np.array([cmap(i) for i in range(10)])[:, :3]
gt = cmap[seg.numpy() - 1, :]

state_dict = torch.load(opt.model) #加载模型
classifier = PointNetDenseCls(k= state_dict['conv4.weight'].size()[0])
classifier.load_state_dict(state_dict)
classifier.eval() #固定

point = point.transpose(1, 0).contiguous() #仿射变换
point = Variable(point.view(1, point.size()[0], point.size()[1])) #point.size()[0]为3,point.size()[1]为2500,view相当于resize
pred, _, _ = classifier(point) #预测
pred_choice = pred.data.max(2)[1] #pred_choice为每个点的分类,例如输出为tensor([[1, 0, 0, ..., 0, 0, 2]])
print(pred_choice)

#print(pred_choice.size()) #torch.size[1,2500]
pred_color = cmap[pred_choice.numpy()[0], :] #根据类别为每个点上不同颜色

#print(pred_color.shape)#torch.size[3,2500]
showpoints(point_np, gt, pred_color) #调用show3d_ball程序显示3d图像

运行过程

训练后的权重文件保存至

point.pytorch/utils/cls

训练权重结果
在这里插入图片描述

测试test

pointnet.pytorch/Utils/show_seg.py
1.将权重文件的路径写入到测试文件中,其中show_seg.py修改第18行的

default='/home/jiangdi/Downloads/jiangdi1998-pointnet.pytorch-master/pointnet.pytorch/utils/seg/seg_model_Chair_1.pth'

2.修改18行的类别,例如chair

default='Chair'

运行程序命令

python3 show_seg.py

注释代码

from __future__ import print_function
from show3d_balls import showpoints
import argparse
import numpy as np
import torch
import torch.nn.parallel
import torch.utils.data
from torch.autograd import Variable
from pointnet.dataset import ShapeNetDataset
from pointnet.model import PointNetDenseCls
import matplotlib.pyplot as plt


#showpoints(np.random.randn(2500,3), c1 = np.random.uniform(0,1,size = (2500)))

parser = argparse.ArgumentParser()

parser.add_argument('--model', type=str, default='/home/jiangdi/Downloads/jiangdi1998-pointnet.pytorch-master/pointnet.pytorch/utils/seg/seg_model_Chair_1.pth', help='model path')#模型路径
parser.add_argument('--idx', type=int, default=0, help='model index') #选取model,例如0/704
parser.add_argument('--dataset', type=str, default='/home/jiangdi/Downloads/jiangdi1998-pointnet.pytorch-master/pointnet.pytorch/utils/shapenetcore_partanno_segmentation_benchmark_v0', help='dataset path')#数据集的路径
parser.add_argument('--class_choice', type=str, default='Chair', help='class choice') #选择识别的类别,例如椅子

opt = parser.parse_args()
print(opt) #打印路径、类别等信息

d = ShapeNetDataset(
    root=opt.dataset,
    class_choice=[opt.class_choice], #类别选择
    split='test', #测试集
    data_augmentation=False)

idx = opt.idx

print("model %d/%d" % (idx, len(d))) #选取model,例如0/704
point, seg = d[idx]
print(point.size(), seg.size()) #输出点云点数,seg
point_np = point.numpy()

cmap = plt.cm.get_cmap("hsv", 10)#上色
cmap = np.array([cmap(i) for i in range(10)])[:, :3]
gt = cmap[seg.numpy() - 1, :]

state_dict = torch.load(opt.model) #加载模型
classifier = PointNetDenseCls(k= state_dict['conv4.weight'].size()[0])
classifier.load_state_dict(state_dict)
classifier.eval() #固定

point = point.transpose(1, 0).contiguous() #仿射变换
point = Variable(point.view(1, point.size()[0], point.size()[1])) #point.size()[0]为3,point.size()[1]为2500,view相当于resize
pred, _, _ = classifier(point) #预测
pred_choice = pred.data.max(2)[1] #pred_choice为每个点的分类,例如输出为tensor([[1, 0, 0, ..., 0, 0, 2]])
print(pred_choice)

#print(pred_choice.size()) #torch.size[1,2500]
pred_color = cmap[pred_choice.numpy()[0], :] #根据类别为每个点上不同颜色

#print(pred_color.shape)#torch.size[3,2500]
showpoints(point_np, gt, pred_color) #调用show3d_ball程序显示3d图像

运行结果
在这里插入图片描述在这里插入图片描述

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值