如何使用SAMURAI实例分割和跟踪器进行单对象跟踪(SOT)的教程

  发布人:amy2025 时间:2025-08-15

几年来,我一直试图在视频中追踪登山者。

我的动机是双重的:

在我热衷的主题(运动攀岩)上探索算法

分析两名攀岩者之间的攀岩技术

在探索过程中,我偶然发现了一个名为“SAMURAI”的算法,这对于我的特定用例来说确实是一个突破。

该项目将为SAMURAI提供入门指南,特别是针对AMD gpu。

SAMURAI概述

SAMURAI建立在分段任何模型2.1 (SAM2.1)之上,并改进了其跟踪能力。

SAM和SAM2模型是革命性的,因为它们可以对“任何东西”进行分割,甚至不需要事先进行特定于应用程序的训练。这些模型已经成为非常流行的自动标记图像和视频的模型。

除此之外,它们还可以“跟踪”视频内容中识别的对象。

还有其他的解决方案提供了类似的跟踪改进,其中一些声称更好的跟踪,即使是相同的对象(如:干扰)。其中一个解决方案是用于SAM 2.1的干扰感知内存,或DAM4SAM。

DAM4SAM声称比SAMURAI有更好的跟踪能力,特别是在有干扰的情况下。相同的对象):

我已经评估了这两种解决方案,看看哪种解决方案更适合我的特定用例:跟踪感兴趣的攀登者(CoI)。我邀请您对您的特定用例执行类似的比较。

SAMURAI vs DAM4SAM

本实验的主要结论如下:

•SAMURAI比DAM4SAM快6倍(使用AMD Radeon Pro W7900 GPU)

•DAM4SAM失去了攀登者(跟踪任务失败),而SAMURAI成功了

设置硬件

我的设置包括AMD Radeon Pro W7900 GPU,但这些指令预计将与使用AMD ROCm软件堆栈的任何AMD GPU一起工作。

有关如何设置AMD GPU的更多信息,包括升级电源和添加前机箱风扇,请参考以下项目:

介绍AMD Radeon Pro W7900 GPU

我们应该首先验证AMD GPU的驱动程序是否安装,如下所示:

在撰写本文时,ROCm的最新版本是6.2.4。

为AMD gpu安装SAMURAI

SAMURAI提供了出色的安装说明,但仅适用于NVIDIA gpu。

为了这个项目的目的,我将参考下面的repo,它有一个特定版本的SAMURAI存储库链接为gitmodule:

“samurai”子目录包含原始存储库的特定版本,可以按照以下方式安装:

在安装过程中,我们可以注意到,除其他外,以下软件包已默认安装支持NVIDIA CUDA:

torch> = 2.3.1

torchvision > = 0.18.1

因此,我们需要安装与这些包等价的ROCm,如下所述:

我们也可以通过PyTorch验证AMD GPU的支持,如下面的python会话:

我们还可以使用“nvtop”来监控GPU的使用情况:

下面的屏幕截图显示了nvtop的输出。在我的系统中,我有一个AMD Radeon Pro W7900 GPU (48GB),以及一个较小的NVIDIA T400 GPU (4GB)。

启动演示

演示脚本可以从samurai目录启动,如下所示:

下面的可选参数指定了要使用的模型:

•Model_path:要使用的模型(默认= sam2/检查点/sam2.1 .1_hiera_base_plus.pt)

该模型的其他变体有:tiny、small、base_plus(默认值)和large。

我只试验了默认的base_plus模型。

演示脚本有以下参数指定输入:

•Video_path:视频文件(仅支持mp4)或图像目录(仅支持jpg)的路径

•Txt_path:包含要跟踪对象的初始边界框(x, y, w, h)的文本文件

演示脚本也有以下可选输出参数:

•Save_to_video: Boolean,表示是否保存输出的视频文件

•Video_output_path:视频文件输出路径

我已经基于原始的demo.py实现了自己的脚本,将在下面几节中描述。

•samurai_step01.py

•samurai_step02.py

CPU内存限制

SAMURAI模型使用2GB的VRAM(即使是大型模型),因此应该与任何GPU一起工作。

然而,主循环将所有输入图像(来自图像文件的视频)加载到内存中,这可能需要大量的CPU内存。

下面的屏幕截图说明了SAMURAI如何为一个包含3000张1920x1080大小的图像的用例分配64GB CPU内存的60%。

根据我的计算,这个用例应该只需要我64GB内存的30%,因为3000 * (1920*1080*3)= 17.38GB。因此,我们可以得出结论,SAMURAI执行所需的内存是输入图像的两倍。

这将限制您可以提供给SAMURAI算法的输入图像的数量。

为了超越这个限制,可以运行几次,将前一次迭代的最后一个掩码的边界框作为下一次迭代的边界框。

指定输入

演示脚本允许将输入指定为视频文件或输入图像。

使用默认的“demo.py”脚本,我没有成功地使视频文件输入工作,导致分割错误。

出于这个原因,我创建了自己的预处理脚本,将输入视频转换为输出图像。我还将以下功能集成到我的脚本中:

•跳过帧:通过参数指定,允许减少生成的图像数量

•开始帧选择:由用户用‘s’键指定

•结束帧选择:由用户用‘e’键指定

•ROI选择:由用户用鼠标指定

“samurai_step01.py”脚本可用于从输入视频中提取图像。它的用法如下:

该脚本将启动两个窗口:

•samurai_step01 -控制

•samurai_step01

“samurai_step01 - Controls”窗口允许你调整视频内容的大小(scaleFactor),并在视频中导航(frameNum)。

第一步是导航到一个帧,它将成为提取图像的开始帧,用‘s’键选择它,然后使用鼠标选择要跟踪的对象的ROI。在我的用例中,这是一个攀爬器,但您可以选择任何对象。

脚本将生成详细的“[INFO]…”来确认您与GUI的交互。

下一步是导航到结束帧,用“e”键选择它,然后按“w”键提取图像。

该脚本将在指定的工作目录下生成以下内容:

生成输出掩码

使用从视频中提取的图像,我们现在可以运行SAMURAI算法,使用“samurai_step02.py”脚本:

该脚本将在指定的工作目录下生成以下内容:

三个输出视频(mp4)可用于查看SAMURAI算法的输出与蒙版和/或边界框。

请注意,生成这些视频会降低SAMURAI的帧率。如果您想加快一些速度,可以随意注释掉生成这些视频的代码。

我用AMD Radeon Pro W7900 GPU看到了高达6fps的性能。

总结和后续步骤

使用之前的脚本,我能够在这些具有挑战性的视频中成功执行单对象跟踪(SOT)。

关键词: 跟踪器 GPU SAMURAI DAM4SAM

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关电路