如何使用SAMURAI實例分割和跟蹤器進行單對象跟蹤(SOT)的教程
幾年來,我一直試圖在視頻中追蹤登山者。
我的動機是雙重的:
在我熱衷的主題(運動攀巖)上探索算法
分析兩名攀巖者之間的攀巖技術
在探索過程中,我偶然發(fā)現了一個名為“SAMURAI”的算法,這對于我的特定用例來說確實是一個突破。
該項目將為SAMURAI提供入門指南,特別是針對AMD gpu。
SAMURAI概述
SAMURAI建立在分段任何模型2.1 (SAM2.1)之上,并改進了其跟蹤能力。
SAM和SAM2模型是革命性的,因為它們可以對“任何東西”進行分割,甚至不需要事先進行特定于應用程序的訓練。這些模型已經成為非常流行的自動標記圖像和視頻的模型。
除此之外,它們還可以“跟蹤”視頻內容中識別的對象。
還有其他的解決方案提供了類似的跟蹤改進,其中一些聲稱更好的跟蹤,即使是相同的對象(如:干擾)。其中一個解決方案是用于SAM 2.1的干擾感知內存,或DAM4SAM。
DAM4SAM聲稱比SAMURAI有更好的跟蹤能力,特別是在有干擾的情況下。相同的對象):
我已經評估了這兩種解決方案,看看哪種解決方案更適合我的特定用例:跟蹤感興趣的攀登者(CoI)。我邀請您對您的特定用例執(zhí)行類似的比較。
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”來監(jiān)控GPU的使用情況:
下面的屏幕截圖顯示了nvtop的輸出。在我的系統(tǒng)中,我有一個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實現了自己的腳本,將在下面幾節(jié)中描述。
?samurai_step01.py
?samurai_step02.py
CPU內存限制
SAMURAI模型使用<2GB的VRAM(即使是大型模型),因此應該與任何GPU一起工作。
然而,主循環(huán)將所有輸入圖像(來自圖像文件的視頻)加載到內存中,這可能需要大量的CPU內存。
下面的屏幕截圖說明了SAMURAI如何為一個包含3000張1920x1080大小的圖像的用例分配64GB CPU內存的60%。
根據我的計算,這個用例應該只需要我64GB內存的30%,因為3000 * (1920*1080*3)= 17.38GB。因此,我們可以得出結論,SAMURAI執(zhí)行所需的內存是輸入圖像的兩倍。
這將限制您可以提供給SAMURAI算法的輸入圖像的數量。
為了超越這個限制,可以運行幾次,將前一次迭代的最后一個掩碼的邊界框作為下一次迭代的邊界框。
指定輸入
演示腳本允許將輸入指定為視頻文件或輸入圖像。
使用默認的“demo.py”腳本,我沒有成功地使視頻文件輸入工作,導致分割錯誤。
出于這個原因,我創(chuàng)建了自己的預處理腳本,將輸入視頻轉換為輸出圖像。我還將以下功能集成到我的腳本中:
?跳過幀:通過參數指定,允許減少生成的圖像數量
?開始幀選擇:由用戶用‘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的性能。
總結和后續(xù)步驟
使用之前的腳本,我能夠在這些具有挑戰(zhàn)性的視頻中成功執(zhí)行單對象跟蹤(SOT)。
本文編譯自hackster.io