vot是面向跟蹤算法的全球挑戰賽,每年都會舉辦一次,組委會制定了一套科學的跟蹤器評價名額和方法用于送出作品的評分,該工具就是vot-toolkit,是一個基于Matlab的工具集。
挑戰賽的官網是 http://votchallenge.net/
vot-toolkit在github提供下載下傳 https://github.com/votchallenge/vot-toolkit.git
除了vot-toolkit本身以外,還需要下載下傳一個叫TraX的庫。Trax主要作用就是建立各種語言跟蹤器與vot-toolkit的傳輸協定,友善我們對不同語言寫的tracker進行統一分析。
TraX https://github.com/votchallenge/trax.git
在官網中有對比賽、資料集、各種tracker的詳細介紹,雖然配置過程在文檔中也有介紹,但從我個人和github的issue看,不少人還是有點問題,是以将個人的配置過程和遇到的坑記錄下來。
運作環境
Windows10 x64,其中Matlab版本未Matlab 2016b,VS版本是VS2015
程式下載下傳
下載下傳vot-toolkit-master檔案并解壓,其中中包含很多檔案夾,我們需要建立一個檔案夾名為native,下載下傳traX-master并解壓,将traX-master檔案夾改名為traX放進native中,這樣程度就準備完成了。
資料集準備
matlab程式運作起來以後會自動檢測資料集的存在,如果沒有資料集會自動下載下傳,考慮到牆的問題還是最好提前下載下傳,畢竟後期可能會增加自己的資料集。
資料集需要在vot-toolkit-master主檔案夾中建立sequences檔案夾,并放入資料。
資料的格式需要按照工具的讀取形式,很多教程寫的不清楚。
sequences的目錄結構應該是這樣
- sequences
|-- ball
|-- color
|-- 00000001.jpg
|-- 00000002.jpg
|-- ...
|-- camera_motion.tag
|-- groundtruth.txt
|-- ...
|-- car
|-- book
|--...
|--lists.txt
其中lists.txt是一個文本格式文檔,記錄了想要處理的資料集名稱,vot-kit從這個文檔讀取檔案夾名來依次處理。
建立workspace
這個過程說白了就是根據你的需要自動産生一些代碼用來跑資料集用,真正做到一鍵處理。這些代碼來自于主檔案夾下的模闆(其實這樣做增加了複雜度,一開始還不容易看明白)。
執行操作如下:
- 運作toolkit_path.m,添加路徑
- 運作./workspace/workspace_create.m,注意這一步會在目前目錄下建立新增的m檔案,一般在執行前将主目錄設為目前目錄好一些。
執行時根據需要選擇 跟蹤器名 - 資料集 - 程式設計語言 即可,選錯了也沒關系,可以直接修改生成的m檔案。假設我們跟蹤器的是ncc-vot2015
配置跟蹤器接口
-
Matlab
如果跟蹤器是Matlab寫的,我們以.\tracker\examples\matlab 下的ncc為例進行說明
預設的tracker_ncc.m接口如下:
error('Tracker not configured! Please edit the tracker_ncc.m file.'); % Remove this line after proper configuration
% The human readable label for the tracker, used to identify the tracker in reports
% If not set, it will be set to the same value as the identifier.
% It does not have to be unique, but it is best that it is.
tracker_label = [];
% For MATLAB implementations we have created a handy function that generates the appropritate
% command that will run the matlab executable and execute the given script that includes your
% tracker implementation.
%
% Please customize the line below by substituting the first argument with the name of the
% script (not the .m file but just the name of the script as you would use it in within Matlab)
% of your tracker and also provide the path (or multiple paths) where the tracker sources
% are found as the elements of the cell array (second argument).
tracker_command = generate_matlab_command('<TODO: set script name>', {'<TODO: set script path>'});
tracker_interpreter = 'matlab';
% tracker_linkpath = {}; % A cell array of custom library directories used by the tracker executable (optional)
寫的很清楚了,第一步注釋掉首行的error,label可改可不改,主要是把調用接口填正确。
Matlab 的調用接口其實就是m檔案路徑,第一處填m檔案的檔案名,第二處填所在檔案夾。
tracker_command = generate_matlab_command('ncc', {'D:\GitLibray\vot-toolkit-master\tracker\examples\matlab'});
直接執行run_test.m,如果程式正常運作會讓你選擇測試資料集名,稍等待一會就彈出跟蹤圖像和标準框及跟蹤框的位置,滑鼠點選切下一幀。test通過以後,後續的試驗和報告等應該不會有什麼問題了。這樣Matlab跟蹤器的設定就完成了。
其實\vot-toolkit-master\tracker\examples下已經将支援的demo接口給出了,是以當我們想再次設定跟蹤器時可以不需要跑一遍workspace_create,直接修改對應的tracker_xx.m就行了。
-
Python
和Matlab跟蹤器的配置流程是一樣的,需要注意的地方是接口檔案的配置
tracker_label = 'Demo_py';
% Note: be carefull for double backslashes on Windows
tracker_command = generate_python_command('python_ncc', ...
{'D:\\GitLibray\\vot-toolkit-master\\tracker\\examples\\python', ... % tracker source and vot.py are here
'D:\\GitLibray\\vot-toolkit-master\\native\\trax\\support\\python'});
tracker_interpreter = 'python';
tracker_linkpath = {'D:\\GitLibray\\vot-toolkit-master\\native\\trax\\build\\Release'};
這裡幾個需要注意的tips:
- tracker_command的構成是py跟蹤器檔案名 + 跟蹤器路徑 + traX工具的python接口路徑
- tracker_interpreter 是解釋器名稱,我的電腦隻安裝了python-anaconda3.7,解釋器就叫python,這個其實就是幫你在shell中執行python腳本,如果跟蹤器是python的,那python環境應該是沒有問題的。
- Matlab其實也是python的這種執行方式,我們跑Matlab試驗時會打開一個指令行版本的Matlab。
- 最關鍵的一點,python運作時調用的traX需要c++庫的支援,是以需要預先編譯好traX。
編譯traX需要使用cmake生成VS工程檔案sln,然後在vs中編譯出traX的庫檔案(trax.lib,trax.dll),tracker_linkpath就是指向這個路徑的。
配置完成後,執行run_test.m,後續就和上述一樣了。
-
C/C++
原生程式的配置是最簡單的,Matlab程式其實就是幫忙執行跟蹤器的exe檔案,配置如下(是的就一行):
tracker_command = 'D:\\GitLibray\\vot-toolkit-master\\tracker\\examples\\native\\cppDemo\\x64\\Release\\cppDemo.exe';
我編譯c++的NCC例子時發現cmake失敗的情況,原因是traX的配置不成功導緻cmake無法自動生成,找了半天沒找到原因,後來幹脆手動生成。
如果隻想跑demo,編譯時加入的c++檔案是vot.h和ncc.cpp,需要手動配置opencv和traX庫,這個不用說了吧。是以有的時候簡單的問題過度考慮自動化反而影響效率。
通過C++工程,我們很容易就知道traX和整個程式是怎麼互相依賴的。
這樣,我們就将vot-toolkit支援的語言都配置了一遍,我們得到的認識是vot-toolkit通過tracker_command來自動化調用跟蹤器 腳本/原生程式,生成跟蹤結果,并通過traX傳輸到matlab端進行顯示和分析出圖。我覺得有這樣的認識後,一些更複雜的tracker依賴應該也能理清楚了。
配一張test的圖:

PS:鑒于可能的編譯問題,這裡把traX的編譯過程放上來供大家參考。
首先從github下載下傳traX庫,安裝了git的直接clone,沒有就直接下載下傳壓縮包。工程是用cmake管理的。
第二部,安裝cmake,過程略。然後按照下圖填寫,這些其實是基本的cmake-gui使用。
點選configure進行預配置,
紅色的條目就是需要我們進一步配置的了,其實如果不打算深入研究traX代碼就不用管了,繼續點選configure完成配置。好了全白了。再點選生成工程,就完成了cmake工程的本地化,可以用vs繼續編譯了。
修改為release模式後,在VS解決方案右擊選擇生成解決方案,這樣就完成了traX庫的編譯。
在\trax-master\build\Release目錄下就可以找到編譯好的動态庫。
已經完成一半了,後面就需要用這個traX庫來編譯我們自己的跟蹤器。以我上面使用的NCC跟蹤器為例。
建立一個VS工程,在包含目錄中添加traX的include檔案夾,庫目錄添加我們剛剛編譯好的lib庫所在檔案夾,連結器填上trax.lib,并把這兩個檔案加入工程,編譯出跟蹤器的exe可執行程式。
總結:traX的使用與一般的C++開源庫使用沒有什麼差別,也不需要過多的配置
,從這裡可以看出,traX庫是我們的跟蹤器和vot工具溝通的橋梁,是以我們的跟蹤器需要包含這個庫。附上使用opencv自帶的kcf跟蹤器的main函數,非常簡單。
int main(int argc, char** argv) {
TrackerKCF::Params para;
para.detect_thresh = 0.25;
para.max_patch_size = 96*96;
Ptr<TrackerKCF> tracker = TrackerKCF::create(para);
VOT vot;
cv::Rect initialization;
initialization << vot.region();
cv::Mat image = cv::imread(vot.frame());
Rect2d initialization2d(initialization.x, initialization.y, initialization.width, initialization.height);
tracker->init(image, initialization2d);
rectangle(image, initialization2d,Scalar(255,0,0));
imshow("", image);
waitKey(1);
cv::Rect2d rect;
while (!vot.end()) {
cout << para.detect_thresh;
string imagepath = vot.frame();
if (imagepath.empty()) break;
cv::Mat image = cv::imread(imagepath);
bool bsuc = tracker->update(image, rect);
if (!bsuc)
{
cout << "跟蹤失敗!" << endl;
return -1;
}
cv::Rect r(rect.x, rect.y, rect.width, rect.height);
vot.report(r, 1);
}
唯一需要注意的就是兩點,一個是跟蹤器的接口必須包含初始化和更新。第二必須使用vot.region()來初始化,跟蹤完成後需要用vot.report(r, 1);來向vot工具傳輸結果。
完結。