大数跨境
0
0

【SAM3教程-1】SAM3 使用文本提示进行图像分割详细步骤与示例【附源码】

【SAM3教程-1】SAM3 使用文本提示进行图像分割详细步骤与示例【附源码】 阿旭算法与机器学习
2025-12-02
26
导读:【SAM3教程-1】SAM3 使用文本提示进行图像分割详细步骤与示例【附源码】

公众号

小伙伴们好,我是阿旭。专注于人工智能、计算机视觉领域相关分享研究。【目标检测、图像分类、图像分割、目标跟踪等项目都可做,也可做不同模型对比实验;需要的可联系(备注来意)。

------------


AI用系统战项目

1.人脸识别与管理系统 2.车牌识别与管理系统
3.手势识别系统 4.人脸面部活体检测
5.YOLOv8自动标注 6.人脸表情识别系统
7.行人跌倒检测系统 8.PCB板缺陷检测
9.安全帽检测系统 10.生活垃圾分类检测
11.火焰烟雾检测系统 12.路面坑洞检测系统
13.钢材表面缺陷检测 14.102种犬类检测系统
15.面部口罩检测系统 16.西红柿成熟度检测
17.血细胞检测计数 18.舰船分类检测系统
19.吸烟行为检测 20.水稻害虫检测识别
21.车辆行人检测计数 22.小麦害虫检测识别
23.玉米害虫检测识别 24.200种鸟类检测识别
25.交通标志检测识别 26.苹果病害识别
27.肺炎诊断系统‍‍ 28.100种中草药识别
29.102种花卉识别 30.100种蝴蝶识别
31.车辆行人追踪系统 32.水稻病害识别
33.车牌检测识别系统 34.草莓病害检测分割
35.复杂环境船舶检测 36.裂缝检测分析系统
37.田间杂草检测系统 38.葡萄病害识别
39.路面坑洞检测分割 40.遥感地面物体检测
41.无人机视角检测 42.木薯病害识别预防
43.野火烟雾检测 44.脑肿瘤检测‍‍
45.玉米病害检测 46.橙子病害识别
47.车辆追踪计数 48.行人追踪计数
49.反光衣检测预警 50.人员闯入报警
51.高密度人脸检测 52.肾结石检测
53.水果检测识别 54.蔬菜检测识别
55.水果质量检测 56.非机动车头盔检测
57.螺栓螺母检测
58.焊缝缺陷检测
59.金属品瑕疵检测 60.链条缺陷检测
61.条形码检测识别 62.交通信号灯检测
63.草莓成熟度检测 64.水下海生物检测
65.交通事故检测 66.安检危险品检测
67.农作物检测识别 68.危险驾驶行为检测
69.维修工具检测 70.建筑墙面损伤检测
71.煤矿传送带异物检测 72.老鼠智能检测
73.水面垃圾检测 74.遥感视角船只检测
75.胃肠道息肉检测 76.心脏间隔壁分割
77.半导体芯片缺陷检测
78.视网膜疾病诊断
79.运动鞋品牌识别
80.X光骨折检测
81.遥感视角农田分割
82.电瓶车进电梯检测
83.遥感视角房屋分割
84.CT肺结节检测
85.舌苔舌象检测诊断
86.蛀牙检测识别
87.工业压力表智能读数
88.肝脏肿瘤检测分割
89.脑肿瘤检测分割
90.甲状腺结节分割

------------

引言

SAM3视觉大模型支持以文本提示的方式进行图片与视频中的目标分割,同时继承了之前SAM的特点也支持点、框等提示方式进行目标分割。我将以SAM3系列文章的方式详细介绍各种使用方法以及示例。感兴趣的小伙伴可以关注一下后续更新。

本文将详细介绍如何使用 SAM3 模型通过文本提示来分割图像中的目标物体,包括主要步骤和核心代码实现。

主要流程

SAM3 的文本提示分割图像目标主要包括以下几个关键步骤:

  1. 模型初始化与配置
  2. 图像预处理
  3. 文本提示设置
  4. 模型推理
  5. 结果后处理与可视化

步骤详解

1. 模型初始化与配置

首先需要导入库,并加载 SAM3 模型并创建相应的处理器:

import torch
from sam3.model_builder import build_sam3_image_model
from sam3.model.sam3_image_processor import Sam3Processor
import supervision as sv
import matplotlib
matplotlib.use('TkAgg')
from PIL import Image
from typing import Optional

# 设置运行设备
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"

# 初始化图像模型并加载预训练权重
checkpoint_path = "models/sam3.pt"
bpe_path = "assets/bpe_simple_vocab_16e6.txt.gz"
image_model = build_sam3_image_model(
    checkpoint_path=str(checkpoint_path),
    bpe_path=str(bpe_path),
    device=DEVICE
)

# 创建图像处理器实例
image_predictor = Sam3Processor(image_model, device=DEVICE)

这一步完成了模型权重的加载和处理器的初始化,为后续的图像处理做好准备。

2. 图像预处理

在进行模型推理前,需要对输入图像进行适当的预处理:

image_path = "assets/images/test_image.jpg"
image = Image.open(image_path).convert('RGB')
inference_state = image_predictor.set_image(image)
在这里插入图片描述

这里使用 PIL.Image.open() 加载图像,并通过 convert('RGB')确保图像为 RGB 格式,然后调用 Sam3Processor.set_image()方法完成图像的预处理和特征提取。

3. 文本提示设置

设置用于指导分割的文本提示,这里设置的是“穿红衣服的人”

text_prompt = "person in red"
output = image_predictor.set_text_prompt(state=inference_state, prompt=text_prompt)

通过 Sam3Processor.set_text_prompt()方法将文本提示与已处理的图像状态相结合,为模型提供分割指导信息。

4. 结果后处理

将模型输出转换为标准的检测格式并过滤低置信度结果:

detections = from_sam(sam_result=output)
detections = detections[detections.confidence > 0.5]

其中 from_sam()函数负责将原始模型输出转换为 sv.Detections 对象:

def from_sam(sam_result: dict) -> sv.Detections:
    xyxy = sam_result["boxes"].to(torch.float32).cpu().numpy()
    confidence = sam_result["scores"].to(torch.float32).cpu().numpy()
    
    mask = sam_result["masks"].to(torch.bool)
    mask = mask.reshape(mask.shape[0], mask.shape[2], mask.shape[3]).cpu().numpy()
    return sv.Detections(
        xyxy=xyxy,
        confidence=confidence,
        mask=mask
    )

5. 结果可视化

最后将分割结果可视化展示:

annotated_image = annotate(image, detections, label=text_prompt)
annotated_image.show()

annotate()函数利用 supervision 库的功能在原图上绘制分割掩码、边界框和标签:

def annotate(image: Image.Image, detections: sv.Detections, label: Optional[str] = None) -> Image.Image:
    mask_annotator = sv.MaskAnnotator(
        color=COLOR,
        color_lookup=sv.ColorLookup.INDEX,
        opacity=0.6
    )
    box_annotator = sv.BoxAnnotator(
        color=COLOR,
        color_lookup=sv.ColorLookup.INDEX,
        thickness=1
    )
    
    annotated_image = image.copy()
    annotated_image = mask_annotator.annotate(annotated_image, detections)
    annotated_image = box_annotator.annotate(annotated_image, detections)
    if label:
     labels = [
         f"{label} {confidence:.2f}"
         for confidence in detections.confidence
     ]
     annotated_image = label_annotator.annotate(annotated_image, detections, labels)
    
    return annotated_image

可以发现,SAM3很好的根据提示对目标进行分割。

更多示例

示例1

原图:提示文本:person in blue

SAM3分割结果:

示例2

原图:

提示文本1:white egg

SAM3分割结果:提示文本2:brown egg

SAM3分割结果:提示文本3:egg

SAM3分割结果:

在这里插入图片描述

示例3

原图:提示文本:plane

SAM3分割结果:

示例4

原图:提示文本:bird

SAM3分割结果:

总结

SAM3 通过文本提示进行图像分割的流程清晰且高效,主要包括模型初始化、图像预处理、文本提示设置、模型推理和结果可视化等步骤。这种基于文本提示的分割方式大大提升了交互性和实用性,使得用户可以通过简单的文本描述来精确分割感兴趣的图像区域。


在这里插入图片描述

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~ 关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

   

end




python

【声明】内容源于网络
0
0
阿旭算法与机器学习
专注于计算机视觉,AI等技术研究。目标检测,图像分类,图像分割,目标跟踪等项目都可做,咨询加微A_XU_AI
内容 435
粉丝 0
阿旭算法与机器学习 专注于计算机视觉,AI等技术研究。目标检测,图像分类,图像分割,目标跟踪等项目都可做,咨询加微A_XU_AI
总阅读1.0k
粉丝0
内容435