Meta公司开源大数据模型SAM实战演练

当前,许多强大的开源基础模型的发布,加上微调技术的不断进步,已经带来了机器学习和人工智能的新范式。整体来看,这场革命的核心在于转换器模型(https://arxiv.org/pdf/1706.03762)。

虽然除了资金充足的公司之外,所有公司都曾经无法获得高精度的特定领域模型;但是如今,基础模型范式甚至能够允许学生或独立研究人员获得适度的资源,以实现与最先进的专有模型相抗衡的结果。

微调技术可以极大地提高模型任务的性能

本文旨在探讨Meta公司的分割一切模型(SAM:Segment Anything Model)在河流像素分割遥感任务中的应用。如果您想直接跳到有关项目代码,那么这个项目的源文件可以在GitHub(https://github.com/geo-smart/water-surf/blob/main/book/chapters/masking_distributed.ipynb)上获得,数据也可以在HuggingFace(https://huggingface.co/datasets/stodoran/elwha-segmentation-v1)上找到。当然,我还是建议您先阅读一下本文。

项目需求

第一个任务是找到或创建一个合适的数据集。根据现有文献,一个良好的SAM微调数据集将至少包含200–800张图像。过去十年深度学习进步的一个关键教训是,数据越多越好,这样一来,更大规模的微调数据集就不会出错。然而,基础模型研究的一个重要目标是,允许即使是相对较小的数据集也足以实现强大的性能。

此外,我们还需要有一个HuggingFace帐户,这可以在链接https://huggingface.co/join处创建。使用HuggingFace,我们可以随时从任何设备轻松存储和获取数据集,这使得协作和再现性更加容易。

最后一个需求是,具备一台带有GPU的设备,我们可以在其上运行训练工作流程。通过Google Colab(https://colab.research.google.com/)免费提供的Nvidia T4 GPU足够强大,可以在12小时内对1000张图像进行50个时期的最大SAM模型检查点(sam-vit-huge)训练。

为了避免在托管运行时因使用限制而影响进度,您可以安装Google Drive并将每个模型检查点保存在那里。或者,部署并连接到GCP虚拟机(https://console.cloud.google.com/marketplace/product/colab-marketplace-image-public/colab)以完全绕过限制。如果您以前从未使用过GCP,那么您就有资格获得300美元的免费信贷,这足以支持对模型进行至少十几次的训练了。

理解SAM架构

在开始训练之前,我们需要先来了解一下SAM模型的架构。该模型包含三个组件:一个是从稍经修改的掩码自动编码器(https://arxiv.org/pdf/2111.06377)得到的图像编码器,一个能够处理各种提示类型的相当灵活的提示编码器,还有一个快速轻量级的掩码解码器。这种设计架构背后的一个重要动机是允许在边缘设备上(例如在浏览器中)进行快速、实时的分割,因为图像嵌入只需要计算一次,并且掩码解码器可以在CPU上运行约50ms。

SAM的模型架构向我们展示了模型接受哪些输入以及需要训练模型的哪些部分(图片来源于SAM GitHub:https://github.com/facebookresearch/segment-anything)。

理论上,图像编码器已经学会了嵌入图像的最佳方式,包括识别形状、边缘和其他一般视觉特征等。类似地,在理论上,提示编码器已经能够以最优方式对提示进行编码。掩码解码器是模型架构的一部分,它采用这些图像和提示嵌入,并通过对图像和提示嵌入式进行操作来实际创建掩码。

因此,一种方法是在训练期间冻结与图像和提示编码器相关联的模型参数,并且仅更新掩码解码器权重。这种方法的优点是允许有监督和无监督的下游任务,因为控制点和边界框提示都是自动的,并且可供人工使用。

### 对SAM模型进行微调的方法 SAM(Segment Anything Model)是一种由Meta开发的通用分割模型,能够生成高质量的对象掩码[^1]。为了适应特定任务或领域的需求,通常需要对其进行微调。以下是关于如何对SAM模型进行微调的关键步骤: #### 数据准备 在微调过程中,数据的质量至关重要。对于SAM模型而言,输入的数据应包括图像及其对应的标注掩码。这些掩码可以手动创建或者通过其他自动化工具生成。 #### 预处理阶段 SAM提供了专门的功能来帮助用户完成数据的预处理工作。例如,在加载原始图片之后,可以通过`preprocess()`函数调整尺寸并标准化像素值范围以便于后续计算操作更加高效稳定。 #### 微调策略 当涉及到具体实现层面时,则可能需要用到PyTorch框架下的优化算法如AdamW等设置学习率调度器以及定义损失函数等内容。此外还需要注意保存最佳权重文件以供测试部署使用[^2]。 #### 后处理部分 经过训练后的预测结果往往还需经历一系列转换才能满足实际应用场景的要求。此时可利用SAM内置的相关方法比如`postprocess_masks()`来进行必要的修正从而获得最终输出形式。 ```python from segment_anything import sam_model_registry, SamPredictor def load_sam_checkpoint(model_type="default"): device = "cuda" if torch.cuda.is_available() else "cpu" sam = sam_model_registry[model_type](checkpoint="path/to/checkpoint").to(device) predictor = SamPredictor(sam) return predictor predictor = load_sam_checkpoint() image = cv2.imread('example.jpg') predictor.set_image(image) masks, scores, logits = predictor.predict( point_coords=None, point_labels=None, box=None, multimask_output=True, ) ``` 上述代码片段展示了如何加载已有的SAM checkpoint,并基于给定输入执行推理过程得到多个候选mask选项连同各自置信度得分一起返回出来便于进一步筛选决定哪一个最为合适当前目标对象轮廓描绘需求所用到的具体参数可以根据实际情况灵活设定修改即可达到理想效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c++服务器开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值