在这篇全面的教程中,将深入了解Segment Anything Model (SAM),这是Meta AI开发的一种用于图像分割的高效模型。SAM能够在超过1亿个掩码的1100万个授权和尊重隐私的图像上实现零样本性能,通常与或优于以往的全监督结果。若要了解SAM的工作原理和模型架构,请阅读技术深度解析。
在这篇书面教程(以及下面的视频中),将探讨如何使用SAM自动生成掩码,使用边界框创建分割掩码,以及将目标检测数据集转换为分割掩码。如果有兴趣使用SAM为计算机视觉标记数据,Roboflow Annotate利用SAM在浏览器中提供自动化多边形标记,可以免费尝试。
2024年7月29日,Meta AI发布了Segment Anything 2(SAM 2),这是一个新的图像和视频分割基础模型。根据Meta的说法,SAM 2在图像分割任务中的准确性是原始SAM模型的6倍。
什么是Segment Anything (SAM)?
Segment Anything (SAM)是由Meta AI开发的图像分割模型。该模型可以识别图像中特定对象的精确位置或图像中的每个对象。SAM于2023年4月发布,并且是开源的,发布在Apache 2.0许可下。
在目标检测任务中,对象由边界框表示,就像在对象周围画一个矩形。这些矩形给出了对象位置的大致概念,但它们并不显示对象的确切形状。它们可能还包括矩形内的背景或其他对象的一部分,使得将对象与其周围环境分离变得困难。
另一方面,分割掩码就像在对象周围画一个详细的轮廓,遵循其确切的形状。这允许更精确地理解对象的形状、大小和位置。
在本地机器上使用Segment Anything的步骤
要使用Segment Anything,将遵循以下步骤:设置Python环境、加载Segment Anything Model (SAM)、使用SAM自动生成掩码、使用Supervision将掩码绘制到图像上、从SAM结果生成边界框。
2023年7月,一个独立的研究团队发布了FastSAM,它在Segment Anything SA1-B数据集的2%上进行了训练。虽然不如SAM准确,但FastSAM比SAM快得多。阅读FastSAM模型分析。
设置Python环境
要开始,请在Google Colab中打开Roboflow笔记本,并确保有GPU访问权限以加快处理速度。接下来,安装所需的项目依赖项并下载必要的文件,包括SAM权重。
pip install 'git+https://github.com/facebookresearch/segment-anything.git'
pip install -q roboflow supervision
wget -q 'https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth'
加载Segment Anything Model
一旦环境设置完成,将SAM模型加载到内存中。有多种推理模式可供选择,可以使用该模型以各种方式生成掩码。将探索自动掩码生成、使用边界框生成分割掩码,以及将目标检测数据集转换为分割掩码。
import torch
from segment_anything import sam_model_registry
DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
MODEL_TYPE = "vit_h"
sam = sam_model_registry[MODEL_TYPE](checkpoint=CHECKPOINT_PATH)
sam.to(device=DEVICE)
使用SAM自动生成掩码(实例分割)
要自动生成掩码,请使用SamAutomaticMaskGenerator。此实用程序生成描述各个分割的字典列表。结果列表中的每个字典具有以下格式:
segmentation - [np.ndarray] - 具有(W, H)形状的掩码,bool类型,其中W和H分别是原始图像的宽度和高度
area - [int] - 掩码的像素面积
bbox - [List[int]] - xywh格式的边界框检测
predicted_iou - [float] - 模型对掩码质量的预测
point_coords - [List[List[float]]] - 生成此掩码的采样输入点
stability_score - [float] - 掩码质量的额外度量
crop_box - List[int] - 在xywh格式下用于生成此掩码的图像裁剪框
要运行以下代码,将需要图像。可以使用自己的图像,从Roboflow程序化地获取它们,或下载Roboflow Universe上提供的超过200k数据集中的一个。
import cv2
from segment_anything import SamAutomaticMaskGenerator
mask_generator = SamAutomaticMaskGenerator(sam)
image_bgr = cv2.imread(IMAGE_PATH)
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
result = mask_generator.generate(image_rgb)
从0.5.0版本开始,supervision包为SAM提供了原生支持,使得在图像上注释分割变得更加容易。
import supervision as sv
mask_annotator = sv.MaskAnnotator(color_map="index")
detections = sv.Detections.from_sam(result)
annotated_image = mask_annotator.annotate(image_bgr, detections)
图:原始图像(左)和分割图像(右)。
使用边界框生成分割掩码
现在知道如何为图像中的所有对象生成掩码,让看看如何使用边界框将SAM集中在图像的特定部分。
要提取与图像特定区域相关的掩码,请导入SamPredictor,并通过掩码预测器的predict方法传递边界框。请注意,掩码预测器的输出格式与自动掩码生成器不同。SAM模型的边界框格式应该是[x_min, y_min, x_max, y_max] np.array的形式。
import cv2
from segment_anything import SamPredictor
mask_predictor = SamPredictor(sam)
image_bgr = cv2.imread(IMAGE_PATH)
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
mask_predictor.set_image(image_rgb)
box = np.array([70, 247, 626, 926])
masks, scores, logits = mask_predictor.predict(box=box, multimask_output=True)
图:原始图像与边界框(左)和分割图像(右)。
将目标检测数据集转换为分割掩码
要将目标检测数据集中的边界框转换为分割掩码,请下载COCO格式的数据集并加载注释到内存中。如果没有这种格式的数据集,Roboflow Universe是寻找和下载数据集的理想之地。现在可以使用SAM模型为每个边界框生成分割掩码。请前往Google Colab,在那里将找到从边界框转换为分割掩码的代码。
大规模部署Segment Anything
可以在自己的硬件上使用Roboflow Inference大规模运行Segment Anything (SAM)。Roboflow Inference是一个推理服务器,通过它可以运行微调模型(例如YOLOv5和YOLOv8)以及基础模型,如SAM和CLIP。
了解如何开始使用Inference Segment Anything快速入门。
Segment Anything Model为图像中的对象分割提供了强大而多功能的解决方案,使能够使用分割掩码增强数据集。凭借其快速的处理速度和多种推理模式,SAM是计算机视觉应用的宝贵工具。要体验使用SAM标记数据,可以使用Roboflow Annotate,它提供了由SAM驱动的自动化多边形注释工具Smart Polygon。
- 什么是Segment Anything Model (SAM)?
- Segment Anything的用例
- 在Roboflow中使用Segment Anything标记数据
- 如何与SAM一起使用Ultralytics YOLOv8