近年来,计算机视觉取得了显着进步,特别是在图像分割和目标检测任务方面。SegmentAnythingModel(SAM)是最近的一项重大突破,这是一种多功能的深度学习模型,旨在有效地从图像和输入提示中预测对象掩码。通过利用强大的编码器和解码器,SAM能够处理范围广泛的分割任务,使其成为研究人员和开发人员等的宝贵工具。
1、SAM简介SAM使用图像编码器(通常是视觉转换器(ViT))来提取图像嵌入,作为掩码预测的基础。该模型还包含一个提示编码器,它对各种类型的输入提示进行编码,例如点坐标、边界框和低分辨率掩码输入。然后将这些编码的提示连同图像嵌入一起输入掩码解码器以生成最终的对象掩码。
上述架构允许在已经编码的图像上进行快速和轻便的提示。
SAM旨在处理各种提示,包括:
Mask:可以提供一个粗糙的、低分辨率的二进制掩码作为初始输入来指导模型。
Point:用户可以输入[x,y]坐标及其类型(前景或背景)以帮助定义对象边界。
Box:可以使用坐标[x1,y1,x2,y2]指定边界框,以告知模型对象的位置和大小。
Text:文本提示也可用于提供额外的上下文或指定感兴趣的对象。
深入研究SAM的架构,我们可以探索其关键组件:
图像编码器:SAM默认的图像编码器是ViT-H,但也可以根据具体要求使用ViT-L或ViT-B。
下采样:为了降低提示二进制掩码的分辨率,采用了一系列卷积层。
提示编码器:位置嵌入用于对各种输入提示进行编码,这有助于告知模型图像中对象的位置和上下文。
Mask解码器:修改后的transformer编码器用作mask解码器,将编码的提示和图像嵌入转换为最终的对象掩码。
有效掩码:对于任何给定的提示,SAM都会生成三个最相关的掩码,为用户提供一系列可供选择的选项。
他们使用focal、dice和IoU损失的加权组合来训练模型。权重分别为20、1、1。
SAM的优势在于它的适应性和灵活性,因为它可以使用不同的提示类型来生成准确的分割掩码。与作为各种自然语言处理应用程序的强大基础的基础语言模型(LLM)非常相似,SAM也为计算机视觉任务提供了坚实的基础。该模型的架构旨在促进下游任务的轻松微调,使其能够针对特定用例或领域进行定制。通过针对特定任务数据微调SAM,开发人员可以增强其性能并确保其满足其应用程序的独特要求。
这种微调能力不仅让SAM在各种场景下都能获得令人印象深刻的性能,而且还促进了更高效的开发过程。以预训练模型为起点,开发人员可以专注于针对他们的特定任务优化模型,而不是从头开始。这种方法不仅节省了时间和资源,而且还利用了预训练模型中编码的广泛知识,从而使系统更加稳健和准确。
2、自然语言提示文本提示与SAM的集成使模型能够执行高度特定和上下文感知的对象分割。通过利用自然语言提示,可以引导SAM根据感兴趣的对象的语义特性、属性或与场景中其他对象的关系来分割感兴趣的对象。
在训练SAM的过程中,使用最大的公开可用的CLIP模型(ViT-L/14@336px)来计算文本和图像嵌入。这些嵌入在用于训练过程之前被归一化。
为了生成训练提示,首先将每个掩码周围的边界框扩展一个范围为1x到2x的随机因子。然后将展开的框裁剪成正方形以保持其纵横比并将大小调整为336×336像素。在将作物送入CLIP图像编码器之前,掩膜外的像素以50%的概率被清零。Maskedattention在编码器的最后一层使用,以确保嵌入集中在对象上,将输出token的注意力限制在mask内的图像位置。输出标记嵌入作为最终提示。在训练过程中,首先提供基于CLIP的提示,然后是迭代点提示以改进预测。
对于推理,未修改的CLIP文本编码器用于为SAM创建提示。该模型依赖于CLIP实现的文本和图像嵌入的对齐,这使得在没有显式文本监督的情况下进行训练,同时仍然使用基于文本的提示进行推理。这种方法允许SAM有效地利用自然语言提示来实现准确和上下文感知的分割结果。
不幸的是,Meta还没有发布带有文本编码器的SAM的权重。
3、lang-segment-anythinglang-segment-anything库结合了GroundingDino和SAM的优势,提供了一种创新的对象检测和分割方法。
最初,GroundingDino执行零样本文本到边界框对象检测,根据自然语言描述有效地识别图像中感兴趣的对象。然后将这些边界框用作SAM模型的输入提示,该模型会为已识别的对象生成精确的分割掩码。
fromPILimportImagefromlang_samimportLangSAMfromlang__imagemodel=LangSAM()image_pil=('./assets/').convert("RGB")text_prompt='car,wheel'masks,boxes,labels,logits=(image_pil,text_prompt)image=draw_image(image_pil,masks,boxes,labels)4、Lightening应用你可以使用LightningAIApp框架快速部署应用程序。我们将使用ServeGradio组件来部署带有UI的模型。可以在此处了解有关ServeGradio的更多信息。
importo_samimportLangSAMfromlang_samimportSAM_MODELSfromlang__imagefromlang__imageclassLitGradio(ServeGradio):inputs=[(choices=list(SAM_()),label="SAMmodel",value="vit_h"),(0,1,value=0.3,label="Boxthreshold"),(0,1,value=0.25,label="Textthreshold"),(type="filepath",label='Image'),(lines=1,label="TextPrompt"),]outputs=[(type="pil",label="OutputImage")]def__init__(self,sam_type="vit_h"):super().__init__()=_type=sam_typedefpredict(self,sam_type,box_threshold,text_threshold,image_path,text_prompt):print("Predicting",sam_type,box_threshold,text_threshold,image_path,text_prompt)ifsam_type!=_type:_sam(sam_type)image_pil=load_image(image_path)masks,boxes,phrases,logits=(image_pil,text_prompt,box_threshold,text_threshold)labels=[f"{phrase}{logit:.2f}"forphrase,logitinzip(phrases,logits)]image_array=(image_pil)image=draw_image(image_array,masks,boxes,labels)image=((image)).convert("RGB")returnimagedefbuild_model(self,sam_type="vit_h"):model=LangSAM(sam_type)=Truereturnmodelapp=(LitGradio())就这样,应用程序在浏览器中启动了!
5、结论这就是我们对SegmentAnythingModel的介绍。很明显,SAM是计算机视觉研究人员和开发人员的宝贵工具,它能够处理各种分割任务并适应不同的提示类型。它的架构易于实施,使其具有足够的通用性,可以针对特定的用例和领域进行定制。总体而言,SAM已迅速成为机器学习社区的重要资产,并且肯定会继续在该领域掀起波澜。





