本页面介绍了将 SAM (Segment Anything Model) 模型导出为 ONNX 格式以及使用导出模型的流程。ONNX 导出功能允许将 SAM 的提示编码器和掩码解码器组件部署到支持 ONNX Runtime 的不同平台,同时排除计算量大的图像编码器,后者最好单独运行。
有关核心 SAM 架构的信息,请参阅 SAM 模型架构。有关不使用 ONNX 的模型使用详情,请参阅 SamPredictor。
ONNX (Open Neural Network Exchange) 是表示深度学习模型的一种开放格式。SAM 的 ONNX 导出功能能够:
来源
ONNX 导出过程仅导出 SAM 模型中的特定组件。这种架构决策能够实现高效部署,同时保持性能。
导出到 ONNX 的组件包括:
计算量大的图像编码器 (ViT) 已从 ONNX 导出中排除,因为它通常每个图像只运行一次,并且单独在 GPU 上执行效率更高。
来源
可以使用导出脚本或以编程方式将 SAM 模型导出为 ONNX 格式。导出过程将创建一个 ONNX 模型,该模型以图像嵌入和提示作为输入,并输出预测的掩码。
将 SAM 模型导出为 ONNX 的主要方法是使用导出脚本:
python scripts/export_onnx_model.py \
--checkpoint path/to/sam_checkpoint.pth \
--output sam_onnx_model.onnx \
--model-type vit_h \
--return-single-mask
| 选项 | 描述 | 默认 |
|---|---|---|
--checkpoint | SAM 模型检查点的路径。 | 必填 |
--output | 保存 ONNX 模型的路径。 | 必填 |
--model-type | SAM 模型类型(vit_h、vit_l、vit_b)。 | 必填 |
--return-single-mask | 仅返回最佳掩码,而不是多个掩码。 | 否 |
--opset | 要使用的 ONNX opset 版本(必须 ≥11)。 | 17 |
--quantize-out | 保存量化模型的路径(如果指定)。 | None |
--gelu-approximate | 用 tanh 近似替换 GELU。 | 否 |
--use-stability-score | 使用稳定性分数而不是预测质量。 | 否 |
--return-extra-metrics | 返回额外的指标(高分辨率时较慢)。 | 否 |
来源
为了获得更多控制权,您可以通过编程方式导出模型:
来源
您可以选择对导出的 ONNX 模型进行量化,以减小其大小并提高推理速度。这对于 Web 部署特别有用。
来源
使用导出的 ONNX 模型需要:
ONNX 模型需要的输入格式与标准的 SamPredictor 不同。
| 输入 | 描述 | 形状 | 类型 |
|---|---|---|---|
image_embeddings | 图像编码器的输出。 | [1, embed_dim, embed_h, embed_w] | float32 |
point_coords | 在 1024×1024 空间中的点/框坐标。 | [1, num_points, 2] | float32 |
point_labels | 点的标签(0=负,1=正,2=左上角框,3=右下角框,-1=填充)。 | [1, num_points] | float32 |
mask_input | 前一个掩码作为输入(如果没有则为零)。 | [1, 1, 256, 256] | float32 |
has_mask_input | 指示是否使用掩码输入(0/1)。 | [1] | float32 |
orig_im_size | 原始图像尺寸(高,宽)。 | [2] | float32 |
模型产生三个输出:
masks:预测的掩码,形状为 [1, 1, H, W]。iou_predictions:预测的 IoU 分数。low_res_masks:低分辨率掩码 logits。来源
使用 ONNX 模型的一般工作流程包括:
来源
下面是一个使用 ONNX 模型的简化示例:
来源
在使用 ONNX 导出的模型时,请考虑以下性能方面:
图像编码器分离:图像编码器(最重部分)已从 ONNX 导出中排除,应单独运行,通常在 GPU 上。
量化优势:量化模型可以显著减小尺寸并提高推理速度,尤其是在 Web 部署中。
单个或多个掩码:return_single_mask 选项通过避免对多个掩码候选进行放大来提高高分辨率图像的性能。
GELU 近似:gelu-approximate 选项可以提高在具有缓慢或未实现 erf 操作的运行时上的性能。
额外指标:返回额外指标会减慢高分辨率输出的处理速度。
ONNX 导出过程专门设计用于实现高效的交互式分割,其中图像只需处理一次,然后各种提示可以快速处理,而无需重新计算图像嵌入。
来源
ONNX 导出的模型在以下场景中特别有用:
Web 应用:轻量级的 ONNX 模型可以使用 ONNX Web Runtime 在浏览器中运行,而图像编码器可以在服务器上或使用 WebGL 运行。
移动设备:组件的分离允许在资源受限的设备上高效部署。
多框架环境:使用多个 ML 框架的组织可以将 SAM 集成到其现有流程中。
边缘设备:量化模型可以在计算资源有限的边缘设备上高效运行。
来源
ONNX 导出功能围绕 SamOnnxModel 类构建,该类封装了标准的 SAM 模型并进行必要的适应以实现 ONNX 兼容性。
SamOnnxModel 类包含:
return_single_mask 时,实现选择最佳掩码的逻辑。主要实现细节
该实现避免了可能与 ONNX 导出不兼容的控制流操作,并使用了可以正确追踪的张量操作。
来源
在导出或使用 ONNX 格式的 SAM 时,您可能会遇到以下常见问题:
ONNX 版本兼容性:确保 ONNX opset 版本(默认为 17)与您的运行时环境兼容。如有必要,请使用 --opset 参数选择不同的版本。
输入准备:ONNX 模型需要特定格式的输入。大多数错误都与不正确的输入形状或类型有关。
点坐标:请记住,在将点坐标传递给 ONNX 模型之前,必须将其转换为模型 1024×1024 的坐标空间。
点填充:对于框输入或在未提供点的情况下,必须包含标签为 -1 的填充点。
量化问题:如果量化模型产生不正确的结果,请尝试使用非量化版本,它可能更准确但速度较慢。
来源
SAM 中的 ONNX 导出功能提供了一种灵活的方式,可以将模型交互式分割功能部署到各种平台。通过将一次性的图像嵌入计算与交互式提示过程分离开来,它能够为实时分割应用实现高效的工作流程。
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(dca509)