8.9 KiB
Executable File
8.9 KiB
Executable File
真值可视化工具集
📚 文档索引
本目录提供了完整的真值可视化工具和详细文档,帮助理解从数据加载到可视化的完整流程。
核心脚本
-
visualize_single_frame.py - 单帧可视化脚本 ⭐
- 读取单帧图像和标签
- 支持2D、3D、BEV可视化
- 支持ROI变换和深度归一化
- 推荐用于详细分析单个样本
-
visualize_batch.py - 批量可视化脚本
- 批量处理多帧图像
- 自动匹配图像和标签
- 支持限制处理数量
- 推荐用于快速浏览数据集
-
visualize_filtered_train.py - 条件过滤可视化脚本 🔥
- 从训练集/验证集筛选特定条件的样本
- 支持类别过滤(如:只看两轮车)
- 支持3D空间范围过滤(如:左右10米、纵向50米)
- 自动生成摘要文件
- 推荐用于数据分析和质量检查
-
test_visualization.py - 快速测试脚本
- 自动从验证集查找样本
- 测试不同配置的可视化效果
- 推荐用于首次使用或调试
文档说明
-
README.md - 总体说明 📖
- 真值读取到可视化的完整流程概述
- 标签格式说明(47维数组结构)
- ROI变换和深度归一化原理
- 不同类别的处理策略
- 使用方法和参数说明
-
FLOW_ANALYSIS.md - 详细流程分析 🔍
- 数据加载流程(标签、图像、标定)
- ROI变换的详细步骤
- 深度归一化的数学原理
- 2D/3D可视化的实现细节
- 坐标系统和变换关系
- 调试技巧和优化建议
-
EXAMPLES.md - 使用示例 💡
- 基础使用示例(原始图像)
- ROI模式示例(与训练一致)
- 批量处理示例
- 自动测试示例
- 常见场景和故障排查
- 参数速查表
-
FILTER_GUIDE.md - 条件过滤指南 🎯
- 条件过滤可视化的详细使用方法
- 类别过滤和空间范围过滤
- 多种使用场景(数据质量检查、类别分布分析等)
- 参数详解和坐标系说明
- 高级用法和性能优化
- 常见问题和实用技巧
🚀 快速开始
方式1: 最简单(自动测试)
# 自动查找样本并可视化
python scripts_for_gt/test_visualization.py --data data/mono3d.yaml --output ./test_viz
方式2: 单帧可视化(原始图像)
# 基础使用:不使用ROI,直接可视化原始图像
python scripts_for_gt/visualize_single_frame.py \
--image /path/to/image.jpg \
--label /path/to/label.txt \
--output ./viz_output
方式3: 单帧可视化(ROI模式,与训练一致)
# 使用ROI变换和深度归一化(与训练时一致)
python scripts_for_gt/visualize_single_frame.py \
--image /path/to/image.jpg \
--label /path/to/label.txt \
--output ./viz_output_roi \
--roi 704 352 \
--virtual-fx 500 \
--ori-img-size 1920 1080
方式4: 批量处理
# 批量可视化多帧
python scripts_for_gt/visualize_batch.py \
--image-dir /path/to/images \
--label-dir /path/to/labels \
--output ./batch_viz \
--roi 704 352 \
--virtual-fx 500 \
--max-samples 20
📊 输出结果
每个样本会生成4个可视化文件:
| 文件 | 内容 | 用途 |
|---|---|---|
*_2d_gt.jpg |
2D边界框 | 查看目标检测标注 |
*_3d_gt.jpg |
3D框投影 | 查看3D标注质量 |
*_bev_gt.jpg |
鸟瞰图 | 查看空间位置关系 |
*_combined.jpg |
组合视图 | 一眼看到所有信息 |
🔑 关键概念
标签格式(47维数组)
[0]: class # 类别ID
[1-4]: x, y, w, h # 2D边界框(归一化)
[5]: score # 置信度
[6-8]: x3d, y3d, z3d # 3D中心(相机坐标系)
[9-11]: length, height, width # 3D尺寸
[12]: rot_y # 偏航角
[13-14]: center_u, center_v # 3D中心投影(归一化)
[15]: alpha # 观测角
[16-23]: front_face # 前面信息
[24-31]: rear_face # 后面信息
[32-39]: left_face # 左面信息
[40-47]: right_face # 右面信息
ROI变换
- 计算ROI区域(以消失点为中心)
- 裁剪图像到ROI区域
- 调整2D边界框和UV坐标到ROI空间
- 根据
virtual_fx缩放深度值
深度归一化
# 训练时
z_normalized = z_original * (virtual_fx / fx_original)
# 可视化时(恢复)
z_original = z_normalized * depth_scale
# 其中 depth_scale = fx_original / virtual_fx
为什么只缩放Z?
- 投影公式:
u = fx * X/Z + cx - 同时缩放
fx和Z可以保持投影不变 X和Y从UV和Z恢复,无需单独缩放
不同类别的处理策略
| 类别 | 策略 | 原因 |
|---|---|---|
| 车辆(0, 13) | 基于最佳可见面 | 可能被部分遮挡 |
| 行人(1, 2, 3) | 基于完整3D框 | 尺寸小,完整框更准确 |
🔧 常见问题
Q1: 为什么需要ROI变换?
A: ROI变换有两个目的:
- 聚焦感兴趣区域: 去除天空等无关区域
- 统一焦距: 通过
virtual_fx统一不同相机的焦距,提高泛化能力
Q2: 什么时候使用ROI模式?
A:
- 查看原始数据: 不使用ROI(了解数据本身)
- 与训练一致: 使用ROI(验证训练数据处理)
- 调试模型: 使用ROI(与模型输入一致)
Q3: 标定文件必需吗?
A:
- 2D可视化: 不需要
- 3D可视化: 需要(用于3D到2D的投影)
Q4: 如何验证可视化是否正确?
A: 检查以下几点:
- 2D框是否对齐目标
- 3D框投影是否合理(不应该明显错位)
- BEV中的位置是否符合直觉(距离、朝向)
- 不同面的颜色是否正确(前红后绿)
📖 推荐阅读顺序
- 新手: README.md → EXAMPLES.md → 运行test_visualization.py
- 数据分析: FILTER_GUIDE.md → 运行visualize_filtered_train.py
- 开发: FLOW_ANALYSIS.md → 阅读脚本代码 → 自定义功能
- 调试: EXAMPLES.md故障排查 → FLOW_ANALYSIS.md调试技巧
🎯 常用命令速查
# 快速测试
python scripts_for_gt/test_visualization.py
# 原始图像可视化
python scripts_for_gt/visualize_single_frame.py --image img.jpg --label label.txt --output out
# ROI模式(与训练一致)
python scripts_for_gt/visualize_single_frame.py --image img.jpg --label label.txt \
--roi 704 352 --virtual-fx 500 --output out
# 批量处理(前10个样本)
python scripts_for_gt/visualize_batch.py --image-dir imgs/ --label-dir labels/ \
--output batch_out --max-samples 10
# 批量+ROI
python scripts_for_gt/visualize_batch.py --image-dir imgs/ --label-dir labels/ \
--roi 704 352 --virtual-fx 500 --output batch_out
# 条件过滤:可视化包含两轮车的样本(左右10米、纵向50米范围)
python scripts_for_gt/visualize_filtered_train.py --data data/mono3d.yaml \
--target-class bicycle --x-range -10 10 --z-range 0 50 --max-samples 20
# 条件过滤:可视化包含行人的样本
python scripts_for_gt/visualize_filtered_train.py --data data/mono3d.yaml \
--target-class pedestrian --max-samples 50
# 条件过滤:从验证集筛选
python scripts_for_gt/visualize_filtered_train.py --data data/mono3d.yaml \
--split val --target-class vehicle --z-range 10 30 --max-samples 20
📞 需要帮助?
- 查看 EXAMPLES.md 的故障排查章节
- 查看 FLOW_ANALYSIS.md 的调试技巧章节
- 检查标签文件格式是否正确
- 检查标定文件是否存在且格式正确
🔄 与模型代码的对应关系
| 功能 | 脚本位置 | 模型代码位置 |
|---|---|---|
| 标签加载 | load_label_file() |
utils/dataloaders3d.py:load_label() |
| ROI变换 | apply_roi_transform() |
utils/dataloaders3d.py:post_process_labels_to_roi() |
| 深度归一化 | scale_z3d() |
utils/dataloaders3d.py:_scale_z3d() |
| 3D解码(GT) | - | utils/plots.py:decode_and_reconstruct_3d_box_from_target() |
| 3D解码(预测) | - | utils/plots.py:decode_and_reconstruct_3d_box() |
| 2D可视化 | plot_2d_boxes() |
test_val_visualize.py:plot_2d_boxes_to_image() |
| 3D可视化 | - | utils/plots.py:plot_3d_boxes_from_decoded_targets() |
📝 版本历史
- v1.0 (2026-02-07): 初始版本
- 单帧可视化脚本
- 批量可视化脚本
- 自动测试脚本
- 完整文档(README, FLOW_ANALYSIS, EXAMPLES)
🎓 相关资源
- 主项目文档: CLAUDE.md
- 数据集配置: data/mono3d.yaml
- 3D可视化指南: 3D_VISUALIZATION_GUIDE.md
- 验证脚本: test_val_visualize.py