Files
Hunyuan3D_2.1_Low_VRAM/hy3dshape/tools/README-ch.md
Huiwenshi c88bee648e init
2025-06-13 23:53:14 +08:00

94 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据处理
这是用于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
```