图像分割模型:Meta AI的Segment Anything Model (SAM)

在这篇全面的教程中,将深入了解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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485