零基础实战:从ObjectDatasetTools到Linemod_preprocessed的完整数据处理指南
当你用ObjectDatasetTools完成数据采集后,面对一堆原始数据文件却不知如何下手?作为刚接触6D位姿估计的开发者,我完全理解这种迷茫。本文将带你一步步完成从原始数据到Linemod_preprocessed标准格式的完整转换,每个脚本的作用、常见报错和解决方案都会详细说明。
1. 预处理环境准备与文件结构解析
在开始处理前,先确保你的文件目录结构符合要求。ObjectDatasetTools生成的原始数据通常包含以下关键文件夹:
原始数据目录/ ├── transforms/ # 位姿变换矩阵 ├── mask/ # 物体掩码图像 ├── depth/ # 深度图 ├── JPEGImages/ # RGB彩色图像 └── registeredScene.ply # 3D模型文件常见问题排查清单:
- 检查每个子文件夹是否都有对应文件
- 确认transforms文件夹中的.npy文件数量与图像数量匹配
- 确保registeredScene.ply文件存在且完整
提示:建议在处理前备份原始数据,所有操作都在副本上进行
2. 关键脚本解析与执行顺序
2.1 gt_info.py - 生成位姿标注文件
这个脚本的核心功能是将transforms中的位姿数据转换为标准的gt.yml标注文件。以下是关键代码段的解释:
# 读取位姿变换矩阵 data_load = np.load("transforms" + "/" + str(k) + ".npy") cam_r = [] for i in range(3): for j in range(3): cam_r.append(data_load[i][j]) # 提取旋转矩阵 # 计算物体边界框 im = matplotlib.image.imread('mask/' + str(k) +'.png') r, c = [], [] for i in range(480): for j in range(1, 640): if im[i][j - 1] == 0 and im[i][j] == 1: r.append(i) c.append(j) break常见错误及解决:
FileNotFoundError:检查文件路径是否正确,特别是mask/和transforms/的子目录- 数值异常:确认.npy文件没有损坏,可以用
np.load单独测试读取
2.2 rename.py - 统一文件命名规范
这个脚本主要完成三项工作:
- 将JPEGImages/中的.jpg图像转换为png格式
- 统一文件名格式为4位数字(如0001.png)
- 重组文件目录结构
执行后目录结构变为:
. ├── depth/ # 深度图 ├── mask/ # 掩码图 └── rgb/ # RGB图像(已转换格式)格式转换的注意事项:
- OpenCV的imwrite会默认压缩PNG,如需无损保存可添加参数:
cv2.imwrite("./rgb/" + file[:-3] + "png", img, [cv2.IMWRITE_PNG_COMPRESSION, 0])2.3 info.py - 生成相机内参文件
这个脚本需要你根据实际相机参数修改以下关键值:
list = [fx, 0., cx, 0., fy, cy, 0., 0., 1.] # 替换为你的相机内参参数获取方法:
- 查看ObjectDatasetTools采集时生成的intrinsics.json
- 或使用相机标定工具重新标定
- 典型参数示例(需替换):
- fx/fy:焦距(像素单位)
- cx/cy:主点坐标
3. 模型信息计算与最终格式转换
3.1 calc_model_info.py - 计算3D模型元数据
这个脚本计算物体的包围盒尺寸和直径等重要信息,输出到models_info.yml。核心算法解析:
def calc_pts_diameter(pts): """计算点云最大直径(两点间最大距离)""" diameter = -1.0 for pt_id in range(pts.shape[0]): pt_dup = np.tile(np.array([pts[pt_id, :]]), [pts.shape[0] - pt_id, 1]) pts_diff = pt_dup - pts[pt_id:, :] max_dist = math.sqrt((pts_diff * pts_diff).sum(axis=1).max()) if max_dist > diameter: diameter = max_dist return diameter常见问题:
- 模型尺寸异常:检查registeredScene.ply是否包含正确的几何数据
- 计算时间过长:大型模型可以先简化再处理
3.2 re-format.py - 生成标准目录结构
这个脚本创建Linemod_preprocessed要求的目录结构,关键操作包括:
os.mkdir("./data/01") # 创建对象ID为01的数据目录 shutil.move("./rgb", "./data/01/") # 移动RGB图像 os.rename("./registeredScene.ply", "./obj_01.ply") # 重命名模型文件必须修改的部分:
# 第21行需要改为你的实际ply文件名 os.rename("./registeredScene.ply", "./obj_01.ply")3.3 train_test_txt.py - 划分训练测试集
默认按4:1比例划分数据集,可通过修改以下代码调整比例:
for i in range(files): if i % 5 == 4: # 每5个样本取1个作为测试集 _test.write(num + "\n") else: _train.write(num + "\n")高级技巧:
- 对于小数据集,建议使用交叉验证
- 可添加随机打乱逻辑避免顺序偏差
4. 最终成果验证与调试技巧
完成所有步骤后,检查生成的Linemod_preprocessed目录结构是否符合标准:
Linemod_preprocessed/ ├── data/ │ └── 01/ │ ├── depth/ │ ├── mask/ │ ├── rgb/ │ ├── gt.yml │ ├── info.yml │ ├── test.txt │ └── train.txt ├── models/ │ ├── obj_01.ply │ └── models_info.yml └── segnet_results/ └── 01_label/验证 checklist:
- [ ] 所有图像文件数量一致
- [ ] gt.yml中的位姿数据与图像对应
- [ ] models_info.yml中的尺寸数据合理
- [ ] 训练/测试集划分比例符合预期
遇到问题时,建议按这个顺序排查:
- 检查每个脚本是否按正确顺序执行
- 验证中间文件(如gt.yml)的内容格式
- 确认所有文件路径是否正确
- 检查Python环境依赖是否齐全
在完成第一次成功转换后,建议将这套脚本保存为模板,后续项目只需替换原始数据即可快速生成新数据集。对于需要处理多个物体的场景,可以扩展脚本支持多对象ID的批量处理。