Shapenet数据集FileNotFoundError排查及相对路径配置方案
问题分析与解决方案
核心问题
你的代码在构造数据集文件路径时,没有正确结合配置文件中的data_dir与拆分文件(split_cars.npz)中的路径信息,导致程序尝试访问错误的文件路径。错误信息显示的datasets/shapenet/data/02958343/...是拆分文件中存储的相对路径,但实际数据集位于/work/ws-tmp/data sets/shapenet/data/02958343/...,两者没有被正确拼接。
分步解决方案
1. 修正配置文件中的数据集路径
首先确保配置文件的data_dir指向你的实际数据集根目录,注意处理目录名中的空格:
exp_name = shapenet_cars # 替换为你的实际数据集绝对路径,注意转义空格 data_dir = /work/ws-tmp/data\ sets/shapenet/data/02958343/ split_file = /work/ws-tmp/g051382-PCL_task/ndf/datasets/shapenet/data/split_cars.npz input_data_glob = /model_obj_files/*/models/model_normalized.obj sample_std_dev = [0.08, 0.02, 0.003] sample_ratio = [0.01, 0.49, 0.5]
2. 修复代码中的路径拼接逻辑
修改VoxelizedDataset类的__getitem__方法,正确将data_dir与拆分文件中的路径片段结合:
def __getitem__(self, idx): try: path = self.data[idx] # 提取拆分文件路径中的对象ID(最后一级目录) object_id = os.path.basename(path) # 用data_dir拼接出正确的对象目录路径 input_path = os.path.join(self.path, object_id) samples_path = input_path voxel_path = os.path.join(input_path, f'voxelized_point_cloud_{self.res}res_{self.pointcloud_samples}points.npz') occupancies = np.unpackbits(np.load(voxel_path)['compressed_occupancies']) input = np.reshape(occupancies, (self.res,)*3) # 后续代码保持不变...
3. 验证拆分文件内容(可选)
如果不确定拆分文件中存储的路径格式,运行以下命令查看第一条数据:
python -c "import numpy as np; split = np.load('/work/ws-tmp/g051382-PCL_task/ndf/datasets/shapenet/data/split_cars.npz'); print(split['train'][0])"
- 如果输出是类似
bd07cdd4397c88184ecc271292c8317的纯对象ID,直接用os.path.join(self.path, path)拼接即可,无需提取object_id。 - 如果输出是完整相对路径(如
datasets/shapenet/data/02958343/bd07cdd4397c88184ecc271292c8317),则用上述提取object_id的方式处理。
4. 测试路径正确性(可选)
在__getitem__中添加打印语句,确认构造的路径是否正确:
voxel_path = os.path.join(input_path, f'voxelized_point_cloud_{self.res}res_{self.pointcloud_samples}points.npz') print('当前尝试访问的路径:', voxel_path)
运行代码后,检查打印的路径是否与你实际的数据集文件路径一致。
内容的提问来源于stack exchange,提问作者Sai tarak
相关产品推荐
相关产品推荐

