菜单

自定义掩码生成

相关源文件

目的与范围

本文档介绍如何自定义 Segment Anything Model (SAM) 中的自动掩码生成过程。它涵盖了 SamAutomaticMaskGenerator 类中可用的配置参数,该类提供了一种无需提示即可生成图像中所有潜在对象分割掩码的方法。有关使用提示进行交互式掩码生成的信息,请参阅 SamPredictor

自动掩码生成概述

SAM 中的自动掩码生成系统通过在图像上策略性地放置网格点,在每个点生成掩码,然后对其进行过滤和后处理,从而生成一组全面的高质量分割掩码。

来源: segment_anything/automatic_mask_generator.py137-195

配置参数

SamAutomaticMaskGenerator 构造函数接受许多参数,这些参数允许自定义掩码生成管道的每个阶段。

来源: segment_anything/automatic_mask_generator.py35-135

参数默认值和作用

参数默认值目的
points_per_side32沿图像每条边采样的点数
points_per_batch64同时处理的点数
pred_iou_thresh0.88基于预测掩码质量的过滤阈值
stability_score_thresh0.95基于掩码稳定性的过滤阈值
stability_score_offset1.0用于稳定性分数计算的偏移量
box_nms_thresh0.7用于非极大值抑制的 IoU 阈值
crop_n_layers0裁剪层数(0 = 无裁剪)
crop_nms_thresh0.7用于不同裁剪之间 NMS 的 IoU 阈值
crop_overlap_ratio512/1500裁剪的重叠程度
crop_n_points_downscale_factor1用于减小更深层裁剪中点数的因子
point_grids要使用的显式点网格(是 points_per_side 的替代项)
min_mask_region_area0掩码区域和孔的最小面积(0 = 无过滤)
output_mode"binary_mask"掩码的输出格式(binary_mask、uncompressed_rle、coco_rle)

来源: segment_anything/automatic_mask_generator.py36-52

自定义点采样

点以网格模式在图像上采样,每个点都作为掩码生成的提示。您可以通过 points_per_sidepoint_grids 自定义此过程。

设置每侧点数

points_per_side 参数确定在图像的每个维度上采样多少个点。总点数为 points_per_side^2。值越高,生成的掩码越多,但计算时间也会增加。

来源: segment_anything/automatic_mask_generator.py61-64 segment_anything/utils/amg.py179-186

使用自定义点网格

为了获得更多控制,您可以使用 point_grids 参数提供自定义点网格。这允许非均匀采样,点集中在感兴趣的区域。

来源: segment_anything/automatic_mask_generator.py86-89 segment_anything/utils/amg.py189-197

自定义批量处理

points_per_batch 参数控制同时处理多少个点。较高的值可能速度更快,但需要更多的 GPU 内存。

来源: segment_anything/automatic_mask_generator.py65-66 segment_anything/automatic_mask_generator.py244-247

按质量指标过滤

SAM 提供两个质量指标用于过滤掩码

预测 IoU 阈值

pred_iou_thresh 参数(默认值:0.88)设定模型预测的 IoU(交并比)分数阈值。分数低于此阈值的掩码将被丢弃。

来源: segment_anything/automatic_mask_generator.py67-69 segment_anything/automatic_mask_generator.py295-297

稳定性分数阈值

稳定性分数衡量当更改用于二值化模型掩码预测的阈值时,掩码的稳定性如何。stability_score_thresh 参数(默认值:0.95)确定了可接受的最低稳定性分数。

stability_score_offset 参数(默认值:1.0)控制计算稳定性时移位阈值的量。

来源: segment_anything/automatic_mask_generator.py69-74 segment_anything/automatic_mask_generator.py300-305 segment_anything/utils/amg.py156-176

使用裁剪进行多尺度处理

对于高分辨率图像,SAM 可以通过使用裁剪以多尺度处理图像。这有助于捕捉大对象和小对象。

  • crop_n_layers:裁剪层数(0 = 无裁剪)
  • crop_nms_thresh:用于在不同裁剪之间去除重复项的 IoU 阈值
  • crop_overlap_ratio:裁剪的重叠程度
  • crop_n_points_downscale_factor:用于减小更深层裁剪中点数的因子

来源: segment_anything/automatic_mask_generator.py76-86 segment_anything/automatic_mask_generator.py197-220 segment_anything/utils/amg.py199-234

非极大值抑制

SAM 使用非极大值抑制 (NMS) 来去除重复的掩码。

  • box_nms_thresh:单个裁剪内的 NMS 的 IoU 阈值
  • crop_nms_thresh:不同裁剪之间的 NMS 的 IoU 阈值

较低的值会导致重叠的掩码更少,但可能会移除部分重叠的独立对象。

来源: segment_anything/automatic_mask_generator.py74-76 segment_anything/automatic_mask_generator.py251-257 segment_anything/automatic_mask_generator.py210-220

后处理小区域

min_mask_region_area 参数控制后处理,以移除断开的小区域并填充掩码中的小孔。将其设置为 0(默认值)将禁用此后处理。

来源: segment_anything/automatic_mask_generator.py90-92 segment_anything/automatic_mask_generator.py166-171 segment_anything/automatic_mask_generator.py323-372 segment_anything/utils/amg.py267-291

输出格式配置

output_mode 参数决定了输出掩码的格式

  • "binary_mask": 布尔 numpy 数组(默认)
  • "uncompressed_rle": 未压缩格式的游程编码
  • "coco_rle": COCO RLE 格式(需要 pycocotools)

来源: segment_anything/automatic_mask_generator.py92-95 segment_anything/automatic_mask_generator.py174-179

与代码流程集成

下图展示了自定义参数如何影响自动掩码生成流程的不同阶段

来源: segment_anything/automatic_mask_generator.py137-195 segment_anything/automatic_mask_generator.py197-322

常见的定制场景

高质量掩码,用于精度任务

大型图像的内存高效处理

捕捉小物体

实现细节

这些自定义选项的实现可以在以下位置找到:

  1. SamAutomaticMaskGenerator.__init__() - segment_anything/automatic_mask_generator.py36-134
  2. SamAutomaticMaskGenerator.generate() - segment_anything/automatic_mask_generator.py137-195
  3. SamAutomaticMaskGenerator._generate_masks() - segment_anything/automatic_mask_generator.py197-223
  4. SamAutomaticMaskGenerator._process_crop() - segment_anything/automatic_mask_generator.py225-264
  5. SamAutomaticMaskGenerator._process_batch() - segment_anything/automatic_mask_generator.py266-321
  6. SamAutomaticMaskGenerator.postprocess_small_regions() - segment_anything/automatic_mask_generator.py323-372