如何使用SAMURAI實(shí)例分割和跟蹤器進(jìn)行單對象跟蹤(SOT)的教程
幾年來,我一直試圖在視頻中追蹤登山者。
我的動機(jī)是雙重的:
在我熱衷的主題(運(yùn)動攀巖)上探索算法
分析兩名攀巖者之間的攀巖技術(shù)
在探索過程中,我偶然發(fā)現(xiàn)了一個名為“SAMURAI”的算法,這對于我的特定用例來說確實(shí)是一個突破。
該項(xiàng)目將為SAMURAI提供入門指南,特別是針對AMD gpu。
SAMURAI概述
SAMURAI建立在分段任何模型2.1 (SAM2.1)之上,并改進(jìn)了其跟蹤能力。
SAM和SAM2模型是革命性的,因?yàn)樗鼈兛梢詫Α叭魏螙|西”進(jìn)行分割,甚至不需要事先進(jìn)行特定于應(yīng)用程序的訓(xùn)練。這些模型已經(jīng)成為非常流行的自動標(biāo)記圖像和視頻的模型。
除此之外,它們還可以“跟蹤”視頻內(nèi)容中識別的對象。
還有其他的解決方案提供了類似的跟蹤改進(jìn),其中一些聲稱更好的跟蹤,即使是相同的對象(如:干擾)。其中一個解決方案是用于SAM 2.1的干擾感知內(nèi)存,或DAM4SAM。
DAM4SAM聲稱比SAMURAI有更好的跟蹤能力,特別是在有干擾的情況下。相同的對象):
我已經(jīng)評估了這兩種解決方案,看看哪種解決方案更適合我的特定用例:跟蹤感興趣的攀登者(CoI)。我邀請您對您的特定用例執(zhí)行類似的比較。
SAMURAI vs DAM4SAM
本實(shí)驗(yàn)的主要結(jié)論如下:
?SAMURAI比DAM4SAM快6倍(使用AMD Radeon Pro W7900 GPU)
?DAM4SAM失去了攀登者(跟蹤任務(wù)失敗),而SAMURAI成功了
設(shè)置硬件
我的設(shè)置包括AMD Radeon Pro W7900 GPU,但這些指令預(yù)計(jì)將與使用AMD ROCm軟件堆棧的任何AMD GPU一起工作。
有關(guān)如何設(shè)置AMD GPU的更多信息,包括升級電源和添加前機(jī)箱風(fēng)扇,請參考以下項(xiàng)目:
介紹AMD Radeon Pro W7900 GPU
我們應(yīng)該首先驗(yàn)證AMD GPU的驅(qū)動程序是否安裝,如下所示:
在撰寫本文時,ROCm的最新版本是6.2.4。
為AMD gpu安裝SAMURAI
SAMURAI提供了出色的安裝說明,但僅適用于NVIDIA gpu。
為了這個項(xiàng)目的目的,我將參考下面的repo,它有一個特定版本的SAMURAI存儲庫鏈接為gitmodule:
“samurai”子目錄包含原始存儲庫的特定版本,可以按照以下方式安裝:
在安裝過程中,我們可以注意到,除其他外,以下軟件包已默認(rèn)安裝支持NVIDIA CUDA:
torch> = 2.3.1
torchvision > = 0.18.1
因此,我們需要安裝與這些包等價的ROCm,如下所述:
我們也可以通過PyTorch驗(yàn)證AMD GPU的支持,如下面的python會話:
我們還可以使用“nvtop”來監(jiān)控GPU的使用情況:
下面的屏幕截圖顯示了nvtop的輸出。在我的系統(tǒng)中,我有一個AMD Radeon Pro W7900 GPU (48GB),以及一個較小的NVIDIA T400 GPU (4GB)。
啟動演示
演示腳本可以從samurai目錄啟動,如下所示:
下面的可選參數(shù)指定了要使用的模型:
?Model_path:要使用的模型(默認(rèn)= sam2/檢查點(diǎn)/sam2.1 .1_hiera_base_plus.pt)
該模型的其他變體有:tiny、small、base_plus(默認(rèn)值)和large。
我只試驗(yàn)了默認(rèn)的base_plus模型。
演示腳本有以下參數(shù)指定輸入:
?Video_path:視頻文件(僅支持mp4)或圖像目錄(僅支持jpg)的路徑
?Txt_path:包含要跟蹤對象的初始邊界框(x, y, w, h)的文本文件
演示腳本也有以下可選輸出參數(shù):
?Save_to_video: Boolean,表示是否保存輸出的視頻文件
?Video_output_path:視頻文件輸出路徑
我已經(jīng)基于原始的demo.py實(shí)現(xiàn)了自己的腳本,將在下面幾節(jié)中描述。
?samurai_step01.py
?samurai_step02.py
CPU內(nèi)存限制
SAMURAI模型使用<2GB的VRAM(即使是大型模型),因此應(yīng)該與任何GPU一起工作。
然而,主循環(huán)將所有輸入圖像(來自圖像文件的視頻)加載到內(nèi)存中,這可能需要大量的CPU內(nèi)存。
下面的屏幕截圖說明了SAMURAI如何為一個包含3000張1920x1080大小的圖像的用例分配64GB CPU內(nèi)存的60%。
根據(jù)我的計(jì)算,這個用例應(yīng)該只需要我64GB內(nèi)存的30%,因?yàn)?000 * (1920*1080*3)= 17.38GB。因此,我們可以得出結(jié)論,SAMURAI執(zhí)行所需的內(nèi)存是輸入圖像的兩倍。
這將限制您可以提供給SAMURAI算法的輸入圖像的數(shù)量。
為了超越這個限制,可以運(yùn)行幾次,將前一次迭代的最后一個掩碼的邊界框作為下一次迭代的邊界框。
指定輸入
演示腳本允許將輸入指定為視頻文件或輸入圖像。
使用默認(rèn)的“demo.py”腳本,我沒有成功地使視頻文件輸入工作,導(dǎo)致分割錯誤。
出于這個原因,我創(chuàng)建了自己的預(yù)處理腳本,將輸入視頻轉(zhuǎn)換為輸出圖像。我還將以下功能集成到我的腳本中:
?跳過幀:通過參數(shù)指定,允許減少生成的圖像數(shù)量
?開始幀選擇:由用戶用‘s’鍵指定
?結(jié)束幀選擇:由用戶用‘e’鍵指定
?ROI選擇:由用戶用鼠標(biāo)指定
“samurai_step01.py”腳本可用于從輸入視頻中提取圖像。它的用法如下:
該腳本將啟動兩個窗口:
?samurai_step01 -控制
?samurai_step01
“samurai_step01 - Controls”窗口允許你調(diào)整視頻內(nèi)容的大小(scaleFactor),并在視頻中導(dǎo)航(frameNum)。
第一步是導(dǎo)航到一個幀,它將成為提取圖像的開始幀,用‘s’鍵選擇它,然后使用鼠標(biāo)選擇要跟蹤的對象的ROI。在我的用例中,這是一個攀爬器,但您可以選擇任何對象。
腳本將生成詳細(xì)的“[INFO]…”來確認(rèn)您與GUI的交互。
下一步是導(dǎo)航到結(jié)束幀,用“e”鍵選擇它,然后按“w”鍵提取圖像。
該腳本將在指定的工作目錄下生成以下內(nèi)容:
生成輸出掩碼
使用從視頻中提取的圖像,我們現(xiàn)在可以運(yùn)行SAMURAI算法,使用“samurai_step02.py”腳本:
該腳本將在指定的工作目錄下生成以下內(nèi)容:
三個輸出視頻(mp4)可用于查看SAMURAI算法的輸出與蒙版和/或邊界框。
請注意,生成這些視頻會降低SAMURAI的幀率。如果您想加快一些速度,可以隨意注釋掉生成這些視頻的代碼。
我用AMD Radeon Pro W7900 GPU看到了高達(dá)6fps的性能。
總結(jié)和后續(xù)步驟
使用之前的腳本,我能夠在這些具有挑戰(zhàn)性的視頻中成功執(zhí)行單對象跟蹤(SOT)。
本文編譯自hackster.io