模型详细情况和参数
SAM全称是Segment Anything Model,由MetaAI最新发布的一个图像分割领域的预训练模型。该模型十分强大,并且有类似GPT那种基于Prompt的工作能力,在图像分割任务上展示了强大的能力!此外,该模型从数据集到训练代码和预训练结果完全开源!真Open的AI!
在自然语言处理和最近的计算机视觉领域,基础模型是一个有前途的发展方向,它通常可以通过使用“提示”技术对新的数据集和任务进行零-shot和少量样本学习。但是,这样的工作方式目前很少运用在CV领域。而MetaAI试图提出可提升的分割任务( promptable segmentation)。其目标是在给定任何分割提示的情况下返回一个有效的分割掩码,如下图所示:
提示简单地指定要在图像中分割的内容,例如,提示可以包括标识对象的空间或文本信息。有效输出掩码的要求意味着即使提示是模棱两可的并且可能指代多个对象(例如,衬衫上的一个点可以表示衬衫或穿着衬衫的人),输出也应该至少是这些对象中一个合理的掩码。我们将可提示的分割任务用作预训练目标,并通过提示工程解决通用的下游分割任务。
但是,实现这一任务其实很不容易,对图像分割的模型架构有很多限制。然而,MetaAI发现了一个简单的设计可以满足:
这个方法的核心如上图的Figure 1b所示!通过将SAM分解为一个图像编码器和一个快速提示编码器/掩码解码器,可以重用相同的图像嵌入(并摊销其成本)来处理不同的提示。给定一个图像嵌入,提示编码器和掩码解码器在Web浏览器中从提示中预测出掩码需要约50ms的时间。
SAM在零样本迁移学习中效果十分强大。MetaAI做了5项相关任务的评估,其中4项都是与可提示分割无关的任务。具体的评测任务如下:
以第一个任务为例,SAM显示了强大的效果,在23个数据集上,表现大部分都好于之前的RITM:
其它测试结果大家看原论文。
实验从测试可提示分割的核心目标开始:从任何提示中生成一个有效的掩码。MetaAI强调了单个前景点提示的挑战性场景,因为它比其他更具体的提示更容易产生歧义。接下来,作者展示了一系列实验,跨越了图像理解的低、中、高级别,大致与该领域的历史发展平行。具体来说,提示SAM执行以下任务:(1)执行边缘检测,(2)分割所有物体,即对象建议生成,(3)分割检测到的物体,即实例分割,以及(4)作为概念证明,从自由文本中分割对象。这四个任务与SAM训练时的可提示分割任务有很大的不同,并通过提示工程实现。
SAM完全开源,官方发布了在线演示模型和测试效果。效果十分强大!
从草丛中分割出小狗
下图是我实际测试的结果,把黑色眼睛完整从黑色键盘背景中分割出来了!
实在是太强大了!
官方还有一个演示,与其它系统结合来使用SAM,包括AR/VR眼镜等。效果非常好!
实时检测效果很准确,或许这就是Meta之前全部投入元宇宙的成果之一!
SAM完全开源,这也是继MetaAI贡献的LLaMA之后又一个十分卓越的开源贡献!很快,各种新的分割应用应该就会出现了!
目前,SAM开源了3个模型,即 vit_h、vit_l和vit_b,最后一个是最大的结果!
SAM官方博客地址: https://ai.facebook.com/blog/segment-anything-foundation-model-image-segmentation/
SAMGitHub项目开源地址: https://github.com/facebookresearch/segment-anything
SAM在线演示地址: https://segment-anything.com/demo#
SAM数据集地址: https://segment-anything.com/dataset/index.html
SAM论文地址: https://scontent-sjc3-1.xx.fbcdn.net/v/t39.2365-6/10000000_900554171201033_1602411987825904100_n.pdf
官方完全开源的方式让我们使用SAM非常简单。主要依赖:python>=3.8, pytorch>=1.7以及torchvision>=0.8
首先,直接安装GitHub上提供的包:
pip install git+https://github.com/facebookresearch/segment-anything.git
当然,如果需要使用mask后处理,需要安装如下依赖:
pip install opencv-python pycocotools matplotlib onnxruntime onnx
然后就可以直接在代码中使用,方法如下:
from segment_anything import build_sam, SamPredictor predictor = SamPredictor(build_sam(checkpoint="</path/to/model.pth>")) predictor.set_image(<your_image>) masks, _, _ = predictor.predict(<input_prompts>)
需要注意的是,上面的checkpoint参数里面的pth文件需要大家提前下载好(可选3个任意一个):
ViT-H SAM模型checkpoints: https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
ViT-L SAM模型checkpoints: https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth
ViT-B SAM模型checkpoints: https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth