OTB Benchmark 学习(下载链接、评价指标、配置)
最近剛剛開始學習目標跟蹤方法,在看程序和論文的時候發現評價指標和跟蹤算法比較圖的時候,思考這些是從哪里來的,查到了一下有關評價方法:OTB Benchmark 、VOT toolkit、pysot 和got10k-toolkit等Toolkit。
先將OTB Benchmark進行學習和總結,后續學習余下的。
文章目錄
- 一、OTB(包含:數據集百度云下載鏈接)
- 二、OTB評價指標
- 1. precision plot 精度圖(中心位置誤差)
- 2. Success Plot 成功率圖(區域重疊面積比率)
- 2. OPE、TRE、SRE
- 三、OTB Benchmark 使用(Matlab版本)
- 1.下載
- 2.文件介紹
- 3.修改程序中的部分設置
- 4.運行
- 5.顯示
- 6.畫圖
一、OTB(包含:數據集百度云下載鏈接)
OTB 可以用來衡量你的目標跟蹤算法好壞,它包含一些 benchmark 結果,打好標記(即ground-truth.txt )的數據集,以及一個用來測試你的算法的代碼庫。
數據集包括50幀的序列和100幀的序列,其中50幀序列的數據集是2013年提出來的,100幀的數據集是2015年提出來的,所以OTB50也叫OTB2013,OTB100也叫OTB2015。
現在測試基本都使用OTB100做。
相關的數據集和測試代碼庫都可以在Visual Tracker Benchmark官方網址下載。
OTB50,數據集下載,百度云,密碼:rrsr
OTB100,數據集下載,百度云,密碼:faqb
建議直接下載OTB100,OTB100包含了OTB50中的所有圖像序列。
注明:
1.Jogging和Skating2有兩個序列,在序列Human4中的groundtruth_rect.1.txt是空的(原版也是空的)
2.發現在Jogging序列下有個ground_rect.txt,刪去即可
3.注意序列BlurCar1,BlurCar3,BlurCar4里面圖片序號不是從1開始的
二、OTB評價指標
先拋出兩個概念,也是最常見的評價標準。
評價標準通常包含兩個基本參數:中心位置誤差和區域重疊面積比率
中心位置誤差:
是跟蹤目標的中心位置 和人工標注的準確位置之間的平均像素距離。
區域重疊面積比率:
通過統計跟蹤算法得到的邊界框和人工標注的準確邊界框之間的面積重疊比衡量跟蹤算法的性能。
1. precision plot 精度圖(中心位置誤差)
在跟蹤精確度的評估中, 中心位置誤差是一個廣泛使用的標準, 是跟蹤目標的中心位置和人工標注的準確位置之間的平均像素距離(歐幾里得距離)。通常, 采用一個序列中所有幀的平均中心位置誤差來評價跟蹤算法對該序列的總體性能。然而,當跟蹤器丟失目標時,預測的跟蹤位置是隨機的,此時平均誤差值可能無法準確評估跟蹤器的性能。因此,在 OTB 數據集上將其進一步擴展為精確度曲線圖, 統計在不同閾值距離下的成功跟蹤比例,并采用閾值為 20 個像素點所對應的數值作為代表性的精確度評價指標。
該評估方法的缺點:無法反映目標物體大小與尺度的變化。
例如:下圖為MDNet在OTB100的測試結果,圖中藍色箭頭指示的就是閾值20個像素下,MDNet方法的精度為0.909。怎么計算的呢?舉例,如一個視頻為1000幀,小于20像素距離的幀數有909幀,那邊精度為0.909。當然,圖中的結果為OTB100數據集的測試的平均結果。
2. Success Plot 成功率圖(區域重疊面積比率)
由于中心位置誤差無法評價目標在跟蹤過程中的尺度變化,因此,提出基于區域重疊面積比的評價標準, 通過統計跟蹤算法得到的邊界框和人工標注的準確邊界框之間的面積重疊比衡量跟蹤算法的性能。
首先定義重合率得分(overlap score,OS),跟蹤算法得到的bounding box(記為a),與ground-truth給的box(記為b)
重合率定義為:
OS = |a∩b|/|a∪b|,
|·|表示區域的像素數目。
當某一幀的OS大于設定的閾值時,則該幀被視為成功的(Success),總的成功的幀占所有幀的百分比即為成功率(Success rate)。OS的取值范圍為0~1,因此可以繪制出閾值從 0 到 1 變化的成功率曲線圖。
在特定的閾值(例如,閾值為0.5)下使用一個成功率值(Success rate)來評估跟蹤算法可能不公平、不具有代表性。取而代之的是,使用每個成功圖的曲線下面積(AUC)來對跟蹤算法進行排名。
成功圖比精度圖更可取,因為精度僅使用邊界框位置,而忽略大小或重疊。
例如:下圖算法后面跟的數值,應該就是AUC
2. OPE、TRE、SRE
OPE
用ground-truth中目標的位置初始化第一幀,然后運行跟蹤算法得到平均精度和成功率。這種方法被稱為one-pass evaluation (OPE)一次性評估。
雖然它很簡單,但這個指標有兩個主要缺點。首先,跟蹤算法可能對第一幀中的初始化敏感,并且其對于不同初始狀態或幀的性能可能有顯著差異。其次,大多數算法沒有重新初始化機制,跟蹤失敗后的跟蹤結果不能提供有意義的信息。
TRE、SRE
為進行魯棒性(robustness)評估, OTB 提出在時間上( 即,從不同幀開始跟蹤) 和空間上( 即,以不同的邊界框開始跟蹤) 擾亂初始化, 以模擬現實世界中由于位置或尺寸方面引入的初始化誤差; 這兩種評估稱為時間魯棒性評估(TRE,temporal robustness evaluation) 和空間魯棒性評估( SRE,spatial robustness evaluation)。
TRE:在一個圖片/視頻序列中,每個跟蹤算法從不同的幀作為起始進行追蹤,通過視頻序列在時間軸上平均找出20個點作為起點(比如分別從第一幀開始進行跟蹤,從第十幀開始進行跟蹤,從第二十幀開始進行跟蹤等),終點還是原來的最后一幀,這樣通過對20段視頻序列運行算法,繪制平均的重疊率圖或者像素誤差圖。
SRE:由于有些算法對初始化時給定的bounding box比較敏感,而目前測評用的ground-truth都是人工標注的,因此可能會對某些跟蹤算法產生影響。因此為了評估這些跟蹤算法是否對初始化敏感,作者通過將ground-truth輕微的平移和尺度的擴大與縮小來產生bounding box。平移的大小為目標物體大小的10%,尺度變化范圍為ground-truth的80%到120%,每10%依次增加。最后取這些結果的平均值作為SRE score。
我們通過平移或縮放地面實值來采樣第一幀中的初始邊界框。這里,我們使用了8個空間移位,包括4個中心移位和4個角移位,以及4個比例變化(補充)。移動量為目標大小的10%,比例比在0.8、0.9、1.1和1.2之間變化,與實際情況相符。因此,我們對每個跟蹤器進行了12次SRE評估。
在OTB2015中提出了,OPER和SRER。
原因:對于具有挑戰性的序列,當場景中出現外觀急劇變化或出現某些干擾時,跟蹤算法可能會失敗并失去對目標的跟蹤。一旦一種方法失敗,在沒有任何外部輸入(例如,由對象檢測器重新檢測或手動重新初始化)的情況下,不太可能恢復和跟蹤目標。雖然TRE評分旨在緩解這種影響,但為了更好地衡量跟蹤性能,需要使用不同的度量標準。
One-pass evaluation with restart (OPER):可重新啟動的一次性評估,在跟蹤期間,如果跟蹤失敗,那么就在下一幀重新初始化然后再跟蹤,其余與OPE一樣。
Spatial robustness evaluation with restart (SRER):基于重啟的空間穩健性評估,通OPER。
三、OTB Benchmark 使用(Matlab版本)
1.下載
benchmark codebase,官方網址:http://cvlab.hanyang.ac.kr/tracker_benchmark/
tracker Results 是OTB運行的跟蹤算法的結果,可以直接下載使用。(官網下載,使用迅雷下載會快一點)
百度云鏈接,密碼:cx5o
下載vlfeat工具包
網址:https://www.vlfeat.org/
VLFeat 開源庫實現計算機視覺算法專業圖像的理解和局部特征提取和匹配。它是用C編寫的,以提高效率和兼容性,并帶有MATLAB的接口,以易于使用。
為什么要下載呢?因為OTB用到了vlfeat 的一些東西。
2.文件介紹
解壓tracker_benchmark_v1.0,簡單介紹一下文件內容:
1.anno文件:主要存儲的是數據集的bounding box。 目前打開為52個文件,后續需要可以添加。默認下載下來的只有OTB50中視頻序列的標注數據,要想測試OTB100就需要找到OTB100的標注數據將anno文件夾進行替換。很顯然,沒有標注好的數據就不能測試得到算法的跟蹤精度及成功率。
2.figs文件:存儲的是一些實驗跑出的圖片,準確度圖、成功率圖等。運行了perfPlot.m文件畫完圖之后,生成的圖片就會存在這個文件夾里。
3.initOmit文件:包含由于遮擋或目標超出視野而被省略的用于跟蹤初始化的幀的注釋的目錄。
4.perfMat文件:存儲最終用于畫圖的mat文件。運行perfPlot.m畫圖文件之后生成的記錄文件,所以當你新增或者更改了需要畫圖的算法時,最好把這個文件夾里overall里的所有文件刪除,否則可能會畫出之前保存的圖片而不進行新圖的繪制。
5.results文件:存儲的每個trackers的跟蹤結果的mat文件和perfMat不一樣,這個是相對于bounding box的跟蹤框數據。
6.rstEval文件:包含了很多用于計算跟蹤性能或者畫出結果的腳本的目錄。
7.tmp文件:用來存放臨時結果或者日志文件。
8.trackers文件:里面包含各種你需要對比的跟蹤算法;要簡單了解可以看trackers.txt文件 (注意:你必須把你需要測試的算法的代碼放在這個文件夾里,并寫好接口文件(run_算法名.m))
9.util文件:里面包含各種重要的函數和腳本。(其中,需要更改的函數有兩個,configSeqs.m文件,這個文件是設置需要在哪些視頻序列上進行測試。configTrackers.m文件,這個文件是設置需要測試哪些跟蹤算法。)
.m文件
1.drawResultBB.m 用于畫每個幀上不同跟蹤器的邊界框的主函數。將選擇的所有算法的跟蹤結果框(bounding_box)顯示在同一張圖片上的文件,運行這個文件首先需要把自己的算法在數據庫上跑一遍,也就是要有results文件夾里要有算法跟蹤結果文件。
2.genPerfMat.m 被調用生成圖的值。
3.main_running.m 是用來在測試集上跑跟蹤代碼的,跑出的結果存在results文件夾中;
4.perfPlot.m 用來把測試結果畫出圖來,就是benchmark網上的圖的效果
3.修改程序中的部分設置
修改vlfeat的路徑:
main_running.m文件中:
更改為自己解壓的路徑。
修改數據集圖像路徑,在util文件中的configSeqs.m,修改seq路徑,為自己OTB數據集存放的路徑。注意:圖像序列在更深一層的img文件下。
更改后,所示:
參考其他博客給出configSeqs.m配置OTB100
function seqs=configSeqsseqVTD={struct('name','soccer','path','E:\Datasets\OTB100\soccer\img\','startFrame',1,'endFrame',392,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','matrix','path','E:\Datasets\OTB100\matrix\img\','startFrame',1,'endFrame',100,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','ironman','path','E:\Datasets\OTB100\ironman\img\','startFrame',1,'endFrame',166,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','deer','path','E:\Datasets\OTB100\deer\img\','startFrame',1,'endFrame',71,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','skating1','path','E:\Datasets\OTB100\skating1\img\','startFrame',1,'endFrame',400,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','shaking','path','E:\Datasets\OTB100\shaking\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','singer1','path','E:\Datasets\OTB100\singer1\img\','startFrame',1,'endFrame',351,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','singer2','path','E:\Datasets\OTB100\singer2\img\','startFrame',1,'endFrame',366,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};seqIVT={struct('name','carDark','path','E:\Datasets\OTB100\carDark\img\','startFrame',1,'endFrame',393,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','car4','path','E:\Datasets\OTB100\car4\img\','startFrame',1,'endFrame',659,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','david2','path','E:\Datasets\OTB100\david2\img\','startFrame',1,'endFrame',537,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),... struct('name','sylvester','path','E:\Datasets\OTB100\sylvester\img\','startFrame',1,'endFrame',1345,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','trellis','path','E:\Datasets\OTB100\trellis\img\','startFrame',1,'endFrame',569,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','fish','path','E:\Datasets\OTB100\fish\img\','startFrame',1,'endFrame',476,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','mhyang','path','E:\Datasets\OTB100\mhyang\img\','startFrame',1,'endFrame',1490,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','david','path','E:\Datasets\OTB100\david\img\','startFrame',300,'endFrame',770,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};seqOther={struct('name','coke','path','E:\Datasets\OTB100\coke\img\','startFrame',1,'endFrame',291,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','bolt','path','E:\Datasets\OTB100\bolt\img\','startFrame',1,'endFrame',350,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','boy','path','E:\Datasets\OTB100\boy\img\','startFrame',1,'endFrame',602,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','dudek','path','E:\Datasets\OTB100\dudek\img\','startFrame',1,'endFrame',1145,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','crossing','path','E:\Datasets\OTB100\crossing\img\','startFrame',1,'endFrame',120,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','couple','path','E:\Datasets\OTB100\couple\img\','startFrame',1,'endFrame',140,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','football1','path','E:\Datasets\OTB100\football1\img\','startFrame',1,'endFrame',74,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','jogging-1','path','E:\Datasets\OTB100\jogging\img\','startFrame',1,'endFrame',307,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','jogging-2','path','E:\Datasets\OTB100\jogging\img\','startFrame',1,'endFrame',307,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','doll','path','E:\Datasets\OTB100\doll\img\','startFrame',1,'endFrame',3872,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','girl','path','E:\Datasets\OTB100\girl\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','walking2','path','E:\Datasets\OTB100\walking2\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','walking','path','E:\Datasets\OTB100\walking\img\','startFrame',1,'endFrame',412,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','fleetface','path','E:\Datasets\OTB100\fleetface\img\','startFrame',1,'endFrame',707,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','freeman1','path','E:\Datasets\OTB100\freeman1\img\','startFrame',1,'endFrame',326,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','freeman3','path','E:\Datasets\OTB100\freeman3\img\','startFrame',1,'endFrame',460,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','freeman4','path','E:\Datasets\OTB100\freeman4\img\','startFrame',1,'endFrame',283,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','david3','path','E:\Datasets\OTB100\david3\img\','startFrame',1,'endFrame',252,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','jumping','path','E:\Datasets\OTB100\jumping\img\','startFrame',1,'endFrame',313,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','carScale','path','E:\Datasets\OTB100\carScale\img\','startFrame',1,'endFrame',252,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','skiing','path','E:\Datasets\OTB100\skiing\img\','startFrame',1,'endFrame',81,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','dog1','path','E:\Datasets\OTB100\dog1\img\','startFrame',1,'endFrame',1350,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','suv','path','E:\Datasets\OTB100\suv\img\','startFrame',1,'endFrame',945,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','motorRolling','path','E:\Datasets\OTB100\motorRolling\img\','startFrame',1,'endFrame',164,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','mountainBike','path','E:\Datasets\OTB100\mountainBike\img\','startFrame',1,'endFrame',228,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),... struct('name','lemming','path','E:\Datasets\OTB100\lemming\img\','startFrame',1,'endFrame',1336,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','liquor','path','E:\Datasets\OTB100\liquor\img\','startFrame',1,'endFrame',1741,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','woman','path','E:\Datasets\OTB100\woman\img\','startFrame',1,'endFrame',597,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','faceocc1','path','E:\Datasets\OTB100\faceocc1\img\','startFrame',1,'endFrame',892,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','faceocc2','path','E:\Datasets\OTB100\faceocc2\img\','startFrame',1,'endFrame',812,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','basketball','path','E:\Datasets\OTB100\basketball\img\','startFrame',1,'endFrame',725,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','football','path','E:\Datasets\OTB100\football\img\','startFrame',1,'endFrame',362,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','subway','path','E:\Datasets\OTB100\subway\img\','startFrame',1,'endFrame',175,'nz',4,'ext','jpg','init_rect', [0 0 0 0]),... struct('name','tiger1','path','E:\Datasets\OTB100\tiger1\img\','startFrame',1,'endFrame',354,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','tiger2','path','E:\Datasets\OTB100\tiger2\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};seqOTB49_100={struct('name','Biker','path','E:\Datasets\OTB100\Biker\img\','startFrame',1,'endFrame',142,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Bird1','path','E:\Datasets\OTB100\Bird1\img\','startFrame',1,'endFrame',408,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Bird2','path','E:\Datasets\OTB100\Bird2\img\','startFrame',1,'endFrame',99,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurBody','path','E:\Datasets\OTB100\BlurBody\img\','startFrame',1,'endFrame',334,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurCar1','path','E:\Datasets\OTB100\BlurCar1\img\','startFrame',247,'endFrame',988,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurCar2','path','E:\Datasets\OTB100\BlurCar2\img\','startFrame',1,'endFrame',585,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurCar3','path','E:\Datasets\OTB100\BlurCar3\img\','startFrame',3,'endFrame',359,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurCar4','path','E:\Datasets\OTB100\BlurCar4\img\','startFrame',18,'endFrame',397,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurFace','path','E:\Datasets\OTB100\BlurFace\img\','startFrame',1,'endFrame',493,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurOwl','path','E:\Datasets\OTB100\BlurOwl\img\','startFrame',1,'endFrame',631,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Board','path','E:\Datasets\OTB100\Board\img\','startFrame',1,'endFrame',698,'nz',5,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Bolt2','path','E:\Datasets\OTB100\Bolt2\img\','startFrame',1,'endFrame',293,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Box','path','E:\Datasets\OTB100\Box\img\','startFrame',1,'endFrame',1161,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Car1','path','E:\Datasets\OTB100\Car1\img\','startFrame',1,'endFrame',1020,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Car2','path','E:\Datasets\OTB100\Car2\img\','startFrame',1,'endFrame',913,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Car24','path','E:\Datasets\OTB100\Car24\img\','startFrame',1,'endFrame',3059,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','ClifBar','path','E:\Datasets\OTB100\ClifBar\img\','startFrame',1,'endFrame',472,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Coupon','path','E:\Datasets\OTB100\Coupon\img\','startFrame',1,'endFrame',327,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Crowds','path','E:\Datasets\OTB100\Crowds\img\','startFrame',1,'endFrame',347,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Dancer','path','E:\Datasets\OTB100\Dancer\img\','startFrame',1,'endFrame',225,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Dancer2','path','E:\Datasets\OTB100\Dancer2\img\','startFrame',1,'endFrame',150,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),... struct('name','Diving','path','E:\Datasets\OTB100\Diving\img\','startFrame',1,'endFrame',215,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Dog','path','E:\Datasets\OTB100\Dog\img\','startFrame',1,'endFrame',127,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','DragonBaby','path','E:\Datasets\OTB100\DragonBaby\img\','startFrame',1,'endFrame',113,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Girl2','path','E:\Datasets\OTB100\Girl2\img\','startFrame',1,'endFrame',1500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Gym','path','E:\Datasets\OTB100\Gym\img\','startFrame',1,'endFrame',767,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human2','path','E:\Datasets\OTB100\Human2\img\','startFrame',1,'endFrame',1128,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human3','path','E:\Datasets\OTB100\Human3\img\','startFrame',1,'endFrame',1698,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human4','path','E:\Datasets\OTB100\Human4\img\','startFrame',1,'endFrame',667,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human5','path','E:\Datasets\OTB100\Human5\img\','startFrame',1,'endFrame',713,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human6','path','E:\Datasets\OTB100\Human6\img\','startFrame',1,'endFrame',792,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human7','path','E:\Datasets\OTB100\Human7\img\','startFrame',1,'endFrame',250,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human8','path','E:\Datasets\OTB100\Human8\img\','startFrame',1,'endFrame',128,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human9','path','E:\Datasets\OTB100\Human9\img\','startFrame',1,'endFrame',305,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Jump','path','E:\Datasets\OTB100\Jump\img\','startFrame',1,'endFrame',122,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','KiteSurf','path','E:\Datasets\OTB100\KiteSurf\img\','startFrame',1,'endFrame',84,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Man','path','E:\Datasets\OTB100\Man\img\','startFrame',1,'endFrame',134,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Panda','path','E:\Datasets\OTB100\Panda\img\','startFrame',1,'endFrame',1000,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','RedTeam','path','E:\Datasets\OTB100\RedTeam\img\','startFrame',1,'endFrame',1918,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Rubik','path','E:\Datasets\OTB100\Rubik\img\','startFrame',1,'endFrame',1997,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Skater','path','E:\Datasets\OTB100\Skater\img\','startFrame',1,'endFrame',160,'nz',4,'ext','jpg','init_rect', [0,0,0,0])...struct('name','Skater2','path','E:\Datasets\OTB100\Skater2\img\','startFrame',1,'endFrame',435,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Skating2-1','path','E:\Datasets\OTB100\Skating2\img\','startFrame',1,'endFrame',473,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Skating2-2','path','E:\Datasets\OTB100\Skating2\img\','startFrame',1,'endFrame',473,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Surfer','path','E:\Datasets\OTB100\Surfer\img\','startFrame',1,'endFrame',376,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Toy','path','E:\Datasets\OTB100\Toy\img\','startFrame',1,'endFrame',271,'nz',4,'ext','jpg','init_rect',[0,0,0,0])...struct('name','Trans','path','E:\Datasets\OTB100\Trans\img\','startFrame',1,'endFrame',124,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Twinnings','path','E:\Datasets\OTB100\Twinnings\img\','startFrame',1,'endFrame',472,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Vase','path','E:\Datasets\OTB100\Vase\img\','startFrame',1,'endFrame',271,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};seqOTB50={struct('name','basketball','path','E:\Datasets\OTB100\basketball\img\','startFrame',1,'endFrame',725,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Biker','path','E:\Datasets\OTB100\Biker\img\','startFrame',1,'endFrame',142,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Bird1','path','E:\Datasets\OTB100\Bird1\img\','startFrame',1,'endFrame',408,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurBody','path','E:\Datasets\OTB100\BlurBody\img\','startFrame',1,'endFrame',334,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurCar2','path','E:\Datasets\OTB100\BlurCar2\img\','startFrame',1,'endFrame',585,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurFace','path','E:\Datasets\OTB100\BlurFace\img\','startFrame',1,'endFrame',493,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','BlurOwl','path','E:\Datasets\OTB100\BlurOwl\img\','startFrame',1,'endFrame',631,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','bolt','path','E:\Datasets\OTB100\bolt\img\','startFrame',1,'endFrame',350,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Box','path','E:\Datasets\OTB100\Box\img\','startFrame',1,'endFrame',1161,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Car1','path','E:\Datasets\OTB100\Car1\img\','startFrame',1,'endFrame',1020,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','car4','path','E:\Datasets\OTB100\car4\img\','startFrame',1,'endFrame',659,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','carDark','path','E:\Datasets\OTB100\carDark\img\','startFrame',1,'endFrame',393,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','carScale','path','E:\Datasets\OTB100\carScale\img\','startFrame',1,'endFrame',252,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','ClifBar','path','E:\Datasets\OTB100\ClifBar\img\','startFrame',1,'endFrame',472,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','couple','path','E:\Datasets\OTB100\couple\img\','startFrame',1,'endFrame',140,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Crowds','path','E:\Datasets\OTB100\Crowds\img\','startFrame',1,'endFrame',347,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','david','path','E:\Datasets\OTB100\david\img\','startFrame',300,'endFrame',770,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','deer','path','E:\Datasets\OTB100\deer\img\','startFrame',1,'endFrame',71,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Diving','path','E:\Datasets\OTB100\Diving\img\','startFrame',1,'endFrame',215,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','DragonBaby','path','E:\Datasets\OTB100\DragonBaby\img\','startFrame',1,'endFrame',113,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','dudek','path','E:\Datasets\OTB100\dudek\img\','startFrame',1,'endFrame',1145,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','football','path','E:\Datasets\OTB100\football\img\','startFrame',1,'endFrame',362,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','freeman4','path','E:\Datasets\OTB100\freeman4\img\','startFrame',1,'endFrame',283,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','girl','path','E:\Datasets\OTB100\girl\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human3','path','E:\Datasets\OTB100\Human3\img\','startFrame',1,'endFrame',1698,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human4','path','E:\Datasets\OTB100\Human4\img\','startFrame',1,'endFrame',667,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human6','path','E:\Datasets\OTB100\Human6\img\','startFrame',1,'endFrame',792,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Human9','path','E:\Datasets\OTB100\Human9\img\','startFrame',1,'endFrame',305,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','ironman','path','E:\Datasets\OTB100\ironman\img\','startFrame',1,'endFrame',166,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Jump','path','E:\Datasets\OTB100\Jump\img\img\img\','startFrame',1,'endFrame',122,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','jumping','path','E:\Datasets\OTB100\jumping\img\','startFrame',1,'endFrame',313,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','liquor','path','E:\Datasets\OTB100\liquor\img\','startFrame',1,'endFrame',1741,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','matrix','path','E:\Datasets\OTB100\matrix\img\','startFrame',1,'endFrame',100,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','motorRolling','path','E:\Datasets\OTB100\motorRolling\img\','startFrame',1,'endFrame',164,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Panda','path','E:\Datasets\OTB100\Panda\img\','startFrame',1,'endFrame',1000,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','RedTeam','path','E:\Datasets\OTB100\RedTeam\img\','startFrame',1,'endFrame',1918,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','shaking','path','E:\Datasets\OTB100\shaking\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','singer2','path','E:\Datasets\OTB100\singer2\img\','startFrame',1,'endFrame',366,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','skating1','path','E:\Datasets\OTB100\skating1\img\','startFrame',1,'endFrame',400,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Skating2-1','path','E:\Datasets\OTB100\Skating2\img\','startFrame',1,'endFrame',473,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Skating2-2','path','E:\Datasets\OTB100\Skating2\img\','startFrame',1,'endFrame',473,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','skiing','path','E:\Datasets\OTB100\skiing\img\','startFrame',1,'endFrame',81,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','soccer','path','E:\Datasets\OTB100\soccer\img\','startFrame',1,'endFrame',392,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','Surfer','path','E:\Datasets\OTB100\Surfer\img\','startFrame',1,'endFrame',376,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','sylvester','path','E:\Datasets\OTB100\sylvester\img\','startFrame',1,'endFrame',1345,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','tiger2','path','E:\Datasets\OTB100\tiger2\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','trellis','path','E:\Datasets\OTB100\trellis\img\','startFrame',1,'endFrame',569,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','walking2','path','E:\Datasets\OTB100\walking2\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','walking','path','E:\Datasets\OTB100\walking\img\','startFrame',1,'endFrame',412,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...struct('name','woman','path','E:\Datasets\OTB100\woman\img\','startFrame',1,'endFrame',597,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};% seqs=[seqIVT,seqVTD,seqOther]; %OTB-2013 seqs=[seqIVT,seqVTD,seqOther,seqOTB49_100]; %OTB100 % seqs = seqOTB50; %OTB50更改自己的路徑即可。
運行的時候,anno文件也會有問題。
參考博客,進行下載替換即可。
4.運行
到這一步,直接運行main_running.m就可以了。
出現的小問題總結:
1.運行出現1_VR, 1_woman: 1/1 error的情況:
建議:把configTrackers.m文件中的
只選擇:trackers = [trackers1];
2.由于 ‘.\results\results_OPE_CVPR13’ 不存在,無法創建 ‘soccer_VR.mat’。
建議:自己手動新建results_OPE_CVPR13文件夾。
為什么出現這個的錯誤:是應該在main_running.m中將
evalType=‘TRE’; %‘OPE’,‘SRE’,‘TRE’
修改為:evalType=‘OPE’; %‘OPE’,‘SRE’,‘TRE’
未修改結果存放路徑:finalPath = [’./results/results_’ evalType ‘_CVPR13/’];
常用地方代碼解釋:
main_running.m
21行:
evalType就是選擇跑OPE、TRE、SRE三種中的一種
28行:
運行跟蹤算法返回的結果存放在result文件夾下的目錄,結果的存放形式是mat
perfPlot.m
103行:
畫三種圖,進行選擇,可以只保留你想出的圖,其他的刪除。
105行:
這里原來是AUC,只能出成功率(success)圖,要想出精度(precision)圖的話,需要修改為threshold。這樣就可以兩種圖都出。
注意,源碼注釋中的threshold拼寫有誤。改正即可。
如何添加自己的算法呢?
簡單說一說吧。我還是建議大家使用python版本的,現在大多數都開始學習深學方面的目標跟蹤算法了,大多數都是python程序了,與matlab的接口不是很方便,涉及到MAT文件的轉化問題。還是比較麻煩的。(在python環境下得到txt轉化成mat文件,使用matlab程序進行畫圖)
1.在trackers路徑下新建要添加的文件夾,并且將算法代碼放入文件夾中。
2.最重要的一步就是需要寫一個將自己算法的輸入輸出對接到benchmark中的腳本run_tracker.m文件,打開其他算法時會發現每個算法中都會有run_tracker.m文件,例如run_CT.m run_CSK.m
這步很簡單,參照其它算法 例如:run_CT.m對比CT.m文件 看到第一行的輸入和最后一行的輸出進行了統一,
輸入:Seq代表著輸入的圖片,要將算法中輸入的圖片用Seq來代替
輸出:res代表跟蹤位置type 類型
3.修改完run_XXX.m之后。就是configtracker中加入算法的結構體。
struct(‘name’,‘xxx’,‘namePaper’,‘xxx’)
保存后就可以運行OTB的main_running.m獲取自己修改的算法結果了。
例如:
5.顯示
運行drawResultBB.m,跟蹤結果保存在tracker_benchmark_v1.0\tmp\imgs目錄中。
pathRes = '.\results\results_SRE_CVPR13\';% The folder containing the tracking results pathDraw = '.\tmp\imgs\';% The folder that will stores the images with overlaid bounding boxpathRes 為默認讀取mat文件
pathDraw 為圖片存儲位置。
seqs讀取configSeqs.m文件配置,trks讀取configTrackers.m文件配置。
可以修改configTrackers.m中的trackers包含的算法來看,跟蹤結果。
其中tracker排序是你在configTrackers.m文件中的tracker排序,對應的紅色是第一個tracker,綠色是第二個tracker,一次類推。
把自己的跟蹤算法,加入到trackers中就可以顯示跟蹤過程結果。
6.畫圖
注:如果更新算法得到新的跟蹤結果mat文件,在plot之前,請務必先刪除 tracker_benchmark_v1.0\perfMat\overall目錄下的所有.mat文件,否則數據將不會更新。
每次運行前先刪除上次perfMat/overall中的文件。
多個算法對比:
更改configTrackers.m,例如
畫圖的時候,如何出現如下的報錯:
原因是:缺少Bird1_TLD.mat文件。
因為原本的自帶的跟蹤結果mat文件只針對OTB50的訓練結果,如果自己訓練的是OTB100的,進行比較時,seq設置的也是OTB100,那么進行畫圖的時候,就直接調用seq相關的mat文件,而TLD算法沒有進行過OTB100的訓練就缺少相關序列結果mat,就沒辦法畫圖。
解決方法:
測試對比的算法,每一個都要在自己設置的seq下訓練出mat,就可以直接畫圖了。
具體方法在論文中有詳細介紹:
Wu Y, Lim J, Yang M H. Online object tracking: A benchmark [C]// CVPR, 2013.
Wu Y, Lim J, Yang M H. Object tracking benchmark [J]. TPAMI, 2015.
整理不易,喜歡點贊。
上一篇:2020版本的pycharm支持官方漢化了
下一篇:學習 PySOT(1)(介紹、配置、使用)
總結
以上是生活随笔為你收集整理的OTB Benchmark 学习(下载链接、评价指标、配置)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据Map Reduce 和 MPP数
- 下一篇: 目标跟踪测试工具OTB使用教程