# 数据处理 这是用于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 ```