目录
SAM简介
引言: 介绍人工智能(AI)的发展趋势,特别是在图像分割领域。强调基础模型在AI发展中的作用,以及Meta AI开发的SAM模型如何定义这个新的里程碑。
SAM的介绍:
- 背景: 描述SAM的历史和它是如何成为首个广泛适用的图像分割基础模型的。
- 原理: 解释SAM的工作原理,包括它如何接收提示(如点击、边界框、文本等)并生成精确的对象掩码。
- 数据集: 阐述SAM是如何在包含超过11亿掩码的11百万张图像上训练,以实现零样本泛化的。
技术进展:
- 零样本泛化: 讨论SAM在未见过的对象和场景上的性能,强调其在多样化图像领域中的应用潜力。
- 提示式设计: 介绍SAM如何通过不同的提示接口进行交互,为多样化的分割任务提供支持。
- 性能优势: 分析SAM在各种场景下的性能,包括自然图像、农业、制造业等。
应用实例:
- 真实世界挑战: 描述SAM在真实世界条件下的应用,如民用基础设施的缺陷评估和自然环境中的物体跟踪。
- 特殊用例: 探讨SAM在医疗成像、视频目标跟踪和其他领域的潜在用途。
SAM的未来与挑战:
- 跨领域的潜力: 展望SAM在增强现实、虚拟现实、内容创作等领域的应用前景。
- 研究方向: 提出目前SAM面临的挑战和研究社区如何通过改进模型架构和训练方法来克服这些挑战。
- 扩展性: 讨论如何通过组合不同基础模型来构建更加强大和通用的AI系统。
实现方法
本文直接使用的ultralytics框架,直接进行模型下载实现的,这是我个人认为sam实现最简答的一种方法,基本有一定python基础的人直接都可以去实现它。在这里我进做演示和一些思路的说明,仅供参考。如果喜欢希望大家多多支持点赞收藏。
1. 搭建一个python环境:略。
2. 安装ultralytics:安装ultralytics说明,点击跳转。
3. 复制下面这段代码:
from ultralytics import SAM
from matplotlib import pyplot as plt
import numpy as np
import cv2
# 加载sam模型,如果没有这个框架也会自动的为你下载
model = SAM('sam_b.pt')
# 读取一张图片,
orig_img = cv2.imread('test.jpg')
# 使用模型进行推理, 后面save=True的参数可以输出测试分割的图片
results = model(orig_img,save=True)
# 这里是我获取mask编码部分的。 [22] 是你想切取对应mask部分的标签值,想切哪个填哪个
mask = results[0].masks.data[22].cpu().numpy()
# 应用掩码到原始图像
# 如果你想要背景是黑色的
masked_image = np.zeros_like(orig_img)
masked_image[mask] = orig_img[mask]
# 如果你想要背景透明(假设原始图像是RGB格式)
# 创建一个RGBA图像,其中背景是透明的
alpha_channel = np.ones(mask.shape, dtype=orig_img.dtype) * 255 # 创建alpha通道
masked_image_rgba = np.dstack((masked_image, alpha_channel)) # 将alpha通道添加到RGB通道
masked_image_rgba[~mask] = (0, 0, 0, 0) # 将非掩码区域设置为透明
# 保存图片,黑色背景
cv2.imwrite('masked_image_test.jpg', masked_image)
# 如果背景是透明的
cv2.imwrite('masked_image_test.png', masked_image_rgba)
效果如下:
1. 在代码中,保存runs的结果是这样的:
在这里我们可以看到哪个类别是哪个标签,我们记住标签后,在后续的代码中, 填入你想切取的编码。比如我切的是这个女子的脸:
有了这个之后,抠图就变得简简单单,同时如果是想做ui的小伙伴,还可以通过点击(获取鼠标以及mask所在区域,通过坐标包含的方式对图片进行选择或者多选。然后实现自定义抠图),这样抠图就变得简简单单。