直接把一张普通照片变成可导入Blender或Unity的3D网格,这件事在One-2-3-45出现之前通常要经过多视图采集、点云重建、网格化等多个步骤。One-2-3-45 把这条链路压缩成一次前向推理,输入单张RGB图像,输出带顶点和面片的三角网格,单次调用就能在数秒内完成。它的速度优势使其适合批量生成商品展示模型、游戏原型资产和虚拟人基础网格。本文拆解整体流程、推理部署、参数调优和常见误区。

一、整体思路:单次前向为什么能直接输出网格
传统的单图三维重建往往先做深度估计,再通过可微渲染或隐式场优化形状。这类方法虽然能生成比较精细的几何,但推理阶段需要多轮迭代,耗时通常在分钟级别。One-2-3-45 换了一种思路:在训练阶段就把图像特征和网格顶点直接建立映射。模型看到的是一张经过裁剪和缩放的物体图像,输出的则是离散的三角网格数据,包括顶点坐标和面索引。
具体来说,One-2-3-45 由图像编码器、形状先验模块和网格解码器三部分组成。图像编码器负责把输入图像压缩成紧凑的视觉特征;形状先验模块提供物体类别的几何分布,帮助模型补全单张图片看不到的背面;网格解码器则根据特征和先验生成最终的顶点位置与拓扑结构。因为整个流程不包含体积渲染和迭代优化,所以推理速度可以做到秒级。
和 NeRF 或 SDF 这类隐式表示相比,网格输出省去了 Marching Cubes 提取和表面细化的步骤,直接得到可编辑、可渲染的结果。代价是生成网格的细节不如多视角优化方案丰富,但在快速验证和批量任务中,这种取舍非常实用。
二、环境准备与单图推理代码
要在本地跑通 One-2-3-45,建议使用支持 CUDA 的 PyTorch 环境。依赖包并不复杂,通常只需要 torch、numpy、pillow 和 trimesh。安装命令如下:
pip install torch torchvision numpy pillow trimesh
官方推理脚本的入口通常是一个预训练权重文件和一段生成函数。下面给出一个简化版调用示例,假设你已经把模型文件放在本地目录中。代码中的路径使用了 Windows 格式,如果你在 Linux 或 macOS 上运行,改成对应路径即可。
import torch
from PIL import Image
import trimesh
from one2345 import One2345Model
model = One2345Model.from_pretrained(r'C:\Users\admin\one2345\checkpoints')
model.eval()
model.cuda()
img = Image.open(r'C:\Users\admin\one2345\input.png').convert('RGB')
mesh = model.generate_mesh(img, resolution=128)
mesh.export(r'C:\Users\admin\one2345\output.obj')
print('vertices:', mesh.vertices.shape)
print('faces:', mesh.faces.shape)
其中 generate_mesh 函数接收图像对象和 resolution 参数,返回一个 trimesh 网格对象。输出顶点和面片数量可用于快速判断生成是否正常。如果显存不足,可以把 resolution 降低到 96 或 64,也可以把模型放到 CPU 上运行,但速度会明显下降。
三、影响生成质量的关键参数
输入图像的预处理对最终网格影响很大。One-2-3-45 默认假设物体大致居中且占画面主要区域。如果原图背景杂乱、物体只占一小部分,或者存在严重遮挡,模型很可能会生成残缺或不自然的形状。建议先用目标检测或人工裁剪把物体框出来,再缩放到正方形尺寸。背景移除能进一步提升边界质量,尤其是毛发、细杆等结构。
网格分辨率参数控制输出网格的顶点数量。较高的分辨率能保留更多几何细节,但同时会增加显存占用和导出文件体积。对于游戏原型或 Web 展示,通常不需要默认的最高分辨率;生成完成后可以用 trimesh 的简化功能减少面数。比如下面这段代码会加载刚才导出的 OBJ 文件,并把面数简化到原来的十分之一。
import trimesh
mesh = trimesh.load(r'C:\Users\admin\one2345\output.obj')
if not mesh.is_watertight:
mesh = mesh.fill_holes()
simplified = mesh.simplify_quadric_decimation(face_count=2000)
simplified.export(r'C:\Users\admin\one2345\output_lowpoly.obj')
后处理阶段还要检查法线方向和面片流形性。trimesh 提供 is_watertight、fill_holes 和 fix_normals 等工具,可以在导入渲染器前把网格修整到更干净的状态。对于需要纹理的模型,One-2-3-45 通常只输出几何,纹理坐标需要额外生成,或者使用顶点色加烘焙的方式补充。
四、常见误区与工程落地建议
一个高频误区是期望单张图像能百分百还原物体背面。单目视觉本身存在信息缺失,One-2-3-45 的背面形状来自训练数据中学到的先验分布,而不是真实测量。如果物体背面与常见类别差异很大,生成结果大概率会出现偏差。实际项目中应把这类输出当作草稿或占位资源,重要资产仍需要多视角采集或人工修正。
另一个容易忽略的问题是输入图片的格式和颜色空间。PNG 透明背景在部分预处理管线中可能被当作黑色背景,导致模型误判轮廓。稳定做法是先把透明背景填充成白色或灰色,再喂给模型。批处理任务建议单独写一个预处理脚本,统一尺寸和背景,避免混合不同来源的数据造成质量波动。
从部署角度看,模型权重加载和显存预热会消耗首次调用时间,后续推理才会进入秒级状态。可以通过常驻服务的方式缓存已加载模型,用队列处理图片请求。输出 OBJ 或 GLB 文件后,建议在 Blender、Unity 或 three.js 中做一次快速目检,确认比例、朝向和材质表现。只要避开上述误区,One-2-3-45 可以显著降低从图像到可编辑网格的门槛。
One-2-3-45单图生成3D网格3D网格模型修改时间:2026-10-05 12:26:24