ubuntu安装 veloview_Pointnet+Frustum-Pointnet复现(Pytorch1.3+Ubuntu18.04)-程序员宅基地

技术标签: ubuntu安装 veloview  

1.数据集和预处理

1.1 ModelNet40

ModelNet40是一个大规模3D CAD数据集,始于3D ShapeNets: A Deep Representation for Volumetric Shapes

Zhirong,创建初衷是为了学习到能良好捕捉类内差别的3D表示,比当时最新的数据集大22倍。包含151,128个3D CAD模型和660个不同类别,如下图。

作者在实验时仅选取了40个类别,每个类别各100个不同的CAD模型,得到4000个CAD模型。(但我下载出来的ModelNet40并不是4000个CAD模型,而是训练集有9843个,测试集有2468个,而且类内数量不同)

1.1.1 ModelNet10

ModelNet10选取了对应于NYU RGB-D数据集的其中10个类别。

1.1.2 原始数据分析和可视化

这里CAD模型是.off格式,可以在ubuntu上用meshlab进行可视化,可以旋转缩放。

比如airplane_0001.off

OFF

90714 104773 0

20.967 -26.1154 46.5444

21.0619 -26.091 46.5031

-1.08889 46.8341 38.0388

3 24 25 26

3 25 24 27

...

3 90711 90710 90713

第二行三个参数表示有90714个顶点,104773个面,0个边。

然后是90714行,每行是点的坐标。

最后是104773行,每行表示面,3指3个点,24 25 26指点的索引。

在meshlab中可以看到:

Pointet官方提供的数据是已经处理过的.h5格式,而非ModelNet40的.OFF,而且并没有给出读取OFF并写入.h5的代码,却有读取ply的代码。

以其中一个ply_data_train0.h5为例,查看其中的数据

import numpy as np

import h5py

import os

#example of a single ply_data_train0.h5

f = h5py.File('modelnet40_ply_hdf5_2048/ply_data_train0.h5', 'r')

dset = f.keys()#

data = f['data'][:]#(2048, 2048, 3),dtype=float32,min=-0.9999981,max=0.9999962,mean=2.1612625e-09

faceId = f['faceId'][:]#(2048, 2048),dtype=int32,min=0,max=1435033

label = f['label'][:]#(2048,1),dtype=uint8,min=0,max=39

normal = f['normal'][:]#(2048, 2048, 3),dtype=float32,min=-1.0,max=1.0,mean=-0.0041686897

对于此,PointNet论文中已经有所解释,

We uniformly sample 1024 points on mesh faces according to face area and normalize them into a unit sphere.During training we augment the point cloud on-the-fly by randomly rotating the object along the up-axis and jitter the position of each points by a Gaussian noise with zero mean and 0.02 standard deviation.(在网格面上均匀采样1024个点,标准化为单位圆。训练时增强数据:一是沿up-axis随机旋转,二是点云抖动,对每个点增加一个噪声位移,噪声的均值为0,标准差为0.02)

可以推理出,data是从均匀采样后且标准化为单位圆后的2048个点,faceId是2048个点对应的面的序号,label是类别标签,normal是法向量。为了验证data是否已标准化,我做了以下验证,求点云的直径,标准化后应该为1。可以看出已经很接近1了(但不清楚为什么有点误差)。

>>> np.max(np.sqrt(np.sum(abs(data[1])**2,axis=-1)))

0.94388014

>>> np.max(np.sqrt(np.sum(abs(data[2])**2,axis=-1)))

0.9544609

可以看出normal确实是对data标准化为单位圆后的结果。这里对标准化的方法进一步分析, pointnet/utils/pc_util.py 中有以下代码,可以直接使用。这里标准化是用点云/直径的方式,如果用min-max标准化会导致变形。

# Normalize the point cloud

# We normalize scale to fit points in a unit sphere

if normalize:

centroid = np.mean(points, axis=0)

points -= centroid

furthest_distance = np.max(np.sqrt(np.sum(abs(points)**2,axis=-1)))

points /= furthest_distance

接下来回来继续看Pointnet官方,整个文件夹一共有7个.h5文件,应该包括了整个训练集和测试集。

# all .h5

datapath = 'modelnet40_ply_hdf5_2048'

for root, dirs, files in os.walk(datapath):

for _f in files:

if(_f.endswith('.h5')):

f = h5py.File(os.path.join(datapath,_f), 'r')

dset = f.keys()

data = f['data'][:]

print(_f,data.shape)

'''Results

ply_data_train1.h5 (2048, 2048, 3)

ply_data_test0.h5 (2048, 2048, 3)

ply_data_train2.h5 (2048, 2048, 3)

ply_data_test1.h5 (420, 2048, 3)

ply_data_train3.h5 (2048, 2048, 3)

ply_data_train4.h5 (1648, 2048, 3)

ply_data_train0.h5 (2048, 2048, 3)

可以看到,train有5个.h5,一共是9840个(2048,3)维的点,而test有2个.h5,一共有2468个点,与论文里说的一致。

1.1.3 随机采样

“在网格面上均匀采样1024个点,标准化为单位圆。”我的代码如下(由于pointnet没给采样代码,这里先用最简单的随机采样进行实现):

npoints = 1024

points = points_unit_sphere

choice = np.random.choice(len(faces), npoints, replace=True)

idxs = faces[choice,1:]

points_subset = np.mean(points[idxs],axis=1)

pyplot_draw_point_cloud(points_subset,'points_subset')

运行结果:

也可以直接从N个顶点中选1024个,有的人是这么实现的,不知道会不会影响结果:

points = points_unit_sphere

choice = np.random.choice(len(points), npoints, replace=True)

points_subset = points[choice, :]

pyplot_draw_point_cloud(points_subset,'points_subset')

运行结果:

1.1.4 最远点采样

后来发现随机采样效果很差,于是做了以下最远点采样的可视化。(最远点采样也是均匀采样的一种)

最远点采样的思想很简单,即一个一个选点,要求当前点的选取与上一个点的距离最大;但速度也比较慢,从151185个点采样到1024要花Time 3.887915030005388s,相比随机采样的Time 0.001566361985169351 s增大了1000倍。代码如下,参考了博客https://blog.csdn.net/weixin_39373480/article/details/88878629#37__330

def farthest_point_sample(xyz, npoint):

N, C = xyz.shape

centroids = np.zeros(npoint)

distance = np.ones(N) * 1e10

farthest = np.random.randint(0, N)# random select one as centroid

for i in range(npoint):

centroids[i] = farthest

centroid = xyz[farthest, :].reshape(1, 3)

dist = np.sum((xyz - centroid) ** 2, -1)

mask = dist < distance

distance[mask] = dist[mask]

farthest = np.argmax(distance)# select the farthest one as centroid

#print('index:%d, dis:%.3f'%(farthest,np.max(distance)))

return centroids

xyz = points.copy()

start = time.perf_counter()

points_farthest_index = farthest_point_sample(xyz,1024).astype(np.int64)

points_farthest = xyz[points_farthest_index,:]

print("%d to %d"%(xyz.shape[0],points_farthest.shape[0]))

print("Time {} s".format(float(time.perf_counter()-start)))

1.1.5 数据增强

Pointnet论文中训练时增强数据:一是沿垂直方向随机旋转,二是点云抖动,对每个点增加一个噪声位移,噪声的均值为0,标准差为0.02,我的代码如下:

def data_aug(self, points):

if self.rotation:

theta = np.random.uniform(0, np.pi * 2)

rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]])

points[:, [0, 2]] = points[:, [0, 2]].dot(rotation_matrix) # random rotation

if self.jiggle:

points += np.clip(np.random.normal(0, 0.01, size=points.shape),-0.05,0.05) # random jitter

return points

运行结果

1.2 ShapeNet

ShapeNet也是一个大型3D CAD数据集,包含3Million+ models and 4K+ categories。旨在采用一种数据驱动的方法来从各个对象类别和姿势的原始3D数据中学习复杂的形状分布(比如看到杯子侧面就能预测到里面是空心的),并自动发现分层的组合式零件表示。包含的任务有:object category recognition, shape completion, part segmentation,Next-Best-View Prediction, 3D Mesh Retrieval.但是,ShapeNet(这篇文章中)使用的模型采用卷积深度置信网络将几何3D形状表示为3D体素网格上二进制变量的概率分布,而不是像后来出现的PointNet那样直接以点云的原始形式作为输入。

1.2.1 ShapeNet

1.2.2 原始数据分析和可视化

为了方便起见,这里直接用pointnet作者提供的shapenet_part_seg_hdf5_data(346MB)。

test_file = '/home/aming/文档/reproduced/PointNet1_2_pytorch_reproduced/data/ShapeNet/hdf5_data/ply_data_test0.h5'

f = h5py.File(test_file, 'r')

dset = f.keys()#

data = f['data']#(2048, 2048, 3)

label = f['label']#(2048, 1)

pid = f['pid']#(2048, 2048)

points = data[0]

pyplot_draw_p

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34547317/article/details/112012421

智能推荐

企业文件交换怎样进行有效防泄密管控?选对方案才能事半功倍-程序员宅基地

文章浏览阅读310次,点赞5次,收藏11次。飞驰云联Ftrans DLP深度结合企业文件交换场景、以企业文件交换安全管控需求为切入点,为企业提供行之有效的文件交换防泄密管控解决方案,该方案已服务金融、集成电路、政府、能源电力、汽车制造等多个重点领域的企业,帮助企业筑牢安全防线,实现有效的建设效果。文件交换会涉及不同的网络、系统及人员角色,存在泄露的安全风险;Ftrans DLP与企业文件交换场景深度契合,串联在企业文件交换业务场景中,无论是内部不同网络安全域间、还是企业内外部间文件交换,均可应用,让企业平滑、严密地实现文件交换过程的防泄密管控。

【MySQL高级】MySql中常用工具及Mysql 日志_sql工具 自动生成日志文件-程序员宅基地

文章浏览阅读879次。MySql中常用工具、Mysql 日志_sql工具 自动生成日志文件

GBASE首批接入中国版ChatGPT“文心一言“ 打造DB+AI全系服务_文心一言 对接 git-程序员宅基地

文章浏览阅读262次。云计算背景之下,传统的数据库优化更多基于经验,面对多种类型的数据库产品以及复杂的数据库服务,已难以满足业务开展的高性能需求,基于人工智能的数据库优化即AI4DB将大幅降低数据库使用门槛,在SQL生成、故障处理和性能优化等方面提供助力。GBASE将优先内测试用文心一言,集成文心一言的技术能力,与百度在产品研发、标准制定等多个领域展开深化合作,通过技术共享、培训赋能、联合营销等方式,强化竞争力,为用户打造全场景DB+AI解决方案及服务,同时依托智慧互联、创新互联,引领数据库产业变革与升级。_文心一言 对接 git

css - 公众号样式-程序员宅基地

文章浏览阅读1.1k次。1 /* 2 * @Author: WJ_LONG 3 * @Date: 2018-09-06 15:32:06 4 * @Last Modified by: WJ_LONG 5 * @Last Modified time: 2018-09-07 16:18:09 6 * @animation-display-address:https://da..._公众号css

一天一条Linux指令-nmap_nmap: command not found-程序员宅基地

文章浏览阅读312次。使用nmap扫描服务器端口的一次操作本文来自:http://www.vktone.com/articles/nmap_windows_machines.html (本人新开的独立博客地址)nmap是Linux下常用的端口扫描工具,它可以检测主机是否在线,是否开启了某个服务端口,使用了何种操作系统等。我经常用它来检测远程的 Windows服务器的ip地址,因为不是固定ip地址,该_nmap: command not found

php mysql日期戳转时间戳_php日期转时间戳,指定日期转换成时间戳-程序员宅基地

文章浏览阅读44次。写过PHP+MySQL的程序员都知道有时间差,UNIX时间戳和格式化日期是我们常打交道的两个时间表示形式,Unix时间戳存储、处理方便,但 是不直观,格式化日期直观,但是处理起来不如Unix时间戳那么自如,所以有的时候需要互相转换,下面给出互相转换的几种转换方式。一、在MySQL中完成这种方式在MySQL查询语句中转换,优点是不占用PHP解析器的解析时间,速度快,缺点是只能用在数据库查询中,有局限..._mysql 时间戳类型转换 php

随便推点

java 动态树代码_treeview-min.js 源代码在线查看 - 目录树,在脚本中可以直接调用后台java代码,动态加载数据至页面显示. 资源下载 虫虫电子下载站...-程序员宅基地

文章浏览阅读102次。/*Copyright (c) 2007, Yahoo! Inc. All rights reserved.Code licensed under the BSD License:http://developer.yahoo.net/yui/license.txtversion: 2.3.0*/YAHOO.widget.TreeView=function(id){if(id){this.init(..._treeviewer.min.js html2canvas.min.js orgchart

电源纹波测量方法_测电源纹波时220v要接大地吗-程序员宅基地

文章浏览阅读2.8k次。基本要求:使用示波器AC 耦合,20MHz 带宽限制,拔掉探头的地线1,AC 耦合是去掉叠加的直流电压,得到准确的波形。2,打开20MHz 带宽限制是防止高频噪声的干扰,防止测出错误的结果。因为高频成分幅值较大,测量的时候应除去。3,拔掉示波器探头的接地夹,使用接地环测量,是为了减少干扰。很多部门没有接地环,如果误差允许也直接用探头的接地夹测量。但在判断是否合格时要考虑这个因素。还有一点是..._测电源纹波时220v要接大地吗

asp.net如何去掉HTML标记。.net去除html标记_.net 不输出html标签-程序员宅基地

文章浏览阅读659次。asp.net如何去掉HTML标记 /// &lt;summary&gt; /// 去除HTML标记 /// &lt;/summary&gt; /// &lt;param name="NoHTML"&gt;包括HTML的源码 &lt;/param&gt; /// &lt;returns&gt;已经去除后的文字&lt;/ret.._.net 不输出html标签

JVM总结上篇_为什么要了解jvm-程序员宅基地

文章浏览阅读645次。JVM(Java Virtual Machine)是Java程序的运行环境,它是一个虚拟的计算机,可以在不同的平台上运行Java程序,实现了Java程序的跨平台性。JVM包括类加载器、解释器、即时编译器、垃圾收集器等组件。类加载器:类加载器负责将Java类文件加载到JVM中,Java程序在运行时会根据需要动态加载类文件。JVM中有三种类加载器,分别是Bootstap ClassLoader、Extension ClassLoader和System ClassLoader。_为什么要了解jvm

vue数学公式编辑器_将Vue包装器用于MathLive数学编辑器的示例-程序员宅基地

文章浏览阅读5k次。vue数学公式编辑器 Vue-Mathlive (vue-mathlive)The MathLive Vue wrapper provides a Vue component that implements a <mathfield> HTML tag. MathLive Vue包装器提供了实现<mathfield> HTML标签的Vue组件。 The compone..._mathlive

详细解读wordpress各级结构目录以及里面文件的用处_wordpress目录结构-程序员宅基地

文章浏览阅读784次。wp-load.php 是 WordPress 的核心文件之一,它负责加载和初始化所有必要的 WordPress 常量、函数和文件。这些文件和函数处理一些特定功能,例如用户管理、文件上传、后台菜单等。目录包含所有后台管理面板的源代码文件,包括样式表文件、JavaScript 文件和图片等,其作用是操纵和管理 WordPress 网站的内容、主题、布局和设置等。/wp-config.php 是 WordPress 的核心配置文件,它包含有关 WordPress 数据库、文件路径、密钥等的配置信息。_wordpress目录结构

推荐文章

热门文章

相关标签