探索Segment Anything模型:图像分割的新突破
随着现代科技的发展,在日常生活中深度学习技术的应用越来越广泛。其中最具代表性的是目标检测模型。自第一个YOLO模型诞生以来这一技术已经成为了深度学习领域的重要象征。例如YOLOv8这类先进的模
型不仅能够轻易地转换为简单的应用程序还能够满足低代码开发的需求。而最近Meta AI公司在图像分割这一目标检测技术的延伸领域实现了革命性突破推出了Segment Anything这一创新性模
型
Segment Anything模型概述
SegmentAnything模型(SAM)基于输入的提示(例如点或框),能够输出高质量的目标掩码;此外还可以支持为图像中的每一个目标同时生成相应的掩码。经过在包含超过一千万张图像以及一十一亿个掩码的数据集上的训练后,在多种分割任务中展现了卓越的零样本性能;该模型具备识别能力并实现了对图像或视频中新实体的精准分割。
模型工作原理
SAM模型首先将"提示"这一概念从自然语言处理领域延伸至图像分割领域。这些提示可以是单个像素位置、具体的文本描述或边界框等不同形式。对于每一个特定的提示输入,在模型运行后都能生成一个有效的遮蔽掩码。即使在复杂场景下(例如同时包含"衬衫"和"人"两个目标),所得出的结果依然具有意义,并至少能覆盖图像中的某一关键目标。这种经过预先训练的算法设计中巧妙地将"提示"这一工具作为一种通用方法论,在理论上实现了对下游分割任务的零样本迁移能力培养。在实践中,则使得无需人工干预即可从任意一张图片生成相应的遮蔽掩码。
模型架构
SAM模型主要由三个组件组成:
以下是对原文的同义改写版本
模型演示
在Gradient Notebook中使用SAM
使用Gradient Notebook中的SAM工具极为便捷。单击指向"Run on Gradient"链接的箭头,在Gradient Notebook中打开原始仓库。导航至notebook.ipynb文件后运行第一个单元格,并完成必要的软件安装以及将SAM模型检查点下载至本地设备。
!pip install -e .
!wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
完成后,导入所需的包:
import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
然后,在原始演示笔记本中使用代码开发辅助功能模块,并以展示模型预测结果为目的
从图像中的特定点获取掩码
以拍摄的一张包含女人、狗和马坐在草坪上的照片为例,在图像中指定一个标记位置利用numpy.array库进行初始化。该模型将分析并推断出该标记周围所有可能的遮挡对象。
import cv2
import numpy as np
from segment_anything import SamPredictor, sam_model_registry
sam = sam_model_registry["vit_h"](checkpoint="/notebooks/sam_vit_h_4b8939.pth")
predictor = SamPredictor(sam)
image = cv2.imread('/notebooks/39eba0b35fec815252e3f24b3888e118.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
predictor.set_image(image)
input_point = np.array([[500, 375]])
input_label = np.array([1])
masks, scores, logits = predictor.predict(
point_coords=input_point,
point_labels=input_label,
multimask_output=True,
)
完成预测结果后一并展示每个可能的掩码,在每张图像顶部展示其对应的掩码索引与标签及预测准确率分数
从图像中获取所有可能的掩码
有时通过SAM技术获取图像的所有潜在遮罩具有显著的优势。同样可以通过模仿现有的代码实现这一功能,并无需明确指定模型用于目标提取。
from segment_anything import SamAutomaticMaskGenerator, sam_model_registry
import cv2
sam = sam_model_registry["vit_h"](checkpoint="/notebooks/sam_vit_h_4b8939.pth")
mask_generator = SamAutomaticMaskGenerator(sam)
i = cv2.imread('/notebooks/39eba0b35fec815252e3f24b3888e118.jpg')
masks = mask_generator.generate(i)
生成所有可能的遮罩后, 通过调用show_mask函数将每个遮罩叠加至原始图像. 观察到, 每个主要物体均被成功分离并在其对应的遮罩层上覆盖. 其中像狗耳朵这样的部位能够被单独标注出来.
集成SAM与Dolly和GroundingDINO
该名为Grounded Segment Anything的项目致力于将SAM、GroundingDINO模型以及包括Stable Diffusion、Whisper等在内的多种生成输入渠道进行整合融合,并将其重点聚焦于实现文本输入与Segment Anything框架的有效结合以创新性地构建一种替代的传统监督图像分割方法。基于这一思路的基础上开发出了SAM - Dolly - AutoLabeler.py应用程序该程序通过融合开源大语言模型Dolly及其优化库Gradient实现了高效的自动化标签生成功能。
运行自动标注器
为了启动自动标注器应用,请在Gradient Notebook中创建仓库。为确保Sam SAM和Dolly在推理过程中高效运行,请至少预留16GB的显存空间。启动AutoLabel - Notebook - Launcher.ipynb文件后,请立即执行第一个单元格命令。安装并下载GroundingDINO及SAM所需的所有模型文件包。
!wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
!wget https://github.com/IDEA - Research/GroundingDINO/releases/download/v0.1.0 - alpha/groundingdino_swint_ogc.pth
安装一些后续解析文本输出所需的NLTK包:
import nltk
nltk.download('punkt')
nltk.download('brown')
nltk.download('averaged_perceptron_tagger')
最后,执行以下代码启动应用程序:
!python SAM - Dolly - AutoLabeler.py --share
自动标记工具能够接收并上传一张或多张图片。用户可在下方字段中通过分号分隔的形式列出所需目标标签,并为数据集命名。当预测完成时,在界面上展示带有边界框和分割掩码的标注图谱库。点击任意一张图可查看对应的元数据信息以及仅显示分割掩膜的图块。此系统特别为企业提供了强有力的支持方案:通过自动化流程即可轻松生成成百上千个对象标签。这可能有助于完成目标检测任务所需的数据准备工作节省数千小时的时间
总结与展望
该模型在目标检测与图像分割技术领域展现出显著的进步。
