**

环境要求

**

  • NVIDIA 独显(AMD/核显无解)
  • CUDA ≥ 12.6(强烈建议更新到最新显卡驱动,作者是12.8,可用)
  • 已安装 Conda(Anaconda )
  • python指定的是3.12,但作者的是3.10,一样可以用
conda create -n sam3 python=3.12 -y
conda activate sam3

# 安装CUDA12.6,官方指定,但是作者的RTX 5060 Ti会报错不兼容,因为这个GPU比较新
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126

但是作者的RTX 5060 Ti会报错不兼容,因为这个GPU比较新,下面命令可安装CUDA12.8,可解决标题的不兼容问题

pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu128
# 以下是作者的环境
# PyTorch版本:2.9.1+cu128
#CUDA可用:True
#CUDA编译版本:12.8
#GPU名称:NVIDIA GeForce RTX 5060 Ti

下载源码,也可以直接clone,老实的小伙子访问不了github的话去了解一下“魔法”或者“梯子”

github地址:https://github.com/facebookresearch/sam3

进入项目目录,安装核心依赖

cd path\to\sam3-main
pip install -e .

安装完毕之后还是会少了很多包,一个一个点击pip安装就行,但是有一个例外

Windows 下缺少 triton 包,无法直接点击安装,执行下面命令就可解决

内容参考SAM3部署windwos,里面也有测试代码

pip install triton-windows==3.3.0.post19

上面超链接文章提供了检查点下载,但是是去bilibili感觉会很麻烦,这边我提供了魔塔modelscope的下载链接,我觉得很方便直接下载,也不需要懒人兄弟人去动脑子

直接执行下面代码就可以下载

pip install modelscope
# 下载到当前目录, ./总知道吧,也可以修改的,就是在./后面接上文件夹名,或者直接替换为绝对路径
modelscope download --model Fingsinz/sam3 sam.pt --local_dir ./

# 如果不想下载到当前目录,可指定 ./weights文件中
modelscope download --model Fingsinz/sam3 sam.pt --local_dir ./weights

下面是作者的代码,可视化是自己实现的,可以删除,只需要修改对应的文件路径就行了

import cv2
import numpy as np
import matplotlib.pyplot as plt
import torch
from sam3.model.sam3_image_processor import Sam3Processor
from torchvision import transforms
from PIL import Image
import sys
import os

# 添加项目根目录到Python路径
sys.path.append(r"C:\Users\HYKG03\PycharmProjects\ultralytics\sam3Dir")

# 导入SAM3模型构建函数
from sam3.model_builder import build_sam3_image_model


def visualize_results(image, masks, boxes, scores, threshold=0.5):
    """
    可视化SAM3模型的分割结果

    Args:
        image: 原始PIL图像
        masks: 模型输出的掩码,形状为 [N, H, W],N为检测到的实例数
        boxes: 模型输出的边界框,形状为 [N, 4],格式为 [x1, y1, x2, y2]
        scores: 模型输出的置信度分数,形状为 [N]
        threshold: 置信度阈值,只可视化分数大于该值的结果
    """
    # 将PIL图像转换为numpy数组
    image_np = np.array(image)

    # 创建可视化图像副本
    visualization = image_np.copy()

    # 获取图像尺寸
    height, width = image_np.shape[:2]

    # 定义颜色列表,用于区分不同实例
    # 注意:对于图像操作使用0-255范围,对于matplotlib操作使用0-1范围
    colors_255 = [
        (255, 0, 0),  # 红色
        (0, 255, 0),  # 绿色
        (0, 0, 255),  # 蓝色
        (255, 255, 0),  # 黄色
        (255, 0, 255),  # 紫色
        (0, 255, 255),  # 青色
        (128, 0, 0),  # 深红色
        (0, 128, 0),  # 深绿色
        (0, 0, 128),  # 深蓝色
        (128, 128, 0)  # 深黄色
    ]

    # 转换为matplotlib使用的0-1范围颜色
    colors_1 = [(r / 255, g / 255, b / 255) for r, g, b in colors_255]

    # 1. 首先创建图形和轴(关键修复:避免自动创建默认图形)
    fig, ax = plt.subplots(figsize=(12, 8))

    # 遍历所有检测结果
    for i in range(len(scores)):
        if scores[i] < threshold:
            continue

        # 获取当前实例的掩码、边界框和分数
        mask = masks[i]
        box = boxes[i]
        score = scores[i]

        # 选择颜色
        color_255 = colors_255[i % len(colors_255)]
        color_1 = colors_1[i % len(colors_1)]

        # 将掩码转换为numpy数组并缩放到图像尺寸
        mask_np = mask.squeeze().cpu().numpy()

        # 确保掩码是2D的
        if mask_np.ndim == 3:
            mask_np = mask_np[0]

        # 将掩码应用到可视化图像上(半透明叠加)
        mask_3d = np.stack([mask_np] * 3, axis=-1)
        visualization = visualization * (1 - mask_3d * 0.5) + np.array(color_255) * (mask_3d * 0.5)
        visualization = visualization.astype(np.uint8)

        # 绘制边界框 - 使用ax而不是plt.gca()
        x1, y1, x2, y2 = box.cpu().numpy().astype(int)
        ax.add_patch(plt.Rectangle((x1, y1), x2 - x1, y2 - y1,
                                   fill=False, edgecolor=color_1, linewidth=2))

        # 绘制置信度分数 - 使用ax而不是plt
        ax.text(x1, y1 - 10, f"Score: {score:.3f}",
                color=color_1, fontsize=10, fontweight='bold')

    # 显示可视化结果 - 使用ax而不是plt
    ax.imshow(visualization)
    ax.axis('off')
    ax.set_title('SAM 3 Segmentation Results')
    plt.tight_layout()
    plt.show()

# =================================主要代码就是下面,可视化可要可不要====================
# 加载模型,只需要修改checkpoint_path为你的sam.pt权重文件路径
model = build_sam3_image_model(
    bpe_path=f"./sam3/assets/bpe_simple_vocab_16e6.txt.gz",
    checkpoint_path=r'C:\Users\HYKG03\PycharmProjects\ultralytics\weights\sam3.pt',
    device="cuda"
)

processor = Sam3Processor(model)

# 加载图像
image = Image.open(r"C:\Users\HYKG03\Desktop\tif2.jpeg")
inference_state = processor.set_image(image)

# 使用文本prompt提示模型
output = processor.set_text_prompt(state=inference_state, prompt="tin-roofed house")

# 获取掩码、边界框和分数
masks, boxes, scores = output["masks"], output["boxes"], output["scores"]

# 可视化结果(阈值设为0.3,可根据需要调整)
visualize_results(image, masks, boxes, scores, threshold=0.3)

有一个pkg_resources导包警告,不影响执行我没就没管,最后,给张结果图吧,分割效果还是很不错的

**

弄了一天多,有帮助的话点个赞呗收藏一下呗哈哈哈哈哈哈哈

**

分割效果还是很不错的

更多推荐