ManyDepth数据集加载机制解析MonoDataset与KITTI/Cityscapes数据类源码解读【免费下载链接】manydepth[CVPR 2021] Self-supervised depth estimation from short sequences项目地址: https://gitcode.com/gh_mirrors/ma/manydepthManyDepthCVPR 2021 论文项目是经典的自监督多帧单目深度估计框架而支撑它高效训练与评估的关键正是底层数据集加载机制。本文将围绕MonoDataset基类与 KITTI、Cityscapes 各数据类的源码为你一步步拆解 ManyDepth 是如何读取图像序列、处理相机内参、构建多尺度金字塔并完成数据增强的帮助新手快速理解整个数据流水线。ManyDepth数据集加载机制总览一条清晰的分层设计打开项目的manydepth/datasets/目录你会发现所有数据类都遵循基类 子类的清晰设计MonoDataset所有数据集的抽象基类定义了数据加载的通用流程KITTIRAWDataset/KITTIOdomDataset/KITTIDepthDataset分别对应 KITTI 原始数据、里程计数据与深度真值数据CityscapesPreprocessedDataset/CityscapesEvalDataset对应 Cityscapes 预处理三元组与评估用原始图像。这种分层的好处是子类只需实现如何定位图像文件和如何加载深度真值这两个方法其余的读取、缩放、增强、张量化等通用逻辑全部由基类统一完成见 mono_dataset.py 与 kitti_dataset.py。MonoDataset 基类源码解读一次__getitem__调用的完整旅程MonoDataset继承自 PyTorch 的data.Dataset核心是__getitem__方法。每次取一个训练样本它都会经历下面这些步骤见 mono_dataset.py1. 决定是否做增强与翻转训练时以 50% 的概率随机启用颜色增强ColorJitter和水平翻转评估时则全部关闭保证结果可复现do_color_aug self.is_train and random.random() 0.5 do_flip self.is_train and random.random() 0.52. 加载连续帧序列ManyDepth 是短序列深度估计默认加载当前帧0、前一帧-1和后一帧1三张图可通过--frame_ids调整。代码通过get_color(folder, frame_index i, side, do_flip)逐帧读取如果某帧文件缺失会用 100×100 的黑色占位图填充并记录poses[i] None避免序列中断导致训练崩溃。3. 构建多尺度图像金字塔自监督深度估计通常会在多个尺度上计算损失因此基类按2^i的比例依次生成 1/2、1/4、1/8 分辨率的图像见 mono_dataset.py并在preprocess中完成全部尺度的缩放与张量转换。4. 相机内参与逆内参矩阵每个尺度都要配套对应的内参矩阵K和逆内参inv_K。基类会把归一化内参按当前分辨率等比例缩放K[0, :] * self.width // (2 ** scale) K[1, :] * self.height // (2 ** scale)最终每个样本返回一个字典键为(color, frame_id, scale)、(color_aug, frame_id, scale)、(K, scale)、(inv_K, scale)训练损失和位姿网络都依赖这份结构化的输出。KITTI数据类源码解读三个子类的差异化实现KITTI 是自动驾驶领域最常用的深度估计数据集ManyDepth 为其实现了三个子类见 kitti_dataset.pyKITTIRAWDataset训练主力读取 KITTI 原始数据图像路径形如场景/image_02/data/0000000000.jpg。它的亮点是深度真值加载通过kitti_utils.generate_depth_map把 Velodyne 激光雷达点云投影到相机平面生成稀疏深度图再缩放到 1242×375 的原始分辨率。KITTIOdomDataset里程计专用用于 KITTI Odometry 分割如splits/odom/图像存放在sequences/00/image_2/目录下帧号用 6 位数字格式化路径逻辑与 Raw 数据略有不同。KITTIDepthDataset使用官方深度图使用 KITTI 官方提供的稠密深度真值proj_depth/groundtruth/下的 PNG 文件读取后除以 256 还原为米制深度值无需再依赖激光雷达投影。三者共享父类KITTIDataset中的归一化内参矩阵源码中硬编码了K [[0.58, 0, 0.5, 0], [0, 1.92, 0.5, 0], ...]以及左右目映射表side_map {2: 2, 3: 3, l: 2, r: 3}这保证了无论训练还是评估内参口径始终一致。Cityscapes数据类源码解读两种形态的加载方式Cityscapes 是城市街景数据集ManyDepth 为其实现了两个数据类CityscapesPreprocessedDatasetcityscapes_preprocessed_dataset.py读取三帧拼接成一张宽图的预处理文件代码用color.shape[1] // 3把宽图切成左、中、右三张分别作为-1、0、1帧并裁掉底部 25% 的车身区域。CityscapesEvalDatasetcityscapes_evaldataset.py评估时直接加载原始 2048×1024 图像在get_color内完成裁剪并会额外读取当前帧往前偏移 2 帧的序列图作为参考帧。Cityscapes 的内参不像 KITTI 那样硬编码而是从 JSON 相机文件中读取fx/fy/u0/v0再归一化体现了不同数据集、不同内参来源的灵活设计。数据类如何接入训练与评估流程在 trainer.py 中训练器用一个字典把命令行参数--dataset映射到具体数据类再读取splits/split/*_files.txt中的文件名列表构造DataLoader并设置多进程加载默认--num_workers 12datasets_dict {kitti: datasets.KITTIRAWDataset, cityscapes_preprocessed: datasets.CityscapesPreprocessedDataset, kitti_odom: datasets.KITTIOdomDataset}评估流程则更简单直接evaluate_depth.py会根据--eval_split选择CityscapesEvalDataset或KITTIRAWDataset并复用训练好的内参与尺寸配置见 evaluate_depth.py。常用的关键参数包括--data_path、--height 192、--width 640、--frame_ids 0 -1 1以及--png切换到 PNG 原图格式。总结理解数据加载机制的三个要点基类统一、子类差异MonoDataset管流程子类只管文件在哪、真值怎么读新增数据集只需继承基类并实现get_color等方法序列与尺度并重数据类同时负责加载相邻帧序列和生成多尺度金字塔这是自监督深度估计训练的基础内参是关键内参矩阵在每个尺度上按分辨率缩放并归一化贯穿训练、代价体积构建与评估全流程。掌握了这套 ManyDepth 数据集加载机制无论是更换自有数据集还是调参训练你都能从源码层面快速定位问题轻松上手这个经典的自监督深度估计项目。【免费下载链接】manydepth[CVPR 2021] Self-supervised depth estimation from short sequences项目地址: https://gitcode.com/gh_mirrors/ma/manydepth创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考