如何使用SAMURAI实例分割和跟踪器进行单对象跟踪(SOT)的教程
扫描二维码
随时随地手机看文章
几年来,我一直试图在视频中追踪登山者。
我的动机是双重的:
在我热衷的主题(运动攀岩)上探索算法
分析两名攀岩者之间的攀岩技术
在探索过程中,我偶然发现了一个名为“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)。
本文编译自hackster.io