大家好!我是小亦,我们一起来从0到1实现" SAM3+点云 "模式的机械臂3d抓取项目

说到SAM3,由于小亦之前使用的都是sam和sam2,还是第一次使用sam3,其中也踩了不少坑,由于网上的文章概论较多,适用性宽泛,为了避免有相同情况的同学一时无奈找不到解决办法,所以小亦这边会把每一步的步骤都详细说明,那么我们话不多说,开始实操。

环境部署

首先,小亦这里强调一点,我这边使用的配置为RTX 50系的显卡,与40系显卡存在一些差异,具体差异在于后文,请耐心观看。

conda环境

说到配置编译环境,我们优先选择虚拟环境,接下来跟着我的步骤开始配置conda环境

anaconda下载官网:https://www.anaconda.com/download

这里小亦使用的是Miniconda,更轻量,对于一般的开发工作已经完全够用,访问下载官网,我们无需注册账号,网页拉到最下可以看到有个Miniconda Installer,我们点击进去

在这里我们选择Miniconda即可,随后便开始自动下载

下载完成后,我们开始安装Miniconda,由于小亦已经安装完成,就不多赘述了(PS:根据默认的选项一直点Next即可,安装的位置大家可以自行选择),安装完成后我们点击Win键搜索anaconda,可以看到有Prompt,我们点击进去,开始正式启动环境的配置

创建自己的虚拟环境

小亦这里使用的是python 3.10的版本,建议大家选择python 3.9+版本

conda create -n xiaoy python=3.10

安装完成后,提示激活环境

我们输入提示指令

conda activate xiaoy

可以看到conda环境已从base环境变换到了我们刚刚自己自定义创建的环境

Pip换源方法

那么接下来我们可以开始pip安装自此项目所需要的库了,那么再此之前,小亦再多补充一点关于pip换源的方法,这里以Windows系统为例:

方案一、

我们在自己minicodna的安装目录下(通常在C盘 C:\Users\xxx)xxx为自己的用户名,如小亦的是16095,找到该目录,在目录下方创建pip文件夹,在pip文件夹下创建pip.txt文件,输入以下内容

[global]

index-url = https://mirrors.aliyunc.com/pypi/simple

[install]

trusted-host = mirrors.aliyun.com

​

输入完成后保存,找到文件扩展名,将txt改为ini文件格式即可,随后我们重新打开Anaconda Prompt即可使用国内源进行下载。

方案二、

如果我们懒得这样操作,我们可以直接选择在Anaconda Prompt中直接以命令行的形式执行

pip config set global.index-url http://mirrors.aliyun.com/pypi/simple

pip config set install.trusted-host mirrors.aliyun.com

我们测试一下结果,以numpy为例进行pip安装,发现已经使用上了国内源阿里云进行下载

SAM3库安装

我们优先安装CUDA,这里就要提到刚刚文章开头为何50系显卡与40系有区分的点了,在50系显卡中,由于我们cuda的版本过高,选择常规的cuda12.1/12.4等版本不适用。那么该如何处理呢?

我们首先进入Pytorch官网

Pytorch官网:https://pytorch.org/

避免有同学找不到,我给出最终链接

Pytorch下载链接:https://pytorch.org/get-started/locally/?_gl=1*135ctsj*_up*MQ..*_ga*MjAxNjEyODQ1NS4xNzc0ODUwMTYz*_ga_469Y0W5V62*czE3NzQ4NTAxNjIkbzEkZzAkdDE3NzQ4NTAxNjIkajYwJGwwJGgw

这里我们选择Nightly版本,根据自己显卡的cuda版本进行安装,下方有对应的Command,我们可以直接复制过来,在我们的虚拟环境中进行安装。

那么如果我们使用的不是50系显卡的话,我们可以上官网的链接进行下载

Pytorch文件下载链接:https://download.pytorch.org/whl/torch/

在这里通过Ctrl+F查询的方式,查找对应python版本的torch文件以及torchvision,torchaudio文件,下载后的whl文件,我们依旧使用pip的方式,cd进入下载目录pip install即可

我们可以通过以下的示例代码来查看cuda是否满足

import torch

# 1. 检查版本
print(f"PyTorch 版本: {torch.__version__}")
print(f"CUDA 版本: {torch.version.cuda}")

# 2. 检查支持的架构 (关键!)
print(f"支持的架构: {torch.cuda.get_arch_list()}")

# 3. 检查 GPU 是否可用
print(f"GPU 可用: {torch.cuda.is_available()}")
print(f"GPU 名称: {torch.cuda.get_device_name(0)}")

# 4. 简单计算测试
x = torch.randn(1000, 1000).cuda()
y = x @ x
print(f"计算测试通过! 结果形状: {y.shape}")

输出以下结果则cuda正常,并且解决了50系显卡的编译问题

安装好torch后,我们开始补充安装一些依赖库

pip install Ultralytics==8.4.24 (为什么指定版本后面会提到)
pip install opencv-python
pip install opencv-contrib-python
pip install open3d
pip install pyrealsense2 (如果使用的是realsense相机的话)
pip install flask (代码中会用到flask服务)
pip install open_clip_torch==2.20.0

在这里给大家提一个醒,我们还缺少一个clip库,但是我们不能直接使用pip install clip,安装clip的两种方案提供给大家,这里需要实现科学上网的前提,相信干这一行的这应该没有问题。

方案一、

登录github官网找到clip的zip包进行安装

clip链接:https://github.com/ultralytics/clip

下载完成CLIP-Main.zip后,我们使用Anaconda Prompt,cd进入到downloads文件夹下,对zip压缩包进行解压,然后pip install -r requirements.txt,这样就能顺利完成clip的安装。

那么到了这一步,我们基本的环境就算完成了,有些开发者可能用过yolo目标检测提前安装好了Ultralytics,这时候会发现在导入SAM3模型进行推理的时候,出现了以下问题:

TypeError: 'SimpleTokenizer' object is not callable

这就是因为clip和Ultralytics的版本需要匹配的原因,这就是为什么建议大家安装8.4.24版本的原因

接下来我们就可以使用示例代码,导入SAM3模型,对图片或者视频进行语义分割,查看一下sam分割的特点,这里小亦给出自己测试使用的代码,仅供参考。

test_sam3_image.py

from ultralytics.models.sam import SAM3SemanticPredictor
import cv2
overrides = dict(model="C:\\Users\\16095\PycharmProjects\Grasp_Anything\models\sam3.pt", half=True, conf=0.01)
predictor = SAM3SemanticPredictor(overrides=overrides)
img = cv2.imread("test_image6.jpg")
predictor.set_image(img)
results = predictor(text=["objects"])
print("成功!检测到", len(results[0].masks) if results else 0, "个掩码")
test_sam3_video.py


from ultralytics.models.sam import SAM3SemanticPredictor
import pyrealsense2 as rs
import numpy as np
import cv2

# ======================
# 1. 初始化 SAM3
# ======================
overrides = dict(
    model=r"C:\Users\16095\PycharmProjects\Grasp_Anything\models\sam3.pt",
    half=True,
    conf=0.04
)

predictor = SAM3SemanticPredictor(overrides=overrides)

# ======================
# 2. 初始化 RealSense
# ======================
pipeline = rs.pipeline()
config = rs.config()

config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
# 如果后面要用深度可以打开
# config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

pipeline.start(config)

print("按 q 退出")

try:
    while True:
        # ======================
        # 3. 获取帧
        # ======================
        frames = pipeline.wait_for_frames()
        color_frame = frames.get_color_frame()

        if not color_frame:
            continue

        frame = np.asanyarray(color_frame.get_data())

        # ======================
        # 4. SAM3 推理
        # ======================
        predictor.set_image(frame)
        results = predictor(text=["objects"])

        # ======================
        # 5. 可视化分割结果
        # ======================
        if results and results[0].masks is not None:
            masks = results[0].masks.data.cpu().numpy()

            overlay = frame.copy()

            for mask in masks:
                mask_bool = mask.astype(bool)

                # 上色
                overlay[mask_bool] = [0, 255, 0]

                # 轮廓
                mask_uint8 = (mask * 255).astype("uint8")
                contours, _ = cv2.findContours(
                    mask_uint8,
                    cv2.RETR_EXTERNAL,
                    cv2.CHAIN_APPROX_SIMPLE
                )
                cv2.drawContours(frame, contours, -1, (0, 0, 255), 2)

            # 融合显示
            frame = cv2.addWeighted(frame, 0.7, overlay, 0.3, 0)

        # ======================
        # 6. 显示
        # ======================
        cv2.imshow("RealSense + SAM3", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

finally:
    pipeline.stop()
    cv2.destroyAllWindows()

下一章我们将开始写相机的服务端,其中就涉及到了SAM3+点云的具体处理,敬请期待!!

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐