SAM3+点云 机械臂3d抓取方案(一、环境部署)
大家好!我是小亦,我们一起来从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/
避免有同学找不到,我给出最终链接
这里我们选择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+点云的具体处理,敬请期待!!
更多推荐


所有评论(0)