本页详细介绍了 Segment Anything Model (SAM) 中的图像处理管道,说明了输入图像如何被转换、处理并流经模型架构以生成掩模。该管道是确保各种尺寸和格式的图像能够被模型高效处理的关键组成部分。有关整体模型架构的信息,请参阅 SAM 模型架构。
SAM 图像处理管道包含几个关键阶段,用于准备图像进行处理、提取特征以及将结果转换回原始图像空间。理解此管道对于有效使用模型和扩展其功能至关重要。
来源: segment_anything/predictor.py34-90 segment_anything/utils/transforms.py16-102
管道的第一步是将输入图像转换为适合模型的格式。这由 ResizeLongestSide 类处理,该类在保持纵横比的同时将图像缩放到其最长维度的目标长度。
来源: segment_anything/utils/transforms.py16-102
ResizeLongestSide 类提供了以下方法:
此变换至关重要,因为:
来源: segment_anything/predictor.py34-62 segment_anything/utils/transforms.py26-32
SamPredictor.set_image() 中的变换过程包括:
ResizeLongestSide.apply_image() 缩放图像图像经过正确变换后,会通过模型的预处理函数并进入图像编码器以提取图像嵌入。
来源: segment_anything/predictor.py62-90
特征提取过程
preprocess 方法处理SamPredictor 实例中此步骤每张图像只执行一次,允许高效地处理多个提示,而无需重新编码图像。
当 SAM 与交互式提示(点、框或掩模)一起使用时,这些提示必须转换为与缩放后的图像空间匹配。
来源: segment_anything/predictor.py136-152 segment_anything/utils/transforms.py33-53
提示变换
ResizeLongestSide.apply_coords() 进行变换ResizeLongestSide.apply_boxes() 进行变换这确保了在原始图像坐标空间中提供的提示能够与从缩放图像中提取的特征正确对齐。
在图像编码和提示变换后,模型会预测掩模,然后将这些掩模放大到原始图像尺寸。
来源: segment_anything/predictor.py168-243
掩模预测过程
postprocess_masks 方法放大到原始图像大小return_logits=True)放大过程考虑了模型内部分辨率、变换后的输入尺寸和原始图像尺寸之间的缩放因子。
下图说明了通过图像处理管道的完整数据流
来源: segment_anything/predictor.py34-243
管道会仔细跟踪三种不同的图像大小:
这些尺寸用于确保输入和输出的正确缩放。
SAM 期望图像采用 BCHW 格式(批次、通道、高度、宽度),这与常用的图像 HWC 格式不同。管道处理了此转换
Input: HWC format (numpy array)
↓ transform.apply_image()
Resized: HWC format (numpy array)
↓ torch.as_tensor()
Tensor: HWC format (torch tensor)
↓ permute(2, 0, 1).contiguous()[None, :, :, :]
Output: BCHW format (torch tensor)
来源: segment_anything/predictor.py55-60
管道中的一项关键优化是缓存图像嵌入。这使得:
这是通过 set_image() 和 set_torch_image() 方法实现的,这些方法将嵌入存储在 self.features 属性中。
来源: segment_anything/predictor.py34-90 segment_anything/predictor.py245-256
图像处理管道的主要接口是 SamPredictor 类,它提供了以下关键方法:
| 方法 | 目的 |
|---|---|
set_image(image, image_format) | 处理图像并计算嵌入 |
set_torch_image(transformed_image, original_image_size) | 设置已转换的图像 |
predict(point_coords, point_labels, box, mask_input, ...) | 从提示预测掩模 |
get_image_embedding() | 返回存储的图像嵌入 |
reset_image() | 清除当前设置的图像 |
来源: segment_anything/predictor.py17-268
这些方法封装了图像处理管道的各个阶段,为在应用程序中使用 SAM 提供了清晰的接口。