Monodepth2复现实战:从KITTI数据集预处理到模型评估的保姆级流程解析

张开发
2026/4/19 19:12:19 15 分钟阅读

分享文章

Monodepth2复现实战:从KITTI数据集预处理到模型评估的保姆级流程解析
Monodepth2复现实战从KITTI数据集预处理到模型评估的保姆级流程解析深度估计是计算机视觉领域的重要研究方向而Monodepth2作为自监督单目深度估计的经典算法在学术界和工业界都有广泛应用。本文将带您完整走通从KITTI数据集准备到模型评估的全流程特别针对实践中容易卡壳的环节提供详细解决方案。1. KITTI数据集准备与预处理KITTI数据集是自动驾驶领域最常用的基准数据集之一包含丰富的街景图像和对应的深度信息。但在使用前需要特别注意其特殊的数据组织形式。1.1 数据集下载与目录结构KITTI原始数据通常以日期和序列号组织例如kitti_data/ ├── 2011_09_26/ │ ├── 2011_09_26_drive_0001_sync/ │ │ ├── image_02/ # 左摄像头 │ │ │ └── data/ # 图像存储目录 │ │ └── image_03/ # 右摄像头 │ │ └── data/ └── 2011_09_28/ └── ...提示建议使用官方提供的raw_data_downloader.sh脚本下载确保目录结构正确1.2 图像格式转换实战KITTI原始数据为PNG格式而Monodepth2默认使用JPG格式。以下是批量转换的Python脚本from PIL import Image import os def convert_png_to_jpg(root_dir): for root, _, files in os.walk(root_dir): for file in files: if file.endswith(.png): png_path os.path.join(root, file) jpg_path png_path.replace(.png, .jpg) img Image.open(png_path) img.save(jpg_path, JPEG, quality95) os.remove(png_path) # 可选删除原始PNG文件 convert_png_to_jpg(/path/to/kitti_data)或者直接在训练时添加--png参数python train.py --model_name mono_model --png2. 模型训练配置详解2.1 关键训练参数解析Monodepth2提供了多种训练模式主要参数对比如下参数名可选值默认值说明--model_name自定义无模型保存名称--spliteigen/eigen_zhoueigen数据划分方式--num_layers18/34/50/101/15218ResNet骨干网络层数--datasetkitti/cityscapeskitti数据集类型--png-False是否使用PNG格式图像--height192/320/640192输入图像高度--width640/1024640输入图像宽度--batch_size根据显存调整12批处理大小2.2 训练启动命令示例python train.py \ --model_name monostereo_640x192 \ --split eigen_zhou \ --dataset kitti \ --height 192 \ --width 640 \ --batch_size 8 \ --num_epochs 20 \ --learning_rate 1e-4注意RTX 30系列显卡用户需使用CUDA 11和对应版本的PyTorch3. 单图像预测与结果可视化3.1 test_simple.py深度解析test_simple.py脚本的核心参数--image_path: 输入图像路径--model_name: 使用的模型名称--ext: 输出文件扩展名默认.jpg--no_cuda: 禁用CUDA加速典型执行流程python test_simple.py \ --image_path assets/test_image.jpg \ --model_name monostereo_640x192输出结果包括test_image_disp.jpeg: 可视化深度图test_image_disp.npy: 原始深度数据3.2 深度图后处理技巧原始预测结果可能需要后处理才能获得最佳可视化效果import numpy as np import matplotlib.pyplot as plt disp np.load(test_image_disp.npy) disp_normalized (disp - disp.min()) / (disp.max() - disp.min()) plt.imsave(processed_disp.png, disp_normalized, cmapplasma)4. 模型评估与指标解读4.1 KITTI评估流程评估脚本关键参数python evaluate_depth.py \ --load_weights_folder ./models/monostereo_640x192 \ --eval_mono \ --data_path /path/to/kitti_data \ --split eigen4.2 深度评估指标详解评估结果包含7个关键指标指标公式理想值说明Abs Rel$\frac{1}{D}\sum_{d\in D}\frac{Sq Rel$\frac{1}{D}\sum_{d\in D}\frac{RMSE$\sqrt{\frac{1}{D}\sum_{d\in D}RMSE log$\sqrt{\frac{1}{D}\sum_{d\in D}δ1.25$% of d s.t. \max(\frac{d}{d^},\frac{d^}{d})1.25$接近1准确率阈值δ1.25²同上阈值1.25²接近1更宽松的准确率δ1.25³同上阈值1.25³接近1最宽松的准确率4.3 常见评估问题解决问题1numpy加载报错# 修改前 gt_depths np.load(gt_path, fix_importsTrue, encodinglatin1)[data] # 修改后 gt_depths np.load(gt_path, fix_importsTrue, encodinglatin1, allow_pickleTrue)[data]问题2数据集路径错误在evaluate_depth.py中添加路径检查逻辑if not os.path.exists(gt_path): if gt_path.endswith(.jpg): gt_path gt_path.replace(.jpg, .png) elif gt_path.endswith(.png): gt_path gt_path.replace(.png, .jpg)5. 实战经验与性能优化在实际项目中我们发现以下几个配置能显著提升训练效率混合精度训练减少显存占用加快训练速度from torch.cuda.amp import GradScaler, autocast scaler GradScaler() with autocast(): outputs model(inputs) loss criterion(outputs) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()数据加载优化使用num_workers4和pin_memoryTrueloader DataLoader(dataset, batch_size8, num_workers4, pin_memoryTrue)显存不足解决方案减小batch_size建议不低于4降低输入分辨率如192x640→160x512使用梯度累积在RTX 3060显卡上的实测性能配置显存占用每epoch时间最终Abs Rel192x640, bs89.2GB25min0.115160x512, bs128.7GB18min0.118192x640, bs4梯度累积6.1GB28min0.117

更多文章