现在所有草图三维重建的顶会paper都用到了shapenet(其实也就不到十篇),有必要学习一下。
目录
ShapeNet简介
binvox文件格式
Python读取示例
下载
ShapeNet是一个由对象的三维CAD模型表示的丰富注释的,大规模的形状存储库。ShapeNet包含来自多种语义类别的3D模型,并按照WordNet分类法组织它们。它是一组数据集,为每个3D模型提供许多语义标注,如一致的刚性对准、零件和双边对称平面、物理尺寸、关键字以及其他计划的标注。注释通过基于web的公共接口提供,以支持对象属性的数据可视化,促进数据驱动的几何分析,并为计算机图形学和视觉研究提供大规模定量基准。ShapeNet已经索引了超过300万个模型,其中22万个模型被分为3135个类别(WordNet synsets)。
ShapeNetCore
ShapeNetCore是完整ShapeNet数据集的子集,具有单个干净的3D模型以及手动验证的类别和路线注释。它涵盖约55,300个独特的3D模型和55个常见对象类别。ShapeNetCore涵盖了流行的计算机视觉3D基准数据集PASCAL 3D +的12个对象类别。
ShapeNetSem
ShapeNetSem是一个较小的,注释更密集的子集,由分布在270个类别中的12,000个模型组成。除了手动验证的类别标签和一致的对齐方式之外,这些模型还带有实际尺寸,类别级别的材料成分估计以及总体积和总重量的注释。
binvox可读取3D模型文件,将其栅格化为二进制3D体素网格,然后写入生成的体素文件,以binvox格式存储3D点云格式文件,节约存储空间
在线读取器:https://raahii.github.io/simple_voxel_viewer/index.html
离线读取软件下载地址:https://www.patrickmin.com/viewvox/win/viewvox.exe?rnd=1612535001696693
import numpy as np
class Voxels(object):
def __init__(self, data, dims, translate, scale, axis_order):
self.data = data
self.dims = dims
self.translate = translate
self.scale = scale
# axis不是xyz坐标系的时候触发异常
assert (axis_order in ('xzy', 'xyz'))
self.axis_order = axis_order
def read_as_3d_array(fp, fix_coords=True):
dims, translate, scale = read_header(fp)
raw_data = np.frombuffer(fp.read(), dtype=np.uint8)
# if just using reshape() on the raw data:
# indexing the array as array[i,j,k], the indices map into the
# coords as:
# i -> x
# j -> z
# k -> y
# if fix_coords is true, then data is rearranged so that
# mapping is
# i -> x
# j -> y
# k -> z
values, counts = raw_data[::2], raw_data[1::2]
data = np.repeat(values, counts).astype(np.bool)
data = data.reshape(dims)
if fix_coords:
# xzy to xyz TODO the right thing
data = np.transpose(data, (0, 2, 1))
axis_order = 'xyz'
else:
axis_order = 'xzy'
return Voxels(data, dims, translate, scale, axis_order)
def read_header(fp):
# 读取binvox头文件
line = fp.readline().strip()
if not line.startswith(b'#binvox'):
raise IOError('Not a binvox file')
dims = list(map(int, fp.readline().strip().split(b' ')[1:]))
translate = list(map(float, fp.readline().strip().split(b' ')[1:]))
scale = list(map(float, fp.readline().strip().split(b' ')[1:]))[0]
line = fp.readline()
return dims, translate, scale
if __name__ == '__main__':
path = 'model.binvox'
with open(path, 'rb') as f:
model = read_as_3d_array(f)
# 尺寸(长宽高),转化矩阵,放缩系数
print(model.dims, model.translate, model.scale)
print(model.data)
官网的网速真的是一言难尽,5kb/s的速度我下载了一个星期。放到网盘自取吧。
https://pan.baidu.com/s/1-307NLJENO8MHgkcGRzm3Q 提取码: c1gv
https://pan.baidu.com/s/1FF4asm_pbw4jK8JOYksbxQ 提取码: cjx8
官网地址:https://www.shapenet.org/