Hugging Face 发布 3D 生成模型 TRELLIS.2 的 LoRA 微调完整指南
The Definitive Fine-Tuning Guide for 3D Generation Models
Hugging Face 发布了开源 3D 生成模型 TRELLIS.2 的 LoRA 微调完整指南,并开源了配套的预处理及训练脚本与 Docker 镜像,支持在本地或 Hugging Face Jobs 运行。
教程通过拆解三维生成管道展示了仅针对几何 DiT 注入 LoRA 的微调路径,为特定品类网格精度优化提供了标准流程与现成容器。
核心速览:本文提供了用于微调热门 3D 模型 TRELLIS.2 的脚本和容器镜像,方便你使用专属 3D 资产进行微调,且支持在本地和 Hugging Face Jobs 上运行。如果你想直接上手微调,只需配置少量参数即可使用我们的脚本(前提是已将数据集上传至 Hugging Face Hub),也可以借助此代码仓库自行探索修改。若想深入了解,我们还会逐步解析脚本的实现原理。让我们开始吧!
引言
3D 生成技术在机器人、仿真模拟、传媒以及娱乐等领域有着广泛应用。然而在这些场景中,要让生成的物体遵循严格规则,并实现模型与数据表征的标准化,往往困难重重。目前业界存在着诸多文件格式,例如 GLB 和 PLY;同时也有多种表征形式,比如神经辐射场(NeRF)与 3D 高斯泼溅(3DGS),它们各有优劣。
TRELLIS 引入了一种名为“统一潜变量表征”(unified latent representation)的通用内部表征方式。它的解码器能够将这种表征转化为所需输出格式的 3D 模型,因此无需针对每种表征格式分别使用不同的模型。
随后,该团队又推出了 TRELLIS.2,进一步改进了对 3D 结构的表征能力。不过,这两个模型都没有提供一种简便的方法来针对特定任务进行微调适配。
我们的优化目标
像 TRELLIS.2 这样的通用模型,在面对特定应用场景时,常会在关键细节上出错。例如,用户在制作家具模型时可能需要精确的几何结构,如果不对该任务进行针对性微调,预训练模型生成的几何结构精度可能就不尽如人意。在本次实验中,我们选取了 GSO 数据集中包含 188 个鞋类物体的子集。初步测试显示,预训练模型生成的鞋子整体看起来没问题,但鞋底结构往往有偏差。我们希望验证 LoRA 能否让鞋底的几何细节更加精确。
我们的目标是利用 Google Scanned Objects (GSO) 数据集,提升 TRELLIS.2 在特定物体类别上的表现。我们将介绍在训练过程中应该微调流水线的哪些组件,哪些又该保持冻结。该流水线将结构、几何细节和材质解耦开来,因此我们只需针对当前任务微调关键组件即可。
决定冻结什么,与决定微调什么同样重要。
所需工具与资源
LoRA
LoRA 是低秩适应(Low-Rank Adaptation)的简称,其核心思路是在冻结原始模型权重的同时,仅训练小型的适配器矩阵。这大幅减少了可训练参数量,以及存储梯度和优化器状态所需的显存开销。我们借助 Hugging Face 的 PEFT 库来添加和训练这些适配器。欲了解更多信息,请参阅我们的 LoRA 指南。
Hugging Face Jobs
Hugging Face Jobs 可以在云端硬件上运行容器化任务。我们在数据预处理和模型训练中都使用了它。如果你想改用本地 GPU,请参考后文的本地 Docker 命令。在开始之前,请确保具备以下条件:
- 一个 HF_TOKEN(可在此处获取)
- 你的 Hugging Face 账号必须拥有 DINOv3 的访问权限,因为 DINOv3 属于受限访问模型
- 如果你使用的是自定义数据集,请在开始前将其网格文件(mesh)上传至 Hub。
TRELLIS.2 工作原理
在开始训练之前,我们先来看看 TRELLIS.2 是如何生成 3D 物体的,以及我们在哪些环节添加 LoRA 适配器。
TRELLIS.2 主要包含五个阶段:去除图像背景、编码图像、预测粗粒度结构、生成精细几何体,以及生成材质。随后,整套流程会将结果导出为带纹理的网格。
编码输入图像
首先,BiRefNet 会移除输入图像的背景。接着,DINOv3-L 将图像编码为特征 Token,供后续的生成模型用来指导 3D 物体的构建。
稀疏结构生成(Sparse Structure Flow)
稀疏结构流 DiT 负责预测物体的粗略形状。该模块采用扩散 Transformer(DiT),先生成一个 16³ × 8 的小型潜变量,再由变分自编码器(VAE)解码器将其转换为 64 × 64 × 64 的占据网格。网格中的每个体素表示该空间位置是否属于物体(体素即三维空间中的像素)。由于它的输出直接指导后续的几何体生成阶段,因此我们对该模型添加了 LoRA 适配器。
O-Voxel 与结构化潜变量
O-Voxel 是 TRELLIS.2 采用的 3D 格式。它是一种稀疏体素网格,仅保留物体表面的体素,每个体素中存储网格顶点等局部几何信息及材质属性。得益于该格式占用空间小,CPU 可以在几秒内将网格转换为 O-Voxel,GPU 也能在数秒内把 O-Voxel 还原为网格。
结构化稀疏潜变量沿袭自 TRELLIS。它们将 3D 数据存储在稀疏张量中,从而加快了计算速度。由于模型仅使用网格中大约 10% 的体素,无需在空体素上耗费算力,因此形状流 DiT 和纹理流 DiT 均采用了稀疏 Transformer 架构;而稀疏结构流 DiT 则采用稠密 Transformer。
几何体生成(Shape Flow)
形状流 DiT 利用占据网格与 DINOv3 特征 Token 生成潜变量,随后由另一个 VAE 解码器将其转换为分辨率为 512 × 512 × 512 的 O-Voxel 几何体。
该阶段的 DiT 控制着物体的具体形状,因此我们也为其添加了 LoRA 适配器。
材质生成与网格创建
在最后一个阶段,纹理流 DiT 以形状潜变量和 DINOv3 特征为输入,定义几何体表面的材质与纹理。随后,VAE 解码器将该潜变量转换为每个体素的基础颜色、金属度、粗糙度和 Alpha 透明度值。我们没有给这个阶段添加 LoRA 适配器:一方面,我们的数据集包含漫反射颜色贴图,但缺乏该阶段训练所需的独立材质贴图;另一方面,我们重点解决的是鞋子的造型问题,而基础模型本身生成的颜色和纹理效果已经相当不错。
最后,整个流程将几何体与材质属性结合生成带纹理的网格,并导出为 GLB 文件。
规划
微调哪些组件
我们只对稀疏结构流 DiT 和形状流 DiT 添加 LoRA 适配器,因为这两个 DiT 控制着物体的形状与几何结构;纹理流 DiT 则直接冻结,以保留其现有的生成能力。
此外,我们的数据集中是带有烘焙光照效果的漫反射颜色贴图,而训练纹理流 DiT 需要独立的解耦材质贴图。由于数据集里的颜色贴图混合了表面颜色与光照,无法作为该训练阶段的正确目标。
如果直接用这些贴图训练纹理流 DiT,模型可能会把光照当成表面固有属性学进去;此外,它还可能遗忘先前学到的知识,产生所谓的“灾难性遗忘”。
为什么选择 LoRA
我们的子集从 GSO 的 1,030 个物体中选取了 188 款鞋子。面对规模这么小的数据集,LoRA 是比全量微调更好的选择。全量微调不仅成本高得多,还可能破坏模型原有的优秀能力(即学到的先验知识)。我们的配置一共为这两个目标 DiT 训练约 930 万个适配器参数。我们在稀疏结构流 DiT 的注意力层和前馈(MLP)层中使用 rank 8 适配器,在形状流 DiT 的注意力层中使用 rank 16 适配器。rank 决定了适配器矩阵的大小,rank 越高,适配器能学到的内容就越多。
运行内容
配置 3D 模型环境通常涉及繁琐的依赖项和安装步骤。为此,我们打包了两个预装必要软件的 Docker 镜像(既能在 Jobs 上运行,也能在本地机器上运行),一个用于数据预处理,另一个用于模型微调。
训练 LoRA 适配器并上传到 Hub 的完整流程如下:
- 为容器开放数据访问权限。
- 设置任务参数。
- 运行预处理容器。
- 运行微调容器。
接下来,我们将深入拆解微调脚本及其具体配置,并说明各项设置对训练的影响。
实验概览
整个实验主要分为三个部分:
- 准备数据:将 GLB 或 OBJ 网格转换为 TRELLIS.2 训练所需的潜空间表征,并渲染输入图像。
- 训练适配器:结合准备好的数据集和 LoRA 配置,为每个 DiT 分别运行一个训练任务。
- 解析代码:分析容器如何加载数据、注入适配器并训练模型。
预处理后的数据集会被保存下来,方便后续所有训练任务复用。
实操步骤
在 Hugging Face Jobs 上运行
数据预处理
预处理容器利用 Blender 为每个物体渲染 16 个视角的图像,这些视角图将作为 LoRA 训练的条件图像。Blender 通过 xvfb-run 工具以无显示模式运行。此外,容器还会通过预处理流水线对每个物体进行处理。中间输出示例可参考这里的鞋类数据集。在我们包含 188 个物体的数据集上,使用 a100-large 任务完整跑完约耗时 1 小时。配套代码库中还提供了一个精简版的预处理流水线。
export HF_TOKEN=hf_xxx
# Replace your-username with your Hugging Face username
hf jobs run -d --flavor a100-large --timeout 6h --secrets HF_TOKEN \
cr.hf.co/suvadityamuk/trellis2-finetuning-prep:latest \
trellis2-prep \
--meshes your-username/my-meshes \
--push-to your-username/my-meshes-trellis2 \
--private --holdout 0.05 \
--views 16 --workers 8
在 Hugging Face Jobs 中,我们需要传入以下参数:
| 参数 | 说明 |
|---|---|
-d |
后台运行(Detach):打印任务 ID 和 URL 后立即返回。如需跟踪任务日志,请运行 hf jobs logs -f <id> |
--flavor a100-large |
指定硬件规格。这里使用的是 a100-large(80 GB)。如需查看所有可选配置,请运行 hf jobs hardware |
--timeout 6h |
任务在此超时时间后停止。两个命令均支持断点续跑:预处理会自动跳过已完成的物体,训练则会从 --push-to 指定位置的最新检查点继续 |
--secrets HF_TOKEN |
将你的 Token(来自 HF_TOKEN 或 hf auth login)作为加密环境变量传入任务,Token 不会被写入镜像中 |
cr.hf.co/...:latest |
要运行的镜像。镜像名称之后的所有文本均为在容器内执行的命令 |
无论是在 Hugging Face Jobs 还是用本地 Docker 运行,该容器还支持其他几个参数,详情可参考此处的文档。预处理流水线的具体处理步骤将在后文的这一节中详细说明。
LoRA 微调
训练容器会加载准备好的数据集以及配置预设或配置文件,并通过 Trackio 记录训练指标。你可以通过 Trackio 控制面板来监控运行状态。
我们用“ss”和“shape”来表示两种 LoRA 训练模式。“ss”模式仅微调稀疏结构 Flow DiT(Sparse-Structure Flow DiT),而“shape”模式则微调形状 Flow DiT(Shape Flow DiT)。其底层原理,只是在不同阶段引用了不同的 config.json 配置文件。关于该流程的更多细节,可参考后文的这一章节。
export HF_TOKEN=hf_xxx # Replace your-username with your Hugging Face username
hf jobs run -d --flavor a100-large --timeout 12h --secrets HF_TOKEN \
cr.hf.co/suvadityamuk/trellis2-finetuning-train:latest \
trellis2-train --config ss \
--latents your-username/my-meshes-trellis2 \
--push-to your-username/my-trellis2-lora \
--run-name ss_lora \
--push-path ss_lora \
--trackio-space your-username/trellis2-trackio
hf jobs run -d --flavor a100-large --timeout 12h --secrets HF_TOKEN \
cr.hf.co/suvadityamuk/trellis2-finetuning-train:latest \
trellis2-train --config shape \
--latents your-username/my-meshes-trellis2 \
--push-to your-username/my-trellis2-lora \
--run-name shape_lora \
--push-path shape_lora \
--trackio-space your-username/trellis2-trackio \
--set max_steps=3000 i_save=500
如果设置了 --push-to,容器会将适配器检查点上传到 Hub。为简明起见,容器支持的参数也已整理在此处。此外,同一个代码库中还提供了一个精简脚本。
如果你想上手体验,直接用我们已处理好的数据集进行微调,可以运行以下命令:
export HF_TOKEN=hf_xxx
# Replace your-username with your Hugging Face username
# For the Sparse-Structure Flow DiT
hf jobs run -d --flavor a100-large --timeout 12h --secrets HF_TOKEN \
cr.hf.co/suvadityamuk/trellis2-finetuning-train:latest \
trellis2-train \
--config ss \
--latents suvadityamuk/gso-footwear-trellis2-latents \
--push-to your-username/trellis2-footwear-lora \
--run-name ss_lora \
--push-path ss_lora \
--trackio-space your-username/trellis2-trackio \
--set max_steps=3000 i_save=500
# For the Shape Flow DiT
hf jobs run -d --flavor a100-large --timeout 12h --secrets HF_TOKEN \
cr.hf.co/suvadityamuk/trellis2-finetuning-train:latest \
trellis2-train \
--config shape \
--latents suvadityamuk/gso-footwear-trellis2-latents \
--push-to your-username/trellis2-footwear-lora \
--run-name shape_lora \
--push-path shape_lora \
--trackio-space your-username/trellis2-trackio \
--set max_steps=3000 i_save=500
使用 Docker 在本地运行
预处理
命令和参数与 Hugging Face Jobs 一致,仅 Docker 运行选项有所不同。
# For preprocessing into latents
docker run --gpus all --rm --shm-size 16g -e HF_TOKEN=hf_xxx \
-v hf-cache:/root/.cache/huggingface -v "$PWD/work":/workspace/work \
cr.hf.co/suvadityamuk/trellis2-finetuning-prep:latest \
trellis2-prep --meshes your-username/my-meshes --push-to your-username/my-meshes-trellis2
LoRA 微调
# For Sparse-structure Flow DiT
docker run --gpus all --rm --shm-size 16g \
-v hf-cache:/root/.cache/huggingface -v "$PWD/work":/workspace/work \
cr.hf.co/suvadityamuk/trellis2-finetuning-train:latest \
trellis2-train --config ss --latents your-username/my-meshes-trellis2 \
--push-to your-username/my-trellis2-lora --trackio-space your-username/trellis2-trackio
# For Shape Flow DiT
docker run --gpus all --rm --shm-size 16g \
-v hf-cache:/root/.cache/huggingface -v "$PWD/work":/workspace/work \
cr.hf.co/suvadityamuk/trellis2-finetuning-train:latest \
trellis2-train --config shape --latents your-username/my-meshes-trellis2 \
--push-to your-username/my-trellis2-lora --trackio-space your-username/trellis2-trackio
如果想在本地设备上使用我们预处理好的数据集,请运行以下命令:
export HF_TOKEN=hf_xxx # Replace your-username with your Hugging Face username
# For Sparse-structure Flow DiT
docker run --gpus all --rm --shm-size 16g -e HF_TOKEN \
-v hf-cache:/root/.cache/huggingface \
-v "$PWD/work":/workspace/work \
cr.hf.co/suvadityamuk/trellis2-finetuning-train:latest \
trellis2-train \
--config ss \
--latents suvadityamuk/gso-footwear-trellis2-latents \
--push-to your-username/trellis2-footwear-lora \
--trackio-space your-username/trellis2-trackio \
--set max_steps=3000 i_save=500
# For Shape Flow DiT
docker run --gpus all --rm --shm-size 16g -e HF_TOKEN \
-v hf-cache:/root/.cache/huggingface \
-v "$PWD/work":/workspace/work \
cr.hf.co/suvadityamuk/trellis2-finetuning-train:latest \
trellis2-train \
--config shape \
--latents suvadityamuk/gso-footwear-trellis2-latents \
--push-to your-username/trellis2-footwear-lora \
--trackio-space your-username/trellis2-trackio \
--set max_steps=3000 i_save=500
我们训练好的 LoRA 适配器存放在该仓库中:suvadityamuk/trellis-2-finetune-gso
训练流程详解
预处理为潜在表示
我们使用 TRELLIS.2 冻结的编码器将输入的网格模型转换为训练所需的潜表示(latents)。将这些潜表示保存下来后,后续运行就无需重复对网格进行编码了。
我们还在 Blender 中为每个物体渲染了 16 个视角的图像。训练时,会为每个样本随机选取一个视角作为条件图像。我们在全部 188 个物体中保留了 9 个用于评估,其余 179 个用于训练。这些留出的评估物体可以用来检验适配器在模型训练未见过的物体上表现如何。
Blender 为单个物体渲染的部分视角图像
第一段代码用于准备数据。FLOW 用来选择要训练的 Flow DiT(ss 或 shape),STEPS 用于设定优化器的训练步数。批大小设为 4,配合 4 步梯度累积,等效批大小达到 16。随后,代码会加载所选 Flow DiT 的 LoRA 配置文件,构建 TRELLIS.2 格式的数据集,剔除预留的评估物体,并创建用于微调的数据加载器。
cfg = json.load(
open(
{
"ss": "/workspace/TRELLIS.2/configs/lora/ss_flow_lora_gso.json",
"shape": "/workspace/TRELLIS.2/configs/lora/slat_flow_img2shape_lora_gso.json",
}[FLOW]
)
)
key, latents = {
"ss": ("ss_latent", "ss_latents/ss_enc_conv3d_16l8_fp16_64"),
"shape": ("shape_latent", "shape_latents/shape_enc_next_dc_f16c32_fp16_512"),
}[FLOW]
roots = json.dumps(
{
"gso": {
key: f"{DATA}/{latents}",
"render_cond": f"{DATA}/renders_cond",
"meta": DATA,
}
}
)
ds = getattr(datasets, cfg["dataset"])(roots, **cfg["dataset_args"])
holdout = set(open(f"{DATA}/holdout.txt").read().split())
ds.instances = [(root, sha) for root, sha in ds.instances if sha not in holdout]
batches = cycle(
DataLoader(
ds,
batch_size=BATCH,
shuffle=True,
drop_last=True,
num_workers=4,
collate_fn=getattr(ds, "collate_fn", None),
)
)
准备 LoRA 适配器
我们使用 peft 库将 LoRA 适配器插入指定网络层。由于 TRELLIS.2 采用了自定义的前向传播逻辑,标准的 PeftModel() 包装器无法直接生效。因此,我们改用 inject_adapter_in_model(),该函数可直接向模型添加适配器,同时保留原有的自定义接口。
出于数值稳定性考虑,我们以 32 位浮点数(fp32)保存可训练的适配器权重,在前向传播时则使用 bfloat16(bf16)自动混合精度(autocasting)。自动混合精度允许 PyTorch 在部分计算中使用更低精度,从而降低显存占用,但不会改变冻结骨干网络权重的实际存储精度。
model = models.from_pretrained(cfg["ckpt"])
for block in model.blocks:
block.use_checkpoint = True
inject_adapter_in_model(
LoraConfig(
r=cfg["rank"], lora_alpha=cfg["alpha"], target_modules=cfg["lora_targets"]
),
model,
)
params = []
for name, p in model.named_parameters():
p.requires_grad_("lora_" in name)
if p.requires_grad:
p.data = p.data.float() # fp32 master weights for LoRA
params.append(p)
model.cuda().train()
模型训练
值得一提的是,我们在这里使用的目标函数依然是经典的整流流匹配(rectified flow matching),像 Stable Diffusion 3、Flux 2 等主流图像生成模型采用的也是这种方法。TRELLIS.2 在预训练阶段同样使用了这一目标,因此在微调时沿用它十分合适。如果想了解理论背景,可以阅读这篇关于流匹配的博客。
我们只更新稀疏结构 DiT 和形状 DiT 中的 LoRA 参数,原始模型的所有权重均保持冻结。
以下代码片段展示了单个阶段的核心训练循环。相比容器中的完整代码,这里做了简化,省略了部分初始化步骤。如需运行完整流程,请使用容器命令。
我们首先初始化优化器,并加载 DINOv3 来提取输入图像的特征。
opt = torch.optim.AdamW(
params, lr=cfg["lr"], weight_decay=cfg["weight_decay"], betas=(0.9, 0.95)
)
dino = DinoV3FeatureExtractor(
cfg["image_cond_model"], image_size=cfg["image_size"]
).cuda()
接着在训练循环中执行以下步骤:
- 为每个样本采样一个时间步 t(按照 TRELLIS.2 的配置,稀疏结构 flow DiT 使用 logit-normal 分布,形状 flow DiT 使用均匀分布)。
- 生成与数据形状相同的随机噪声,并调整 t 的形状以支持广播计算。
- 根据 t 将干净数据与噪声混合(其中 t = 0 代表噪声极小的数据,t = 1 代表纯噪声)。
- 在 t × 1000 处预测速度,以匹配预训练条件。
- 计算预测速度与目标速度(即 x_t 的一阶导数)之间的均方误差,以此作为损失。
def flow_loss(x0, cond):
s = cfg["t_schedule"]
t = (
torch.rand(x0.shape[0])
if s["name"] == "uniform"
else torch.sigmoid(
torch.randn(x0.shape[0]) * s["args"]["std"] + s["args"]["mean"]
)
)
t = t.cuda()
noise = (
x0.replace(torch.randn_like(x0.feats))
if cfg["sparse"]
else torch.randn_like(x0)
)
tv = t.view(-1, *[1] * (len(x0.shape) - 1))
x_t = (1 - tv) * x0 + (cfg["sigma_min"] + (1 - cfg["sigma_min"]) * tv) * noise
pred, target = model(x_t, t * 1000, cond), (1 - cfg["sigma_min"]) * noise - x0
return (
F.mse_loss(pred.feats, target.feats)
if cfg["sparse"]
else F.mse_loss(pred, target)
)
训练循环负责计算损失并更新适配器权重。模型在每次优化器更新前,会通过梯度累积将 4 个小批次的梯度相加。梯度检查点(gradient checkpointing)则通过在反向传播时重算部分中间变量来节省显存。外层循环按设定的优化器步数执行,内层循环则负责跨批次累积梯度。
对于每个批次,DINOv3 会对条件图像进行编码。在无分类器引导(CFG)dropout 机制下,程序会以随机比例(p_uncond)将样本的条件特征置零。随后,在 bf16 自动混合精度下计算流匹配损失。内层循环结束后,先进行梯度裁剪以避免参数更新幅度过大,再执行优化器更新。训练过程中每 10 步记录一次损失,每 500 步保存一次适配器检查点。
for step in range(1, STEPS + 1):
for _ in range(ACCUM):
batch = next(batches)
x0 = recursive_to_device(batch["x_0"], "cuda")
with torch.no_grad():
cond = dino(batch["cond"])
cond[torch.rand(len(cond), device="cuda") < cfg["p_uncond"]] = 0
with torch.autocast("cuda", dtype=torch.bfloat16):
loss = flow_loss(x0, cond) / ACCUM
loss.backward()
torch.nn.utils.clip_grad_norm_(params, cfg["grad_clip"])
opt.step()
opt.zero_grad()
结果
我们训练了两个适配器:一个用于稀疏结构 DiT,另一个用于形状 DiT。容器镜像中的 LoRA 配置文件包含了完整的训练配置:稀疏结构 flow DiT 见 ss_flow_lora_gso.json,形状 flow DiT 见 slat_flow_img2shape_lora_gso.json。两次训练均在 Hugging Face Jobs 上使用单张 80 GB A100 运行,稀疏结构模型耗时 7.2 小时,形状模型耗时 3.6 小时。
稀疏结构 flow DiT 的训练损失起初快速下降,随后趋于平缓;而形状 flow DiT 的损失则基本维持在同一水平。这些曲线反映了训练目标的变化趋势,但无法直接衡量生成几何体的实际质量。
流匹配损失会随着采样的物体、噪声和时间步而波动。若想了解微调是否真正提升了几何质量,还必须对比模型在保留测试集物体上的输出表现。
下图对比了 9 个保留测试样本中 5 个的生成效果,分别展示了输入图像、基座模型生成结果、旋转校正后的基座模型结果、挂载鞋类适配器后的输出,以及作为参考的 3D 扫描件。从这些示例可以看出,微调后模型生成的鞋底结构明显更贴近真实扫描结果。
我们还通过三项指标评估了测试集上的几何质量:
| 指标 | 指标含义 |
|---|---|
| Chamfer 距离 | 一个表面上的点到另一个表面最近点的双向测量距离。数值越低越好。 |
| F-score @ 0.02 | 精确率(生成表面有多少靠近参考表面)与召回率(生成表面覆盖了多少参考表面)的综合指标。这里的匹配阈值设为扫描模型边界框对角线的 2%。数值越高越好。 |
| 法线一致性 | 衡量表面朝向的吻合程度。表面法线即垂直于表面的向量。数值越高越好。 |
在图表中对比的 9 个物体上,基础模型的平均 F-score 为 0.276,加入鞋类适配器后则达到 0.803;Chamfer 距离从 0.174 降至 0.033,法线一致性从 0.530 提升至 0.804。在两个适配器的共同作用下,全部 9 个保留测试物体上的 F-score 均有提升。
如需查看所有运行的完整统计数据,请访问此 Trackio Space。
未来方向
呼,大功告成!我们通过在控制几何形状的两个模型组件中加入 LoRA 适配器,完成了 TRELLIS.2 在鞋类生成任务上的微调。我们只准备了一次数据,分别针对两个组件训练适配器,并在保留测试物体上完成了效果评估。
核心经验在于:选择与具体问题以及现有数据契合的训练目标。在本次实验中,我们微调了结构与形状阶段,并冻结了纹理阶段。
下一步,我们还可以验证同样的方案是否适用于其他 3D 生成模型,例如 Pixal3D 和 UniLat3D。
诸如 HunyuanWorld 2.0 和 NVIDIA Lyra 2.0 这类高斯泼溅与世界生成模型,也是潜在的研究方向;不过它们的表征方式与训练管线可能需要采用不同的方法。
感谢阅读,我们下期见!👋🤗
来源:Hugging Face Blog · huggingface.co









