人工智能深度学习计算机视觉图形学【免费下载链接】pytorch3dPyTorch3D is FAIRs library of reusable components for deep learning with 3D data项目地址https://gitcode.com/gh_mirrors/py/pytorch3d点击查看免费下载本文是 PyTorch3D 官方数据加载笔记docs/notes/datasets.md的完整技术指南系统讲解两大常用 3D 数据集ShapeNetCore与R2N2的加载、批处理与可微渲染实践。读者将掌握ShapeNetCore与R2N2两个数据加载类的构造参数、__getitem__返回的数据字典结构、配套的collate_fn批处理函数以及内置render函数的四种模型选取方式并了解其与 PyTorch3DMeshes结构与可微渲染管线的衔接原理。在 PyTorch3D 的三维深度学习工作流中数据加载是连接原始 CAD 模型与网格操作、渲染、损失计算的第一步。PyTorch3D 在 pytorch3d/datasets/ 目录下为两个最常用的公开数据集提供了开箱即用的torch.utils.data.Dataset实现ShapeNetCore位于 pytorch3d/datasets/shapenet/shapenet_core.py与R2N2位于 pytorch3d/datasets/r2n2/r2n2.py。二者共享一个抽象基类ShapeNetBase位于 pytorch3d/datasets/shapenet_base.py该基类实现了纹理加载、渲染参数解析、类别随机采样等公共逻辑。ShapeNetCore 数据加载器数据集背景与版本差异ShapeNet 是一个包含三维 CAD 模型的大型数据集ShapeNetCore 是其中的一个子集可从 ShapeNet 官网申请下载。ShapeNetCore 共有两个版本两者在类别数量与文件组织方式上存在差异以下信息以当前仓库源码中的文档字符串为准见 pytorch3d/datasets/shapenet/shapenet_core.py 中ShapeNetCore.__init__的说明v1包含 57 个类别每个模型存放为model.obj文件。注意 v1 中有两个类别——02858304boat船与02992529cellphone手机——分别是04530566watercraft水上交通工具与04401088telephone电话的下位词hyponym如需合并可按需自行处理。v2包含 55 个类别与 v1 相比缺少02858304boat与02834778bicycle自行车两个类别模型存放为models/model_normalized.obj文件。在源码中两个版本的模型文件路径通过self.model_dir区分model.obj if version 1 else models/model_normalized.obj。类别编号与标签的映射表分别存放在 pytorch3d/datasets/shapenet/shapenet_synset_dict_v1.json 与 pytorch3d/datasets/shapenet/shapenet_synset_dict_v2.json 中加载时根据version参数自动选择对应字典文件。ShapeNetCore 类与构造参数ShapeNetCore继承自torch.utils.data.Dataset构造时接收本地数据集路径并遍历目录加载其中所有模型。其构造函数签名与各参数含义如下详见 pytorch3d/datasets/shapenet/shapenet_core.py参数类型默认值说明data_dirstr必填ShapeNetCore 数据在本地的存放路径synsetsList[str]None要加载的类别列表可用 synset 编号如04330267或标签如guitar表示两者可混用不指定时加载data_dir下所有官方映射中的类别versionint1ShapeNetCore 版本仅允许1或2传入其他值会抛出ValueError(Version number must be either 1 or 2.)load_texturesboolTrue是否加载模型纹理为True时纹理以TexturesAtlas类型返回每个面一张纹理图texture_resolutionint4每个面创建的纹理图分辨率将生成(texture_resolution, texture_resolution, 3)的纹理图目录结构的约定为data_dir / synset_id / model_id / model.objv1即每个模型的model_id是其所在子目录的名称。构造时会校验传入的类别是否存在不存在则发出warnings.warn并建立synset_start_idxs各类别起始索引与synset_num_models各类别模型数量映射供后续按类别采样使用。一个典型用法from pytorch3d.datasets import ShapeNetCore # 加载整个 ShapeNetCore v1 数据集 shapenet_dataset ShapeNetCore(data_dir/path/to/ShapeNetCore.v1, version1) # 只加载部分类别混用编号与标签 shapenet_subset ShapeNetCore( data_dir/path/to/ShapeNetCore.v1, synsets[04330267, guitar, 02801938, birdhouse, 03991062, tower], version1, ) # 不加载纹理 shapenet_no_texture ShapeNetCore( data_dir/path/to/ShapeNetCore.v1, load_texturesFalse, version1 )getitem返回的数据结构通过索引访问数据集时ShapeNetCore.__getitem__返回一个字典见 pytorch3d/datasets/shapenet/shapenet_core.py包含以下键vertsFloatTensor形状(V, 3)网格顶点坐标facesLongTensor形状(F, 3)三角面片的顶点索引synset_idstr类别编号model_idstr模型编号labelstr类别标签由 synset 字典反查得到texturesload_texturesTrue时为TexturesAtlas纹理(F, texture_resolution, texture_resolution, 3)否则为None。底层的网格加载由基类ShapeNetBase._load_mesh完成见 pytorch3d/datasets/shapenet_base.py它调用pytorch3d.io.load_obj并传入create_texture_atlas、load_textures、texture_atlas_size三个参数若某个模型没有纹理会自动生成一张白色纹理图全 1 张量保证后续渲染不因缺纹理而失败。通过 collate_batched_meshes 构造批处理ShapeNetCore 加载的模型可以直接交给torch.utils.data.DataLoader使用但需要配合 PyTorch3D 定制的collate_fncollate_batched_meshes它位于 pytorch3d/datasets/utils.py并从 pytorch3d/datasets/init.py 导出。该函数的作用是将一批__getitem__返回的字典列表合并为一个字典其中每个键对应一个列表更重要的是当批数据同时包含verts与faces时会用它们构造一个批量的Meshes对象纹理若存在则以TexturesAtlas传入作为collated_dict[mesh]返回。Meshes是 PyTorch3D 的核心网格表示定义于 pytorch3d/structures/meshes.py支持顶点/面片补齐padding、按批次广播并可直接用于 PyTorch3D 的各种算子与渲染管线。from torch.utils.data import DataLoader from pytorch3d.datasets import ShapeNetCore, collate_batched_meshes shapenet_dataset ShapeNetCore(data_dir/path/to/ShapeNetCore.v1) shapenet_core_loader DataLoader( shapenet_dataset, batch_size12, collate_fncollate_batched_meshes ) batch next(iter(shapenet_core_loader)) # batch[mesh] 是一个 Meshes 对象可直接参与渲染或几何运算 print(batch[mesh].verts_padded().shape) # (12, V_max, 3) print(batch[mesh].faces_padded().shape) # (12, F_max, 3)在 tests/test_shapenet_core.py 的test_collate_models中可以找到对collate_batched_meshes形状、类型以及 DataLoader 输出批次结构的完整验证。内置 render 函数按需渲染模型ShapeNetCore通过基类ShapeNetBase.render见 pytorch3d/datasets/shapenet_base.py还提供了一个定制化的render方法可以用 PyTorch3D 的可微渲染器渲染指定模型支持四种选取方式按model_idsList[str]渲染这些模型编号对应的模型按categoriessample_nums从每个给定类别中随机采样sample_nums指定的模型数量进行渲染sample_nums可与类别一一对应也可只给一个整数自动广播按idxsList[int]渲染给定索引的模型会校验索引是否越界什么都不指定随机采样sample_nums中第一个数默认为 1个模型渲染。render的完整签名还包括shader_type着色器类型可选HardPhongShader默认、SoftPhongShader、HardGouraudShader、SoftGouraudShader、HardFlatShader、SoftSilhouetteShader等device张量所在设备str 或torch.device**kwargs接受渲染器支持的所有参数如cameras、raster_settings、lights等。渲染内部流程为先通过_handle_render_inputs将选取方式转换为模型索引列表见 pytorch3d/datasets/shapenet_base.py再调用__getitem__加载网格并用collate_batched_meshes拼装成批量Meshes若网格没有纹理则补一个全 1 的TexturesVertex默认相机为FoVPerspectiveCameras最后构建MeshRendererMeshRasterizer 指定shader_type的着色器输出形状为(N, H, W, 3)的图像批次。若传入多个相机网格会被extend广播使每个模型在多个视角下各渲染一次当相机数量与网格数量不匹配时会抛出ValueError(Mismatch between batch dims of cameras and meshes.)。类别采样底层使用torch.multinomial实现见_sample_idxs_from_category当采样数大于类别内模型数时会放回采样并发出警告。测试 tests/test_shapenet_core.py 中的test_render_shapenet_core展示了三种典型调用import torch from pytorch3d.datasets import ShapeNetCore from pytorch3d.renderer import FoVPerspectiveCameras, PointLights, RasterizationSettings, look_at_view_transform device torch.device(cuda:0) torch.manual_seed(39) piano_dataset ShapeNetCore(/path/to/ShapeNetCore.v1, synsets[piano]) R, T look_at_view_transform(1.0, 1.0, 90) cameras FoVPerspectiveCameras(RR, TT, devicedevice) raster_settings RasterizationSettings(image_size512) lights PointLights( locationtorch.tensor([0.0, 1.0, -2.0], devicedevice)[None], diffuse_color((0, 0, 0),), specular_color((0, 0, 0),), devicedevice, ) # 按索引渲染 pianos piano_dataset.render( idxslist(range(3)), devicedevice, camerascameras, raster_settingsraster_settings, lightslights, ) # shape (3, H, W, 3) # 按 model_ids 渲染 pianos_by_ids piano_dataset.render( model_ids[13394ca47c89f91525a3aaf903a41c90, 14755c2ee8e693aba508f621166382b0, 156c4207af6d2c8f1fdc97905708b8ea], devicedevice, camerascameras, raster_settingsraster_settings, lightslights, ) # 按类别随机采样渲染 mixed piano_dataset.render( categories[faucet, chair], sample_nums[2, 1], devicedevice, camerascameras, raster_settingsraster_settings, lightslights, )R2N2 数据加载器数据集背景R2N23D-R2N2源自斯坦福大学数据集包含 13 个类别是 ShapeNetCore v1 的子集。与 ShapeNetCore 相比R2N2 还额外提供每个物体的24 张不同视角渲染图由 Blender 渲染每个物体的体素化voxelized模型。绝大多数模型的 24 个视角都落在同一个 train/val/test 划分中但有 8 个模型的视角被拆分到了 train 与 test 两个划分里。R2N2 数据可从其官方页面下载官方同时提供划分文件splits file。R2N2 类与构造参数R2N2同样继承自torch.utils.data.Dataset其构造函数见 pytorch3d/datasets/r2n2/r2n2.py比ShapeNetCore需要更多路径参数参数类型默认值说明splitstr必填数据划分必须是train、val、test之一否则抛出ValueErrorshapenet_dirstr必填ShapeNetCore v1 数据路径r2n2_dirstr必填R2N2 数据集路径splits_filestr必填包含 train/val/test 划分的 JSON 文件路径return_all_viewsboolTrue是否加载划分内的所有视角设为False时每个模型随机选取一个视角return_voxelsboolFalse是否返回体素张量形状(D, D, D)views_rel_pathstrShapeNetRenderingR2N2 渲染图在r2n2_dir下的相对路径若该目录缺失渲染图会被跳过并发出警告voxels_rel_pathstrShapeNetVoxelsR2N2 体素数据在r2n2_dir下的相对路径若缺失体素会被跳过load_texturesboolTrue是否加载网格纹理texture_resolutionint4每面纹理图分辨率构造时会读取splits_file中对应split的划分字典逐类别、逐模型检查其在shapenet_dir中是否存在并记录每个模型可用的视角列表views_per_model_list。初始化完成后还会在终端以表格形式打印每个类别的实例数量汇总通过tabulate。典型用法from pytorch3d.datasets import R2N2 r2n2_dataset R2N2( splittrain, shapenet_dir/path/to/ShapeNetCore.v1, r2n2_dir/path/to/R2N2, splits_file/path/to/splits.json, return_voxelsTrue, )getitem返回的数据结构R2N2.__getitem__(model_idx, view_idxsNone)返回的字典在ShapeNetCore的基础上verts、faces、synset_id、model_id、label、textures额外包含见 pytorch3d/datasets/r2n2/r2n2.pyimagesFloatTensor形状(V, H, W, C)其中V为返回的视角数量为 R2N2 提供的原始渲染图像素值归一化到[0, 1]RFloatTensor形状(V, 3, 3)旋转矩阵TFloatTensor形状(V, 3)平移向量KFloatTensor形状(V, 4, 4)内参矩阵来自 Blender略作调整以适配 PyTorch3D 世界坐标系源码中写死为固定张量voxelsFloatTensor形状(V, D, D, D)体素张量仅当return_voxelsTrue且体素文件存在时返回。view_idxs参数允许按需只取部分视角索引必须是该模型在当前 split 中可用的视角编号范围通常在 0 到 23 之间若传入的索引无效则忽略并返回全部已加载视角同时发出警告。第二参数既可以整体传给__getitem__也可以作为元组(model_idx, view_idxs)传入。相机标定来源于每个模型rendering/rendering_metadata.txt中的azim, elev, yaw, dist_ratio, fov五个参数距离由dist_ratio * MAX_CAMERA_DISTANCEMAX_CAMERA_DISTANCE 1.75取自 R2N2 官方常量计算外参矩阵由compute_extrinsic_matrix见 pytorch3d/datasets/r2n2/utils.py根据方位角、仰角、距离构造再经_compute_camera_calibration转换到 PyTorch3D 世界坐标系得到R、T。体素读取链路为read_binvox_coords解析.binvox文件pytorch3d/datasets/r2n2/utils.py得到非零体素坐标align_bbox将体素包围盒对齐到网格顶点坐标系最后voxelize结合 Blender 内参与外参矩阵投影输出128 × 128 × 128VOXEL_SIZE 128的体素张量pytorch3d/datasets/r2n2/utils.py。tests/test_r2n2.py 的test_load_R2N2对上述各字段的形状进行了逐项断言例如默认返回 24 个视角、图像形状为(24, 137, 137, 3)、体素形状为(24, 128, 128, 128)。通过 collate_batched_R2N2 构造批处理与 ShapeNetCore 对应R2N2 的定制collate_fn是collate_batched_R2N2位于 pytorch3d/datasets/r2n2/utils.py。它在collate_batched_meshes基础上继续处理images若各模型视角数相同V堆叠为(N, V, H, W, 3)否则退化为列表R、T、K若视角数一致分别堆叠为(N, V, 3, 3)、(N, V, 3)、(N, V, 4, 4)voxels堆叠为(N, V, S, S, S)S为体素尺寸否则退化为列表。from torch.utils.data import DataLoader from pytorch3d.datasets import R2N2, collate_batched_R2N2 r2n2_loader DataLoader( r2n2_dataset, batch_size12, collate_fncollate_batched_R2N2 ) batch next(iter(r2n2_loader)) # batch[mesh] - Meshes # batch[images] - (12, V, H, W, 3) # batch[R] - (12, V, 3, 3) # batch[T] - (12, V, 3) # batch[K] - (12, V, 4, 4) # batch[voxels] - (12, V, 128, 128, 128)tests/test_r2n2.py 的test_collate_models验证了上述所有输出在 DataLoader 中的形状与类型。render 函数与 BlenderCameraR2N2.render见 pytorch3d/datasets/r2n2/r2n2.py继承并扩展了ShapeNetBase.render的能力。除model_ids、categories、sample_nums、idxs、shader_type、device、**kwargs外它新增了view_idxs参数当不显式传入cameras时默认使用BlenderCamera——一种专门为 R2N2 标定设计的相机类定义于 pytorch3d/datasets/r2n2/utils.py其投影变换直接由K内参矩阵构成——从而以与 R2N2 原始渲染完全一致的方向渲染指定视角。这在对比重建结果与真实渲染图时非常有用。import torch from pytorch3d.datasets import R2N2 from pytorch3d.renderer import PointLights, RasterizationSettings device torch.device(cuda:0) torch.manual_seed(39) r2n2_dataset R2N2(train, SHAPENET_PATH, R2N2_PATH, SPLITS_PATH) raster_settings RasterizationSettings(image_size512) lights PointLights( locationtorch.tensor([0.0, 1.0, -2.0], devicedevice)[None], diffuse_color((0, 0, 0),), specular_color((0, 0, 0),), devicedevice, ) # 使用 R2N2 自身标定以指定视角渲染 r2n2_batch r2n2_dataset.render( idxstorch.randint(1000, (2,)).tolist(), view_idxstorch.randint(24, (2,)).tolist(), devicedevice, raster_settingsraster_settings, lightslights, ) # shape (4, H, W, 3)2 个模型 × 2 个视角render_cubified_voxelspytorch3d/datasets/r2n2/utils.py是配套的另一个实用函数先用 PyTorch3D 的cubify算子阈值为CUBIFY_THRESH 0.2把体素张量转换为网格再以BlenderCamera渲染方便直接可视化体素重建结果tests/test_r2n2.py 的test_render_voxels有对应验证。数据加载的最佳实践与注意事项综合两份数据加载器的实现与测试tests/test_shapenet_core.py、tests/test_r2n2.py在使用时有以下几点值得注意路径完整性ShapeNetCore只要求本地存在网格文件即可加载R2N2则依赖shapenet_dir网格、r2n2_dir渲染图与体素与splits_file三者的对齐。若views_rel_path或voxels_rel_path对应目录缺失加载器不会报错而是自动跳过相应数据并发出警告因此训练前应检查r2n2_dataset.return_images、return_voxels标志。版本号校验ShapeNetCore(version3)会直接抛出ValueError版本只能是 1 或 2tests/test_shapenet_core.py 的test_load_shapenet_core中对此有断言。渲染参数校验render对无效model_id抛ValueError对越界idxs抛IndexError相机批量维度与网格批量维度不一致时抛ValueError测试test_catch_render_arg_errorsR2N2 版本见 tests/test_r2n2.py覆盖了这些分支。纹理处理load_texturesFalse时__getitem__返回的textures为Nonetests/test_shapenet_core.py 的test_load_textures_false验证了这一点而render内部会对无纹理网格自动补全白色纹理保证渲染路径始终可用。Meshes 批处理务必使用对应的collate_fncollate_batched_meshes/collate_batched_R2N2而非 PyTorch 默认的collate否则无法获得可直接用于 PyTorch3D 算子与渲染器的Meshes对象。小结PyTorch3D 的ShapeNetCore与R2N2数据加载器把下载数据集 → 解析 OBJ / 渲染图 / 体素 / 相机标定 → 构造Meshes批处理 → 可微渲染整条链路封装为标准的torch.utils.data.Dataset接口。ShapeNetBase提供公共的纹理加载、索引解析与渲染骨架两个子类分别针对纯网格数据ShapeNetCore与多视图 体素数据R2N2做了专门扩展其中BlenderCamera与视角级标定使得研究者可以精确复现 R2N2 原始渲染视角为单视图三维重建、视图合成、体素重建等任务提供了开箱即用的数据基础。更多文件读写能力可进一步阅读 docs/notes/io.md 与 docs/notes/meshes_io.md。赞分享人工智能深度学习计算机视觉图形学【免费下载链接】pytorch3dPyTorch3D is FAIRs library of reusable components for deep learning with 3D data项目地址https://gitcode.com/gh_mirrors/py/pytorch3d点击查看免费下载相关推荐PyTorch3D数据集全攻略ShapeNet与CO3D数据加载与预处理PyTorch3D数据集全攻略ShapeNet与CO3D数据加载与预处理 PyTorch3D是Facebook AI Research开发的3D深度学习库提人工智能深度学习计算机视觉图形学fastai数据模块深度解析DataBlock与数据加载器fastai数据模块深度解析DataBlock与数据加载器 本文深入探讨了fastai框架中DataBlock API的架构设计与实现原理。DataBlock人工智能深度学习LSUN数据集深度解析MindSpore加载与应用全指南LSUN数据集深度解析MindSpore加载与应用全指南 在计算机视觉领域大规模数据集的构建与高效利用一直是推动算法发展的核心动力。LSUNLarge s深度学习计算机视觉上一篇【免费下载】 Vue大屏插件Vue-Big-Screen-Plugin - 拓展你的Web可视化边界下一篇如何用VDesk提升多任务处理效率Windows虚拟桌面工作流优化方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
