菜单

使用示例

相关源文件

本页面提供了全面的示例,演示如何使用分割任意模型 (SAM) 完成不同的图像分割任务。我们将介绍如何使用交互式 SamPredictor 和自动式 SamAutomaticMaskGenerator 接口,以及命令行工具和部署选项。有关安装说明和基本设置,请参阅 入门指南,有关 SAM 架构的技术详细信息,请参阅 核心组件

理解 SAM 的工作流程

SAM 提供两种主要的掩码生成接口

来源: notebooks/predictor_example.ipynb20-30 notebooks/automatic_mask_generator_example.ipynb18-30

使用 SamPredictor 进行交互式分割

SamPredictor 类通过允许您提供特定的提示(点、框或掩码)来指示要分割的对象,从而实现交互式分割。

设置 SamPredictor

来源: README.md55-65 notebooks/predictor_example.ipynb80-90

使用点提示

点提示允许您点击一个对象来生成其掩码。每个点都可以标记为前景点(对象内部)或背景点(对象外部)。

multimask_output=True 参数指示 SAM 为相同的提示返回三个不同的掩码预测,允许您选择最佳的一个。

来源: notebooks/predictor_example.ipynb180-200

使用框提示

框提示允许您在对象周围绘制边界框以获得精确的掩码。

来源: notebooks/predictor_example.ipynb220-240

结合多种提示类型

您可以结合点和框提示以获得更精确的控制

您还可以使用先前生成的掩码 Logits 来改进预测

来源: notebooks/predictor_example.ipynb250-270

SamPredictor 工作流程

来源: notebooks/predictor_example.ipynb20-40 README.md55-70

自动掩码生成

SamAutomaticMaskGenerator 类允许您生成图像中的所有潜在对象掩码,而无需提供特定的提示。

设置自动掩码生成器

来源: README.md68-72 notebooks/automatic_mask_generator_example.ipynb120-130

自定义自动掩码生成

您可以使用各种参数自定义自动掩码生成器的行为

影响掩码质量和数量的主要参数

  • points_per_side:控制点采样的密度(点越多 = 掩码越多)
  • pred_iou_thresh:较高的值会产生更高质量的掩码,但数量较少
  • stability_score_thresh:较高的值会选择对点放置变化更鲁棒的掩码
  • min_mask_region_area:去除掩码中的小断开区域和孔洞

来源: notebooks/automatic_mask_generator_example.ipynb130-150

自动掩码生成过程

来源: notebooks/automatic_mask_generator_example.ipynb18-30

理解掩码输出格式

generate() 方法返回一个字典列表,每个字典包含有关一个掩码的信息

每个掩码字典包含

  • segmentation:二进制掩码
  • bbox:XYWH 格式的边界框
  • area:掩码的像素面积
  • predicted_iou:模型的预测 IoU 分数
  • stability_score:掩码稳定性分数
  • crop_box:用于生成此掩码的图像裁剪框
  • point_coords:用于生成此掩码的点坐标

来源: notebooks/automatic_mask_generator_example.ipynb140-160 README.md118-145

命令行界面

SAM 包含一个命令行脚本,用于自动为图像生成掩码

例如

该脚本支持以下可选参数

  • --checkpoint:模型检查点的路径
  • --model-type:要加载的模型类型(默认为 "vit_h")
  • --input:图像文件或图像目录的路径
  • --output:输出目录的路径
  • --amg-kwargs:SamAutomaticMaskGenerator 参数的 JSON 序列化字符串

来源: README.md76-78

ONNX 导出和部署

对于在支持 ONNX 的环境中进行部署,您可以将 SAM 的掩码解码器导出为 ONNX 格式。

导出到 ONNX

例如

来源: README.md88-96

ONNX 模型架构

ONNX 导出将模型分为两部分

  1. 图像编码器保留在 PyTorch 中并预先计算图像嵌入
  2. 提示编码器和掩码解码器导出到 ONNX 以实现高效推理

来源: README.md88-95

使用不同模型大小

SAM 提供三种模型尺寸,可平衡精度和计算要求

模型类型描述检查点大小性能
vit_h(默认)ViT-H SAM 模型2.4 GB最高精度,最慢
vit_lViT-L SAM 模型1.2 GB精度和速度的良好平衡
vit_bViT-B SAM 模型375 MB最快,精度较低

使用特定模型

来源: README.md101-115

技巧和最佳实践

  1. 一次性计算嵌入:使用 SamPredictor 时,请调用 set_image() 一次,然后进行多次基于提示的预测,而不是为每次预测重新加载图像。

  2. 提示选择:

    • 点提示适用于较小、清晰的对象
    • 当点提示效果不佳时,框提示更适合较大的对象
    • 结合使用点和框提示通常能获得最佳效果
  3. 多掩码输出:设置 multimask_output=True 可获得多个备选掩码预测,然后选择最佳的一个。

  4. 自动掩码生成器性能:

    • 减小 points_per_side 可加快处理速度
    • 增加 pred_iou_threshstability_score_thresh 可获得更高质量的掩码
    • 如果您获得太多小的掩码,请增加 min_mask_region_area
  5. 内存优化:如果您遇到内存问题,特别是使用 ViT-H 模型时

    • 使用较小的模型,如 ViT-L 或 ViT-B
    • 以较小的批次处理图像
    • 降低图像分辨率(但要注意这可能会影响质量)

来源: notebooks/predictor_example.ipynb30-40 notebooks/automatic_mask_generator_example.ipynb25-30

可视化工具

要在笔记本或应用程序中显示掩码和提示,您可以使用这些辅助函数

来源: notebooks/predictor_example.ipynb145-170

SAM 输出格式

在处理 SAM 的输出时,了解掩码数据格式很重要

SamPredictor 输出

predict() 方法返回三个值

  1. masks:一个形状为 [num_masks, H, W] 的布尔值张量
  2. scores:一个预测置信度分数的列表
  3. logits:可用于进一步细化的原始 logits

SamAutomaticMaskGenerator 输出

generate() 方法返回一个字典列表,每个字典包含

用于以 COCO 格式存储掩码

来源: README.md118-155

与现有工作流集成

SAM 可集成到各种计算机视觉工作流中

  1. 数据标注:使用 SamPredictor 加快训练数据的手动标注
  2. 其他模型的预处理:使用生成的掩码来隔离对象,然后再进行进一步处理
  3. 图像编辑:使用掩码提取对象,用于合成、移除或增强
  4. 医学影像:通过点或框提示分割解剖结构
  5. 机器人技术:通过提示识别感兴趣的对象,以进行抓取和放置操作

来源: README.md20-30

常见问题与解决方案

  1. 模型加载错误:

    • 确保您使用的是正确的模型类型及其匹配的检查点
    • 检查您是否有足够的 RAM/VRAM 来加载模型(特别是对于 vit_h)
  2. 性能缓慢:

    • 首次预测由于模型初始化而较慢
    • 在可能的情况下使用批量处理
    • 考虑使用较小的模型或 ONNX 导出进行部署
  3. 不理想的掩码:

    • 尝试不同的提示类型或组合
    • 调整 SamAutomaticMaskGenerator 的参数
    • 启用 multimask_output 并从备选项中选择最佳掩码
  4. 内存问题:

    • 将大图像分块处理
    • 使用较小的模型变体
    • 在处理多个图像时减小批次大小
  5. ONNX 导出问题:

    • 导出时使用最新稳定版本的 PyTorch
    • 检查与目标运行时的兼容性

来源: README.md95-100 notebooks/predictor_example.ipynb40-50 notebooks/automatic_mask_generator_example.ipynb30-40