File size: 6,389 Bytes
8e263cf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
# WaveGen 训练可视化工具
独立的训练结果可视化工具,自动检索 `core_space` 目录并通过 Viser 进行 3D 可视化。
## 🚀 快速开始
### 1. 基本使用
在 `nano_WaveGen` 目录下运行:
```bash
cd code/WaveGen/nano_WaveGen
python utils/visualize_training.py
```
### 2. 指定 core_space 目录
```bash
python utils/visualize_training.py --core-space ../WaveGen_Augustus_v1/core_space
```
### 3. 指定端口
```bash
python utils/visualize_training.py --port 8888
```
### 4. 禁用自动打开浏览器
```bash
python utils/visualize_training.py --no-browser
```
## 📋 功能特性
### ✅ 自动端口分配
- 默认尝试使用 8080 端口
- 如果端口被占用,自动尝试下一个端口 (8081, 8082, ...)
- 最多尝试 10 个端口
- 自动在浏览器中打开正确的URL
### ✅ 自动扫描训练输出
- 自动检测 `core_space/` 下的所有训练输出目录
- 格式: `YYYYMMDD_HHMMSS_stepN_text2wave`
- 统计每个输出的样本数量
### 🎨 3D 可视化
- **超二次曲面渲染**: 生成的预测结果(蓝色)和 Ground Truth(红色)
- **点云显示**: 从深度图重建的原始点云
- **相机可视化**: GT 相机位置和朝向
- **坐标系显示**: 世界坐标系参考
### 🎮 交互控制
- **训练输出选择**: 下拉菜单选择不同的训练输出
- **样本选择**: 滑块选择样本索引
- **帧控制**: 滑块切换帧,播放/暂停动画
- **颜色和透明度**: 实时调整渲染参数
- **网格分辨率**: 调整超二次曲面的网格质量
### ⚡ 性能优化
- **对象池机制**: 复用 mesh 对象,减少内存分配
- **惰性加载**: 按需加载帧数据
- **缓存策略**: 预加载相邻帧数据
## 🎛️ GUI 控制说明
### 训练输出面板
- **选择训练输出**: 选择要查看的训练输出
- **样本索引**: 选择样本(0 到 N-1)
- **加载样本**: 点击加载选中的样本
### 帧控制面板
- **当前帧**: 滑块切换帧(0-23)
- **▶ 播放**: 开始自动播放动画
- **⏸ 暂停**: 暂停动画播放
- **播放FPS**: 设置播放帧率(1-30)
### 生成结果面板
- **显示生成的超二次曲面**: 开关预测结果显示
- **生成结果透明度**: 调整蓝色 mesh 的透明度
- **生成结果颜色**: 自定义预测结果颜色(默认蓝色)
### Ground Truth 面板
- **显示GT超二次曲面**: 开关 GT 显示
- **GT透明度**: 调整红色 mesh 的透明度
- **GT颜色**: 自定义 GT 颜色(默认红色)
### 点云显示面板
- **显示点云**: 开关点云显示
- **点大小**: 调整点云渲染大小(0.001-0.02)
### 渲染设置面板
- **网格分辨率**: 调整超二次曲面的网格精度(10-50)
- **显示坐标系**: 开关世界坐标系显示
### 相机控制面板
- **重置视角**: 恢复默认观察视角
- **匹配GT相机**: 将视角设置为 GT 相机视角
## 📦 数据格式支持
### 支持的文件结构
```
core_space/
├── 20251204_212328_step5_text2wave/
│ ├── sample_0/
│ │ ├── predictions.npz # 模型预测结果
│ │ ├── targets.npz # Ground Truth
│ │ ├── info.txt # 样本信息
│ │ └── original_data/ # 原始数据
│ │ ├── Full_Sample_Data_for_Learning_Target.npz
│ │ ├── depth/
│ │ │ └── depth_merge.npz # 或 frame_*.npy
│ │ ├── rgb/
│ │ │ └── frame_*.png
│ │ ├── segmentation/
│ │ ├── metadata.json
│ │ └── camera_trajectory.npz
│ ├── sample_1/
│ └── ...
└── 20251128_124329_step5_text2wave/
└── ...
```
### predictions.npz 格式
```python
frames = [
{
'objects': [max_objects, 15], # 每个对象15个参数
'world': [8], # 世界参数
'physics': [max_objects, 3] # 物理属性(可选)
},
... # 24帧
]
# objects 参数 [15]:
# [0]: exists 存在标志 (0/1)
# [1:3]: shape ε1, ε2
# [3:6]: scale a, b, c
# [6:9]: translation x, y, z
# [9:12]: rotation rx, ry, rz (欧拉角)
# [12:15]: velocity vx, vy, vz
```
### targets.npz 格式
```python
objects = [num_frames, max_objects, 16] # 16参数(多了inlier_ratio)
world = [num_frames, 11] # 11参数(包含scene_center)
physics = [max_objects, 3] # 物理属性(可选)
```
## 🔧 依赖项
### Python 包
- `viser` - 3D 可视化服务器
- `numpy` - 数值计算
- `scipy` - 旋转矩阵计算
- `opencv-python` - 图像处理
- `pillow` - 图像加载
### 本地模块
- `depth_to_pointcloud.py` - 深度图转点云工具
### 安装依赖
```bash
pip install viser numpy scipy opencv-python pillow
```
## 🎯 使用场景
### 1. 检查训练质量
对比蓝色(预测)和红色(GT)mesh 的重合程度
### 2. 调试模型
实时查看每一帧的生成结果
### 3. 制作演示
通过播放功能展示训练效果
### 4. 数据分析
结合点云查看模型对原始数据的拟合质量
## 🐛 常见问题
### Q: 找不到训练输出?
A: 确保 `core_space` 目录存在且包含 `*_text2wave` 格式的文件夹。
### Q: 无法显示点云?
A: 检查 `original_data/depth/` 目录是否存在深度文件。
### Q: Mesh 显示不正确?
A: 尝试调整"网格分辨率"或检查 superquadric 参数是否正确。
### Q: 端口被占用?
A: 脚本会自动检测并使用下一个可用端口(8080→8081→8082...),无需手动干预。也可以用 `--port` 参数指定起始端口。
### Q: 浏览器没有自动打开?
A: 检查系统的默认浏览器设置。或者使用 `--no-browser` 参数禁用自动打开,然后手动访问终端显示的URL。
### Q: 页面一直显示空白?
A: 尝试刷新浏览器(Ctrl+Shift+R)或切换到 Chrome/Firefox 浏览器。
## 📝 开发说明
### 添加新功能
1. 在 `TrainingVisualizer` 类中添加方法
2. 在 `setup_gui()` 中添加 GUI 控件
3. 在对应的回调函数中实现逻辑
### 性能优化
- 使用对象池避免重复创建 mesh
- 预加载相邻帧数据
- 调整网格分辨率平衡质量和性能
## 📄 许可
与 WaveGen 项目保持一致
|