SAM多目标跟踪与分割SAM-PT论文解读Segment Anything Meets Point Tracking

一、总结

1. 简介

发表时间:2023年12月3日

论文:

[2307.01197] Segment Anything Meets Point Tracking (arxiv.org)https://arxiv.org/abs/2307.01197代码:

SysCV/sam-pt: SAM-PT: Extending SAM to zero-shot video segmentation with point-based tracking. (github.com)https://github.com/SysCV/sam-pt

2. 摘要

        现有的关于视频注释的方法大多数侧重于掩码注释和传播,这大大降低了标注的效率和模型的泛化性。本文提出的SAM-PT是:通过结合SAM的图像分割功能PT的点跟踪功能,引入了一种以点为中心的交互式视频分割方法。它使用稀疏点传播实现了对用户查询点的有效跟踪。与传统的以对象为中心的掩码传播策略相比,本文使用点传播以利用与对象语义无关的局部结构信息。实验结果表明,基于点的分割跟踪器能够实现更好的零样本性能和高效的交互,SAM-PT在视频分割任务中取得了很强的性能,包括半监督、开放世界和全交互式视频分割。虽然我们的方法存在一些局限性,如难以处理遮挡、小物体、运动模糊和掩码预测不一致,但它为视频对象分割研究提供了一个新的视角。

3. 前言

        视频图像分割是自动驾驶、机器人和视频编辑等多个领域应用的核心支柱。近年来,深度学习技术在这些领域都取得了很大进展,但仍存在许多挑战。一是为了实现高精度的分割,这些模型仍需要大量的训练数据、标注数据和昂贵的标签,并且现有的交互式视频分割方法假定视频第一帧给定了某个对象的掩码,但获取准确的掩码耗时耗力;二是目前的主流方法,例如半监督视频对象分割(VOS)和视频实例分割(VIS)在处理未见过的数据时性能会降低。
        由于SAM模型具有强大的零样本泛化能力,同时点跟踪方法(PT)可以将点跨越视频帧进行传播,于是本文将两者结合,提出了SAM-PT方法。SAM-PT只需要在第一帧稀疏地标记点以表示目标对象,同时使用最先进的点跟踪器(如Co-Tracker)预测稀疏点轨迹来作为提示符提示SAM。这样做不仅显著降低了标注成本,同时保证了SAM固有的灵活性,使其能够在视频分割方面以及在零样本设置下取得比以前更好的性能。

4. 贡献

(1)本文是首个将稀疏点跟踪(PTSAM结合用于视频分割的方法,为交互式视频分割同时实现了领域泛化能力和标记效率。
(2)为了细化输出掩码,提出了多种掩码解码过程。
(3)设计了一种点二重初始化策略,模型可以随着时间推移提高跟踪精度。
(4)使用了多种设置对SAM-PT进行评估,结果显示SAM-PT在DAVIS上比现有零样本方法高出5.0%以上,在YouTube-VOS上高出2.0%,在BDD100K 上高出7.3%,同时在UVO上也超越了完全监督的VIS方法。这证明了SAM-PT完全减少了注释工作量,接近完全监督方法的性能。

二、模型架构

        SAM-PT模型的点传播策略与传统面向对象跟踪的方法相比有以下几个具体优势。第一,点传播能够利用局部结构的上下文,且上下文对全局对象语义是未知的,这不仅增强了该模型的零样本泛化能力,更与SAM固有泛化能力结合,以允许在各种环境中跟踪各种对象。第二,SAM-PT允许稀疏点进行更紧凑的物体表示,以捕获足够信息有效表示对象部分。第三,SAM通过训练,可以有效处理稀疏点提示,能够与PT良好集成。具体流程如下图所示:

Step1:查询点选择
        这个过程首先定义视频第一帧的查询点。查询点要么是表示目标物体的正点,要么表示非目标物体或背景的负点。用户可以手动交互式地提交查询点,也可以使用点采样技术从ground truth掩码派生出来。本文的消融实验证明K-Medoids采样效果最佳,基本可以完整覆盖对象的各个部分。

Step2:点跟踪

从查询点开始使用点跟踪器将点传播到视频所有帧中,并获得点轨迹和遮挡分数。点跟踪器采用PIPS和最先进的CoTracker进行点传播,有效处理遮挡和长期跟踪问题。实验证明长期点跟踪器比链式光流传播或第一帧对应关系等方法更有效。

Step3:分割

本步骤两次调用SAM来结合正点和负点。第一次调用使用正点提示SAM目标物体的初始位置。第二次调用将正点和负点还有之前的掩码预测一起提示 SAM。最后重复第二次调用来执行可变数量的掩码细化迭代。

Step4:点跟踪二重初始化

为了提高跟踪的准确性,模型可以在预测轨迹达到一定帧数后(如h=8),使用最新的掩码重新初始化查询点并迭代执行step1~4整个过程。这个过程包括丢弃不可靠或被遮挡的点并合并之后的帧里可见的对象部分的点,以提高跟踪精度。

### 使用 Segment Anything Model (SAM) 实现摇杆图像的语义分割 #### SAM 的核心功能概述 Segment Anything Model (SAM) 是一种强大的通用分割模型,其设计目标是实现“一切的分割”,即它可以处理任意类型的对象并对其进行精确分割[^1]。相比于传统的语义分割方法仅关注预定义的对象类别,或者实例分割专注于区分不同实例,SAM 提供了一种更灵活的方式来进行分割。 当应用于摇杆图像时,SAM 不需要事先知道摇杆的具体形状或类别即可完成分割任务。这得益于它的提示机制(prompt-based mechanism),允许用户通过简单输入(如点、边界框或其他形式的提示)引导模型聚焦于感兴趣的区域。 --- #### 数据准备环境搭建 为了使用 SAM 进行摇杆图像的语义分割,需先准备好必要的数据和工具: 1. **安装依赖库** 需要安装 PyTorch 和 SAM 官方提供的 Python 库 `segment_anything`。以下是安装命令: ```bash pip install torch torchvision pip install git+https://github.com/facebookresearch/segment-anything.git ``` 2. **下载模型权重文件** 下载官方发布的 SAM 模型权重文件(例如 `sam_vit_h_4b8939.pth` 或其他变体)。可以从 Facebook AI Research 的 GitHub 页面获取这些资源。 3. **加载模型** 加载 SAM 模型及其配置参数可以通过以下代码片段实现: ```python from segment_anything import sam_model_registry, SamPredictor model_type = "vit_h" # 可选:vit_b, vit_l, vit_h checkpoint_path = "path/to/sam_vit_h_4b8939.pth" device = "cuda" if torch.cuda.is_available() else "cpu" sam = sam_model_registry[model_type](checkpoint=checkpoint_path).to(device) predictor = SamPredictor(sam) ``` --- #### 输入提示预测过程 对于摇杆图像的分割任务,可以采用如下方式设置提示并向 SAM 提供输入信息: 1. **读取图像** 将待分割的摇杆图像加载到内存中,并传递给 SAM 的预测器。 ```python image = cv2.imread("joystick_image.jpg") image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) predictor.set_image(image) ``` 2. **指定提示类型** 用户可以根据需求选择不同的提示模式,比如单击感兴趣区域内的某个位置作为点提示,或者绘制一个粗略包围摇杆的矩形框作为边界框提示。下面分别展示两种常见情况下的代码示例: - **基于点提示** 如果已知摇杆的大致中心位置,则可以直接向模型提供该点坐标。 ```python input_point = np.array([[x_center, y_center]]) # 替换为实际像素坐标 input_label = np.array([1]) # 表示此点属于前景 masks, scores, logits = predictor.predict( point_coords=input_point, point_labels=input_label, multimask_output=False ) ``` - **基于边界框提示** 当希望限定搜索范围至某一特定区域内时,可利用边界框代替点提示。 ```python bbox = np.array([xmin, ymin, xmax, ymax]) # 替换为真实值 mask, _, _ = predictor.predict(box=bbox, multimask_output=False) ``` 3. **可视化结果** 得到掩码后,可通过叠加显示原始图片分割后的效果以便验证准确性。 ```python plt.figure(figsize=(10,10)) plt.imshow(image) show_mask(masks[0], plt.gca(), random_color=True) show_points(input_point, input_label, plt.gca()) plt.axis('off') plt.show() ``` 上述过程中提到的功能函数(如 `show_mask`, `show_points` 等辅助绘图工具)通常由开发者自行编写或参考官方文档中的实现版本。 --- #### 结果优化建议 尽管 SAM 已具备较强的泛化能力,但在某些复杂场景下仍可能遇到挑战。此时可以考虑调整以下几个方面来提升性能表现: - 增加更多样化的提示组合; - 对低质量输出重新运行迭代改进流程; - 利用额外训练样本微调基础网络结构以适应具体领域特性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值