pointnet.pytorch代码解析
pointnet.pytorch代码解析
代码运行
Training
cd utils
python train_classification.py --dataset <dataset path> --nepoch=<number epochs> --dataset_type <modelnet40 | shapenet>
python train_segmentation.py --dataset <dataset path> --nepoch=<number epochs>
运行结果
Classification on ShapeNet
epoch = 10 Overall Acc Original implementation N/A this implementation(无 feature transform) 95.6 this implementation(有 feature transform) 92.97 Segmentation on ShapeNet
dataset代码
读取的数据格式
ShapeNetDataset():默认读取分割数据,返回值d:点云个数*(点云数据ps,标签seg)
数据ps:torch.Size([2500, 3]) torch.FloatTensor ,一个点云有2500个点,每个点3个特征
标签seg:torch.Size([2500]) torch.LongTensor,每个点都有一个标签
代码及注释如下:if __name__ == '__main__':
dataset = sys.argv[1] # 运行命令中传入的第一个参数
datapath = sys.argv[2] # 运行命令中传入的第二个参数 if dataset == 'shapenet':
# 读取标签为Chair的分割数据
d = ShapeNetDataset(root = datapath, class_choice = ['Chair'])
print(len(d)) #2658,共有2658个Chair点云
ps, seg = d[0]
print(ps.size(), ps.type(), seg.size(),seg.type())
# torch.Size([2500, 3]) torch.FloatTensor ,第一个点云有2500个点,每个点3个特征
# torch.Size([2500]) torch.LongTensor,每个点都有一个标签 d = ShapeNetDataset(root = datapath, classification = True)
print(len(d))
ps, cls = d[0]
print(ps.size(), ps.type(), cls.size(),cls.type())
# torch.Size([2500, 3]) torch.FloatTensor torch.Size([1]) torch.LongTensor,每个点云一个标签
# get_segmentation_classes(datapath)
数据读取
model代码
网络整体结构
if __name__ == '__main__':
# input transform
sim_data = Variable(torch.rand(32,3,2500)) # 32个点云,3个特征,2500个点
trans = STN3d()
out = trans(sim_data) # stn torch.Size([32, 3, 3]),返回3x3的输入变换矩阵
print('stn', out.size())
print('loss', feature_transform_regularizer(out)) # feature transform
sim_data_64d = Variable(torch.rand(32, 64, 2500))
trans = STNkd(k=64)
out = trans(sim_data_64d) # stn64d torch.Size([32, 64, 64]),返回64x64的特征变换矩阵
print('stn64d', out.size())
print('loss', feature_transform_regularizer(out)) # global feat
pointfeat = PointNetfeat(global_feat=True)
out, _, _ = pointfeat(sim_data) # global feat torch.Size([32, 1024]),32个点云,每个有1024维全局特征
print('global feat', out.size()) # point feat
pointfeat = PointNetfeat(global_feat=False)
out, _, _ = pointfeat(sim_data) # point feat torch.Size([32, 1088, 2500]),2500个点,每个点有1024+64维特征
print('point feat', out.size()) # Classification
cls = PointNetCls(k = 5)
out, _, _ = cls(sim_data) # class torch.Size([32, 5]),global feat经过全连接层,得到在5个类别上的概率信息
print('class', out.size()) # Segmentation
seg = PointNetDenseCls(k = 3)
out, _, _ = seg(sim_data) # seg torch.Size([32, 2500, 3]),point feat经过一维卷积,得到在3个类别上概率信息
print('seg', out.size())
PointNetfeat特征提取网络
class PointNetfeat(nn.Module):
'''
点云的特征提取网络:global feature 和 point features
'''
def __init__(self, global_feat = True, feature_transform = False):
super(PointNetfeat, self).__init__()
self.stn = STN3d()
self.conv1 = torch.nn.Conv1d(3, 64, 1)
self.conv2 = torch.nn.Conv1d(64, 128, 1)
self.conv3 = torch.nn.Conv1d(128, 1024, 1)
self.bn1 = nn.BatchNorm1d(64)
self.bn2 = nn.BatchNorm1d(128)
self.bn3 = nn.BatchNorm1d(1024)
self.global_feat = global_feat
self.feature_transform = feature_transform
if self.feature_transform:
self.fstn = STNkd(k=64) def forward(self, x):
n_pts = x.size()[2]
trans = self.stn(x)
x = x.transpose(2, 1)
x = torch.bmm(x, trans) # 乘以3x3变换矩阵
x = x.transpose(2, 1)
x = F.relu(self.bn1(self.conv1(x))) if self.feature_transform: # 特征变换,64x64矩阵
trans_feat = self.fstn(x)
x = x.transpose(2,1)
x = torch.bmm(x, trans_feat)
x = x.transpose(2,1)
else:
trans_feat = None pointfeat = x # nx64的点特征
x = F.relu(self.bn2(self.conv2(x)))
x = self.bn3(self.conv3(x))
x = torch.max(x, 2, keepdim=True)[0] # Maxpool
x = x.view(-1, 1024)
if self.global_feat:
return x, trans, trans_feat # x:mx1x1024的global feature,两个变换矩阵
else:
x = x.view(-1, 1024, 1).repeat(1, 1, n_pts)
return torch.cat([x, pointfeat], 1), trans, trans_feat # global feature+point features = nx1088的点特征矩阵
pointnet.pytorch代码解析的更多相关文章
- 【论文笔记】AutoML for MCA on Mobile Devices——论文解读与代码解析
理论部分 方法介绍 本节将详细介绍AMC的算法流程.AMC旨在自动地找出每层的冗余参数. AMC训练一个强化学习的策略,对每个卷积层会给出其action(即压缩率),然后根据压缩率进行裁枝.裁枝后,A ...
- VBA常用代码解析
031 删除工作表中的空行 如果需要删除工作表中所有的空行,可以使用下面的代码. Sub DelBlankRow() DimrRow As Long DimLRow As Long Dimi As L ...
- [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM
一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...
- [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写
一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...
- [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC
一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...
- [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC
一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
- Kakfa揭秘 Day8 DirectKafkaStream代码解析
Kakfa揭秘 Day8 DirectKafkaStream代码解析 今天让我们进入SparkStreaming,看一下其中重要的Kafka模块DirectStream的具体实现. 构造Stream ...
- linux内存管理--slab及其代码解析
Linux内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配,被称为slab高速缓存. 内存管理的目标是提供一种方法,为实 ...
随机推荐
- 【模板】Linux下输出文件的对比
命令格式: diff+[参数]+[文件1或目录1]+[文件2或目录2] 命令参数: 指定要显示多少行的文本.此参数必须与-c或-u参数一并使用. -a或--text diff预设只会逐行比较文本文件. ...
- MySQL:一条SQL是如何执行的
目录 MySQL基本架构 Server层 连接器 查询缓存 分析器 优化器 执行器 存储引擎层 InnoDB MyISAM Memory SQL执行流程 MySQL基本架构 在讲SQL语句是如何执行之 ...
- vue项目使用Echarts制作项目工期甘特图
目录 1,前言 2,布局和数据部分 3,制作甘特图 1,前言 项目迭代过程中,碰上一个需求,要求用甘特图的方式显示项目的工期进度,开完会我赶紧搜索一下甘特图是啥东东,大概了解之后,做出了如下样式 Ec ...
- 安装nodejs版本模块报错notsup Unsupported platform for n
使用npm install -g n报错 如果出现npm ERR! notsup Unsupported platform for n@6.7.0: wanted {"os":&q ...
- Go语言深度比较值是否相等
Go语言深度比较值是否相等 需求描述: 我们在开发过程中经常会遇到一些需要比较值是否相等的场景,例如比较两个数组.结构体.Map.等,自己写这些代码比较繁琐,大部分时候这里都可以使用到反射reflec ...
- Mysql在线DDL
1. Mysql各版本DDL方式 1.1 MysqlDDL演进 当mysql某个业务表上有未提交的活动事务的时候,你去执行在线DDL,这相当危险,直接会被卡住,show processlist里面会 ...
- Linux-ELK日志收集
1.ELK简介 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件.新增了一个FileBeat,它是一个轻量级的日志收集处理工 ...
- 20 批量ping主机
#!/bin/bash IP_LIST="`cat /root/ip.txt`" ip_dir="/root/ip_dir" [ ! -d ${ip_dir} ...
- Visual Studio 2010 SP1 中文升级补丁ISO完整版下载 (含多国语言)
最近事情比较多,差点忘记了这个VS2010 SP1的升级补丁更新了,程序员们赶快更新吧!这次发布的SP1包含了下列语言:英文,简体中文,繁体中文,法语,德语,印度语,日语,韩语,俄语以及西班牙语. V ...
- 暑假自学java第九天
1,接口回调是指:可以将接口实现类的对象赋给该接口声明的接口变量,那么该接口变量就可以调用接口实现类对象中的方法.不同的类在使用同一接口时,可能具有不同的功能体现,即接口实现类的方法体不必相同,因此, ...