Spaces:
Running
on
Zero
Running
on
Zero
# 数据处理 | |
这是用于3D形状和纹理生成的数据处理流程。 | |
**注意事项**: | |
1. 该实现是我们工业流程的简化版本。 | |
2. 渲染脚本基于[TRELLIS](https://github.com/microsoft/TRELLIS/blob/main/dataset_toolkits/blender_script/render.py)。 | |
## 渲染 | |
### 动机 | |
渲染脚本`render/render.py`主要有三个目的: | |
1. 使用Blender将复杂的3D格式转换为PLY文件,以便进行进一步处理。 | |
2. 为DiT训练渲染条件图像。 | |
3. 渲染正交图像、PBR材质以及用于纹理生成的条件信号(世界空间法线和位置)。 | |
### 需求 | |
渲染脚本使用Blender 4.1执行。你需要使用Blender的Python安装`opencv`、`OpenEXR`和`Imath`。以下是Macbook上的示例: | |
```bash | |
/Applications/Blender.app/Contents/Resources/4.1/python/bin/python3.11 -m pip install OpenEXR Imath opencv-python | |
``` | |
### 执行 | |
前两个目的可以通过以下单一命令执行: | |
```bash | |
$BLENDER_PATH -b -P render/render.py -- \ | |
--object ${INPUT_FILE} --geo_mode --resolution 512 \ | |
--output_folder $OUTPUT_FOLDER | |
``` | |
对于第三个目的,只需移除`--geo_mode`标志。 | |
## 水密网格处理和采样 | |
### 动机 | |
为了学习3DShape2VecSets的SDF表示,我们需要一个水密输入网格。该流程处理原始三角网格,生成三种必要的数据类型: | |
1. **表面采样** - 编码器的输入点。 | |
2. **体积采样** - 解码器中SDF评估的查询点。 | |
3. **体积SDFs** - VAE训练的地面真实有符号距离值。 | |
### 执行 | |
处理三角网格(OBJ/OFF格式),生成以下内容: | |
1. 水密网格(`${OUTPUT_NAME}_watertight.obj`)。 | |
2. 表面点采样(`${OUTPUT_NAME}_surface.npz`)。 | |
3. 带有SDF的体积采样(`${OUTPUT_NAME}_sdf.npz`)。 | |
**命令:** | |
```bash | |
python3 watertight/watertight_and_sample.py \ | |
--input_obj ${INPUT_MESH} \ | |
--output_prefix ${OUTPUT_NAME} | |
``` | |
### 输出数据格式 | |
#### 1. 表面采样(`${OUTPUT_NAME}_surface.npz`) | |
包含两个点云数组,以numpy NPZ格式存储: | |
| 键 | 形状 | 格式 | 描述 | | |
|-----------------|----------|----------|---------------------------------| | |
| `random_surface` | `(N, 6)` | `float16`| 表面上的均匀点采样 | | |
| `sharp_surface` | `(M, 6)` | `float16`| 靠近网格锐边的采样 | | |
#### 2. 体积SDF采样(`${OUTPUT_NAME}_sdf.npz`) | |
包含三种采样类型,以数组对的形式存储。对于每种类型`${type}`: | |
| 采样类型 | 点数组 | SDF标签数组 | 形状 | 格式 | 描述 | | |
|-----------------|----------------------|----------------------|----------|----------|-------------------------| | |
| `vol` | `vol_points` | `vol_label` | `(P, 3)/(P,)` | `float16`| 随机空间采样 | | |
| `random_near` | `random_near_points` | `random_near_label` | `(Q, 3)/(Q,)` | `float16`| 靠近表面的采样 | | |
| `sharp_near` | `sharp_near_points` | `sharp_near_label` | `(R, 3)/(R,)` | `float16`| 靠近锐边的采样 | | |
**数据规格**: | |
- 所有点坐标(`*_points`数组)包含以`float16`值存储的3D位置。 | |
- 所有SDF值(`*_label`数组)是表示以下内容的`float16`标量: | |
- **正值**:在表面外。 | |
- **负值**:在表面内。 | |
- **零值**:在表面上。 | |
- 数组维度: | |
- `N`、`M`、`P`、`Q`、`R`表示采样数量(因形状而异)。 | |
- `3`表示XYZ坐标。 | |
- `6`表示XYZ/法线坐标。 | |
- 所有数组均以未压缩形式存储在numpy的NPZ格式中。 | |
## 整体脚本 | |
修改pipeline.sh里面这4个变量, | |
1. **INPUT_FILE** 每个3D数据的路径。 | |
2. **OUTPUT_FOLDER** 输出数据集的总路径。 | |
3. **NAME** 每个数据的输出路径命名。 | |
4. **BLENDER_PATH** Blender可执行路径。 | |
然后运行以下脚本: | |
```bash | |
bash pipeline.sh | |
``` |