我看的是这位大佬的代码:

GitHub - yanx27/Pointnet_Pointnet2_pytorch: PointNet and PointNet++ implemented by pytorch (pure python) and on ModelNet, ShapeNet and S3DIS.

T-Net网络解析

class STN3d(nn.Module):def __init__(self, channel):super(STN3d, self).__init__() self.conv1 = torch.nn.Conv1d(channel, 64, 1) self.conv2 = torch.nn.Conv1d(64, 128, 1)self.conv3 = torch.nn.Conv1d(128, 1024, 1) self.fc1 = nn.Linear(1024, 512) self.fc2 = nn.Linear(512, 256)self.fc3 = nn.Linear(256, 9)self.relu = nn.ReLU()self.bn1 = nn.BatchNorm1d(64)self.bn2 = nn.BatchNorm1d(128)self.bn3 = nn.BatchNorm1d(1024)self.bn4 = nn.BatchNorm1d(512)self.bn5 = nn.BatchNorm1d(256)def forward(self, x):batchsize = x.size()[0] # 24x3x1024x = F.relu(self.bn1(self.conv1(x)))# 24x64x1024x = F.relu(self.bn2(self.conv2(x)))# 24x128x1024      x = F.relu(self.bn3(self.conv3(x)))# 24x1024x1024x = torch.max(x, 2, keepdim=True)[0]# 24x1024x1x = x.view(-1, 1024) #24x1024x = F.relu(self.bn4(self.fc1(x))) #24x512x = F.relu(self.bn5(self.fc2(x))) #24x256x = self.fc3(x) #24x9iden = Variable(torch.from_numpy(np.array([1, 0, 0, 0, 1, 0, 0, 0, 1]).astype(np.float32))).view(1, 9).repeat(batchsize, 1) if x.is_cuda:iden = iden.cuda()x = x + iden # x = x.view(-1, 3, 3) #3x3 transform 24 x 3 x 3return x

训练使用的数据集modelnet数据集,每批训练的batchsize是24

点云数据最开始的格式是24x1024x3

我们将其转化成24x3x1024的形式输入U-net网络

class PointNetEncoder(nn.Module):def __init__(self, global_feat=True, feature_transform=False, channel=3):super(PointNetEncoder, self).__init__() # 2self.stn = STN3d(channel) # 24 x 3 x 3self.conv1 = torch.nn.Conv1d(channel, 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_featself.feature_transform = feature_transformif self.feature_transform:self.fstn = STNkd(k=64)def forward(self, x):B, D, N = x.size() # 24x3x1024trans = self.stn(x) # trans 24x3x3x = x.transpose(2, 1)# 24x1024x3 z he y jiaohhuan if D > 3:feature = x[:, :, 3:]x = x[:, :, :3]x = torch.bmm(x, trans) # 24x1024x3 if D > 3:x = torch.cat([x, feature], dim=2)x = x.transpose(2, 1) # 24x3x1024x = F.relu(self.bn1(self.conv1(x)))#24x64x1024if self.feature_transform:trans_feat = self.fstn(x) #24x64x64x = x.transpose(2, 1)# 24x1024x64x = torch.bmm(x, trans_feat)# 24x1024x64x = x.transpose(2, 1)# 24x64x1024else:trans_feat = Nonepointfeat = x # 24x64x1024x = F.relu(self.bn2(self.conv2(x)))# 24x128x1024x = self.bn3(self.conv3(x))# 24x1024x1024x = torch.max(x, 2, keepdim=True)[0]# 24x1024x1x = x.view(-1, 1024)# 24x1024if self.global_feat:return x, trans, trans_feat #24x1024 24x3x3 24x64x64else:x = x.view(-1, 1024, 1).repeat(1, 1, N)return torch.cat([x, pointfeat], 1), trans, trans_feat

trans我们通过U-net网络生成一个24x3x3的张量,

将原来的数据24x3x1024通过transpose(2,1)操作转化成24x1024x3

然后通过torch.bmm()与原来的数据进行matrix multiply操作


torch.bmm(input, mat2, *, out=None) → Tensor
If input is a (b×n×m) tensor, mat2 is a (b×m×p) tensor, out will be a (b×n×p)tensor.

然后通过x.transpose(2,1)继续将数据转化成24x3x1024的形式

之后经过一层卷积,归一化,以及relu操作得到24x64x1024的数据(64通道)

接下来就是另一个feature_transform

通过STNkd(k=64)与上面身成3✖3矩阵的操作类似,最后生成一个26x64x64的矩阵

然后同样先进行transpose(2,1)操作生成24x1024x64的数据,然后通过torch.bmm操作

生成24x1024x64数据的操作,最后再进行一次transpose(2,1)操作

Pointnet模型源码解读(更新中)相关推荐

  1. IOCP 网络通讯模型源码解读

    From: http://hi.baidu.com/tsingsing/item/1aa5062fa27791fa50fd87b7 以前写服务器的时候用的是iocp,最近偶然发现windows的 网络 ...

  2. 编写代码、打印图4-2所示的图形python_Python之turtle库画各种有趣的图及源码(更新中)_一个超会写Bug的程序猿的博客-CSDN博客...

    原文作者:一个超会写Bug的安太狼 原文标题:Python之turtle库画各种有趣的图及源码(更新中) 发布时间:2021-02-09 03:35:11 Turtle库是Python语言中一个很流行 ...

  3. 源码解读 Spring中Bean扫描的原理

    前言. Spring和MyBatis整合的时候用到的Bean扫描是它Spring本身提供的.这一篇文章就写一下Spring是如何实现Bean扫描的. 不得不说Bean扫描是一个很重要的技术,在Spri ...

  4. Python之turtle库画各种有趣的图及源码(更新中)

    Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...

  5. mobx 源码解读(四):讲讲 autorun 和 reaction

    原文地址:mobx autorun 文本是 mobx 源码解读系列 第四篇 本系列文章全部采用 mobx 较新版本:v5.13.0 mobx 源码解读 issue,欢迎讨论 技术前提 在阅读之前,希望 ...

  6. bert模型简介、transformers中bert模型源码阅读、分类任务实战和难点总结

    bert模型简介.transformers中bert模型源码阅读.分类任务实战和难点总结:https://blog.csdn.net/HUSTHY/article/details/105882989 ...

  7. SMPL模型及源码解读

    Contents Preface 一.模型解读 二.源码解读 Citation Preface SMPL主要是人体三维重建常用模型,本文主要对模型及源码进行了解读(自己的理解不一定正确),为以后更好的 ...

  8. Pseudo-document-based Topic Model(基于伪文档的主题模型)的理解以及源码解读

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. 论文来源 Zuo Y, Wu J, Zhang H, e ...

  9. Fabric中PBFT源码解读——Checkpoint机制

    文章目录 1. 写在前面 1.1 前置阅读 1.2 对TestCheckpoint函数的测试 2. 对TestCheckpoint函数运行流程的解读 2.1 Checkpoint和Water mark ...

  10. ios html zfplayer,【iOS】ZFPlayer源码解读中

    前言 本篇继ZFPlayer源码解读基础之上,主要解析说明控制层与播放器,因为在上篇文章至现在并未提及丝毫关于这两个类业务的实现. 首先说下这两个类各自的职责. 控制层:主要负责响应与用户之间的交互, ...

最新文章

  1. mac平台反编译apk,获取源码,androidmanifest和资源文件
  2. 第1章 Qt概述和下载安装及创建工程
  3. oracle 动态sql列转行_Oracle 行转列 动态出转换的列
  4. PHP的JSON封装
  5. ajax获取后台数据出错parsererror
  6. 最牛营业部——国信泰然九路揭秘
  7. 内部类可以引用它的包含类的成员吗?有没有什么限制?
  8. WinForm程序启动时不显示主窗体的实现方法
  9. linux 进入shell命令,linux或者shell进入vi命令
  10. java加法运算器界面_Java 接口实现计算器加减乘除(字符交互界面)
  11. Android 基于监听的事件处理机制
  12. python两台电脑文件传输_两台电脑怎么互相连接传送文件?
  13. 华为交换机配置远程连接
  14. Windows图片查看器不出现下一张和上一张按钮
  15. Python运算符优先级和结合性
  16. 【Windows无法访问指定设备,路径或文件,您可能没有合适的权限访问】
  17. android 北斗测试,安卓手机查看是否支持北斗导航系统的详细检测方法
  18. 分类变量、有序变量、数值变量差异分析(二)t检验
  19. 20155209 20155230 《信息安全技术》实验四 木马及远程控制技术
  20. 达梦数据库:备份 冷备与热备

热门文章

  1. 腾讯云 短信 简单使用
  2. 外贸营销网站系统开发功能案例制作
  3. 云课堂让职业院校云计算教学更简单
  4. 【美味蟹堡王今日营业】论文学习笔记10-02
  5. html链接鼠标在悬停颜色,如何让HTML链接显示悬停样式?
  6. 分布式机器学习原理及实战(Pyspark)
  7. redis雪崩、穿透、击穿的原因和解决方案
  8. 基于聚类分析和因子分析的空气质量研究
  9. 80后,规划好你的职业道路!
  10. 隐藏窗口任务栏图标的三种方法