OTB公式評価コードpythonバージョン-独自のトラッカーを評価し、他のトラッカーと比較します

OTB公式評価コードpythonバージョン-独自のトラッカーを評価し、他のトラッカーと比較します


OTBデータセットは、ターゲット追跡の分野におけるベンチマーク評価データセットです。多くの論文がこれを使用して実験を行い、独自の実験結果を示しているため、数日かけて慎重に調査したところ、誰もがOTBツールキットプロセスには次のような問題があります。

  • 私は自分のトラッカー(特に現在Pythonで書かれています)を持っていますが、このデータセットで結果を実行するにはどうすればよいですか?
  • 自分の結果を他のトラッカーの結果と比較するにはどうすればよいですか?

最初はこの2つの問題に悩まされていましたが、少し投げた後、ようやく解決策を思いつきました。この記事を読んだ後は、上記の2つの問題も解決できます。

コード環境の準備

移動し、公式ウェブサイトのホームページを見ることができます内のコードを評価するMATLABの環境、そして彼は、MATLABは、学んだと感じたものの、まだ多くは、彼が選んだので、検討してピックアップする必要がPythonのバージョンになりましたそれは公式のラインで、アセスメントのを出す、また権威がありますが、どの言語の結果がより良いか、これはさらなる実験を必要とします。
注:個人的には、matlabバージョンは遅かれ早かれ理解されると思います。LaSOTなどのより大きなデータセットでもmatlabの下にあるため、OTBベンチマークのmatlabバージョンを理解することは評価に非常に役立ちます。残りのデータセットの。さて、ナンセンスな話をしないで、乾物を手に入れましょう!

環境への設置

最初にコードをダウンロードします:https//github.com/jwlim/tracker_benchmark、41.6Mあります。問題が発生した場合は、ここアクセスできますコードにはいくつかのバグがありますしばらくお待ちください。私はwin10でそれをテストしました、ubuntuは問題ないはずです!

README.mdでわかるように、インストールする必要のあるパッケージは次のとおりです。Matlab Engine for python、matplotlib、numpy、Python Imaging Library (PIL)このコードはpython 2.7.10下にあり、anacondaを使用してconda環境をインストールできます。ubuntuの
下のanacondaの上位バージョンではpython2.7.10が見つかりません。 、conda Search pythonを介して、最低値もpython2.7.13であることがわかり、証明も可能です。

conda create -n py27 python=2.7.10 matplotlib=2.2.2 numpy=1.14.3 pillow=5.1.0
# 这样就安装好了一个名字为'py27'的conda环境,激活一下:
conda activate py27

環境が作成されたら、変更が必要ないくつかのバグを確認します。

  • BUTIL / load_results.pyのライン63、あなたがする必要があるattr = Attribute(**j)変更attr = attr = Score(**j)コードにはAttributeクラスが存在しないためにそれを。
  • BUTIL / eval_results.py 84行が全く見つからないprecisionList:、それは55-56の間に行を挿入する必要があるprecisionList = []ように、くぼみ及びライン55を

データセットの準備

このデータセットは、評価のニーズに合わせて特定の形式で配置されています。公式Webサイトでシーケンスを1つずつダウンロードするのは適切ではありません。準備には、次の3つの方法があります。

  1. 行への実行で42回run_trackers.py:butil.setup_seqs(loadSeqs)はこのURLに移動してダウンロードします:http://cvlab.hanyang.ac.kr/tracker_benchmark/seq_new/seqname.zip公式ウェブサイトのダウンロードアドレスはhttp://cvlab.hanyang.ac.kr/tracker_benchmark/seq/seqname.zipです。ここでの新しいアドレスは、imgファイルとgroundtruth_rect.txtファイルだけでなく、一部のシーケンスディレクトリのinit_omit.txtファイルです。ネットワークが利用可能な場合は、この方法でダウンロードします。最もトラブルフリー。
  2. あなたはそれダウンロードするために私に行くことができます。私は整理されたデータをパッケージ化しました:C通貨がそれをサポートすることを願っています、もちろんそれは任意です。ダウンロードリンク取得するためここに行くこともできます
  3. トラフィックを無駄にしたくない場合は、[公式Webサイトにパッケージ化されているシーケンスは次のとおりです。一般的なターゲット追跡データセットのダウンロードリンクが整理(更新)されています]前に、公式Webサイトでシーケンスを1つずつダウンロードしておく必要があります。次のように変更します(主にinit_omit.txt)およびいくつかの特別なシーケンス):
  • コピーしJogging、次のIMGをするJogging-1合計Jogging-2の下で、コード内のデータコピーgroundtruth_rect.1.txtjogging-1.txtJogging-1隣、とにそれらの名前を変更groundtruth_rect.txtし、それぞれinit_omit.txt、同じようにgroundtruth_rect.2.txtjogging-2.txtコピーJogging-2隣、groundtruth_rect.txtにそれらの名前を変更合計それぞれinit_omit.txt
  • Skating2IMGコードデータにコピーSkating2-1し、Skating2-2下側、groundtruth_rect.1.txtにコピーSkating2-1次、リネームgroundtruth_rect.txt、同様groundtruth_rect.2.txtにコピーSkating2-2次は、改名しますgroundtruth_rect.txt
  • コピーIMGHuman4下記の一番下のコード内のデータを、その後にコピー底面とに名前を変更Human4-2groundtruth_rect.2.txtHuman4-2groundtruth_rect.txt
  • matlabバージョンのbenchmark_v1.0.zipにinitOmitフォルダーがあります[zip全体をダウンロードしたくない場合は、ここにアクセスしてinitOmitをダウンロードできます]。対応する27のシーケンスをのレコードとして使用することはできません。対応するシーケンスにコピーされ、すべての名前がに変更されている限り、初期化フレームinit_omit.txt

これで、プリコードとデータセットの準備が整いました。

トラッカーを実行する

結果フォーマットの準備

私は、トラッカーが書かれている言語に関係なく、予測結果は、シーケンス内のオブジェクトの各フレームの座標であり、OTBでGTにBBoxはイエスの形態であることを信じてltwh、私は与える例をここに私はありますブログ[ siamfc-pytorchコードの説明(3):Demo&track ]結果:
追跡結果ファイルのディレクトリ構造(SiamFCの下に100個のtxtとtimesフォルダーがあり、これは次のutils.pyといくつかの特別なシーケンスの名前に反映されていますHuman4、Jogging.1、Jogging.2、Skating2.1、Skating2.2):

├── SiamFC
│   ├── Basketball.txt
│   ├── ...
│   ├── Woman.txt
│   ├── times
│   │   ├── Basketball_time.txt
│   │   ├── ...
│   │   ├── Woman_time.txt

各シーケンスtxtファイルには、次の図に示すように、Basketball.txtなどのN×4座標が含まれています。
Basketball.txtの結果が表示されます

jsonファイルを生成して描画します

コードのルートディレクトリに二つの新しいPYファイルを作成します。save_to_json.pyそしてutil.py、それぞれ、次のコードをコピー、txt_Results独自のパスに置き換える必要があり:
save_to_json.pyを:

from scripts import *
from config import *
from util import compare_name, calcu_speed, load_seq_result


loadSeqs = 'tb100'
evalType = 'OPE'
tracker = 'SiamFC'
# replace your own path
txt_Results = 'C:\\Users\\Ezra\\Desktop\\SiamFC'

if SETUP_SEQ:
    print 'Setup sequences ...'
    """
    Doing in setup_seqs:
    1. check integrity of data, if not, download all
    2. write cfg.json and attrs.txt in each seq directory
    """
    butil.setup_seqs(loadSeqs)

# 'otb50', 'otb100' transform to corresponding seqs name list
seqNames = butil.get_seq_names(loadSeqs)
# load from saved cfg.json and return list contain Class Sequence instances
seqs = butil.load_seq_configs(seqNames)

resNames = os.listdir(txt_Results)
resNames.remove('times')
resNames = [res_name[:-4] for res_name in resNames]
print "=========================================================="

isSameName = compare_name(resNames, seqNames)

if isSameName:
    for s in seqs:
        seqResults = []
        res_type = 'rect'
        # fps is optinal
        fps = round(calcu_speed(txt_Results, s.name), 3)
        boxes = load_seq_result(txt_Results, s.name)
        res = boxes.tolist()
        # for OPE
        r = Result(tracker, s.name, s.startFrame, s.endFrame,
                   res_type, evalType, res, fps, None)
        seqResults.append(r)
        
        if SAVE_RESULT:
            print "Now write to results/{0}/{1}/{2}.json".format(evalType, tracker, s.name)
            # 'results/evalType/Tracker/seqName.json'
            butil.save_seq_result(seqResults)

    print "Have written all seqs!"

util.py:

import os
import numpy as np

DIFF_NAMES = ('Human4-2', 'Jogging-1', 'Jogging-2',
                  'Skating2-1', 'Skating2-2')

def _convert_name(oldname):
    newname = None
    if oldname == 'Human4-2':
        newname = 'Human4'
    elif oldname == 'Jogging-1':
        newname = 'Jogging.1'
    elif oldname == 'Jogging-2':
        newname = 'Jogging.2'
    elif oldname == 'Skating2-1':
        newname = 'Skating2.1'
    elif oldname == 'Skating2-2':
        newname = 'Skating2.2'

    return newname


def compare_name(resnames, seqnames):
    flag = True
    assert len(resnames) == len(seqnames),\
        'The length between resnames and seqnames is not same!'

    for seqName in seqnames:
        if seqName in DIFF_NAMES:
            seqName = _convert_name(seqName)

        if seqName not in resnames:
            print seqName + ' is not in resnames'
            flag = False
            break
    return flag

def calcu_speed(timetxtdir, seq_name):
    speed = 0.0

    if seq_name in DIFF_NAMES:
        seq_name = _convert_name(seq_name)

    time_file = os.path.join(
        timetxtdir, 'times/%s_time.txt' % seq_name)
    if os.path.isfile(time_file):
        times = np.loadtxt(time_file)
        times = times[times > 0]
        if len(times) > 0:
            speed = np.mean(1. / times)
    return speed

def load_seq_result(boxtxtdir, seq_name):
    if seq_name in DIFF_NAMES:
        seq_name = _convert_name(seq_name)

    record_file = os.path.join(
        boxtxtdir, '%s.txt' % seq_name)
    boxes = np.loadtxt(record_file, delimiter=',')
    return boxes

その後:

  • それを実行するsave_to_json.pyresults/OPE/は、各シーケンスのjsonファイルであるSiamFCフォルダーがあります。
  • 次に実行しpython run_trackers.py -t SiamFC -s tb100 -e OPE、中間をするように求められますInput Test name :入力してtb100tb50cvpr13図面の最終用途は、ALLにおける結果であるため、一部という名前のフォルダとして、フォルダ生成scores_tb100、11およびファイル内SiamFCフォルダには、JSON ALL.jsonフォルダを属性。 json

実行後、次の結果が得られます。

Result of Sequences	 -- 'SiamFC'
	'Basketball'   	aveCoverage : 38.878% 	aveErrCenter : 75.946
     ...
	'Woman'        	aveCoverage : 50.644% 	aveErrCenter : 4.957
Result of attributes	 -- 'SiamFC'
	'ALL' 	overlap : 64.6% 	failures : 3.4
	'BC' 	overlap : 63.3% 	failures : 4.9
	'DEF' 	overlap : 59.8% 	failures : 4.2
	'FM' 	overlap : 63.8% 	failures : 3.7
	'IPR' 	overlap : 61.8% 	failures : 3.9
	'IV' 	overlap : 61.6% 	failures : 4.3
	'LR' 	overlap : 64.7% 	failures : 4.3
	'MB' 	overlap : 67.2% 	failures : 3.3
	'OCC' 	overlap : 63.3% 	failures : 4.0
	'OPR' 	overlap : 62.6% 	failures : 3.8
	'OV' 	overlap : 61.3% 	failures : 5.0
	'SV' 	overlap : 63.8% 	failures : 3.6
  • 次に、それを実行python draw_graph.pyして成功プロットを取得します。デフォルトでは、上位10個のみが描画され、残りは灰色の点線で描画されます。精度プロットについても同じことが言えます。独自のトラッカーの結果がこれを追加して、他のトラッカーと比較します。ここでのスコアは100倍になっていることに注意してください[ここでのトレーニング結果は比較的貧弱です。参考のために、GOT-10kのExperimentOTBの0.529と大差ありません]。
    OPE_tb100_success_siamfc
  • 次に、それを実行python draw_graph.py precisionする、Precision Plotを取得でき
    OPE_tb100_precision_siamfc
    ます。これで完了です。欠陥がある場合は批判して連絡してください。役に立ったと感じたら、親指を立ててください。これにより、モチベーションとブログが向上します〜

2020/05/09更新:
util.pyの59行目のdtype = intを削除します。2020/ 05/20更新:2つの言語の公式評価結果に矛盾がないか試してみたいです。matlabの結果私のブログ[ siamfc-pytorchコードの説明(3):demo&track ]からのものです。.matファイルを.txtファイルに変換し、これで再試行しましたが、Pythonの結果がそうではないとは思えません。 matlabと同じくらい良い:成功:0.582-> 0.5788;精度:0.771-> 0.76。次の図はその証拠です:
マットをtxtに変換した後の評価結果
ポイントが削除される理由がわかりません。それほど大きな違いはないはずです。txtへのマット変換の精度が失われないことを保証します。これは、Pythonでの計算の詳細が原因です。とmatlabは同じではありませんか?または、2つの計算保持精度が異なりますか?
2020/05/24アップデートを試した人にも注意してくださいマットtxtのコードを提供しください。具体的な使用法については私のブログを参照してください:[ siamfc-pytorchコードの説明(3):デモとトラック]:

clear all;clc;
root = 'D:...\your_txt_path\';
dst = 'D:...\your_mat_save_path\';
if ~exist(dst, 'dir')
    mkdir(dst);
end
% 下面这几句是为了获取一个目录下的txt文件名列表
fileFolder = fullfile(root);
dirOutput = dir(fullfile(fileFolder, '*.txt'));
fileNames={dirOutput.name}; % 1*100 cell
numFile = length(fileNames);
for idxFile = 1:numFile
    path = [root  fileNames{idxFile}];
    res = load(path);
    [seq_l, xywh] = size(res);
    results{1}.res = res;
    results{1}.type = 'rect';
    results{1}.len = seq_l;
    seq_name = fileNames{idxFile}(1:end-4);
    sprintf(['now trans ' seq_name ' from txt to mat'])
    % 将需要的结构体结果写成mat格式
    save([dst seq_name '_SiamfcppCiresnet22Atten.mat'], 'results');    
end

2020/07/06更新:マットのコードをtxt入れて、必要に応じて使用できます:

root = 'C:\Users\Ezra\Desktop\results_SiamFC-3s_OTB-100\';
dst = 'C:\Users\Ezra\Desktop\SiamFC-3s_OTB-100-txt\';
if ~exist(dst, 'dir')
    mkdir(dst);
end

fileFolder = fullfile(root);
dirOutput = dir(fullfile(fileFolder, '*.mat'));
fileNames={
    
    dirOutput.name}; % 1*100 cell
numFile = length(fileNames);
for idxFile = 1:numFile
    path = [root  fileNames{
    
    idxFile}];
    matfile = load(path);
    OPE_matfile = matfile.results{
    
    1};
    bbox = OPE_matfile.res;
    seq_name = fileNames{
    
    idxFile}(1:end-13);
    sprintf(['now trans ' seq_name ' from mat to txt'])
    dlmwrite([dst seq_name '.txt'],bbox,'precision','%.4f');    
end

ボーナス

具体的な評価方法は、この論文で紹介されています。

おすすめ

転載: blog.csdn.net/laizi_laizi/article/details/105909070