OTB perfPlot.m 未定义函数或变量 ‘results’ 运行错误及解决

OTB perfPlot.m 未定义函数或变量 ‘results’ 运行错误及解决:

问题描述:

提示:用perfPlot.m进行自己得到跟踪结果的评估,已经将默认的OTB2013改为了OTB100,results文件夹中的results_SRE_CVPR13和results_TRE_CVPR13改为了自己的跟踪mat数据,configTrackers.m也按照CSDN博主「劲草浅躬行」原文链接:https://blog.csdn.net/lcb_coconut/article/details/76512707的方法进行了修改。运行时文件genPerfMat报错:

未定义函数或变量 ‘results’。
出错 genPerfMat (line 52)
idxNum = length(results);
代码如下:

function genPerfMat(seqs, trackers, evalType, nameTrkAll, perfMatPath)

pathAnno = './anno/';
numTrk = length(trackers);

thresholdSetOverlap = 0:0.05:1;
thresholdSetError = 0:50;

switch evalType
    case 'SRE'
        rpAll=['.\results\results_SRE_CVPR13\'];
    case {'TRE', 'OPE'}
        rpAll=['.\results\results_TRE_CVPR13\'];
end

for idxSeq=1:length(seqs)
    s = seqs{idxSeq};
    
    s.len = s.endFrame - s.startFrame + 1;
    s.s_frames = cell(s.len,1);
    nz	= strcat('%0',num2str(s.nz),'d'); %number of zeros in the name of image
    for i=1:s.len
        image_no = s.startFrame + (i-1);
        id = sprintf(nz,image_no);
        s.s_frames{i} = strcat(s.path,id,'.',s.ext);
    end
    
    rect_anno = dlmread([pathAnno s.name '.txt']);
    numSeg = 20;
    [subSeqs, subAnno]=splitSeqTRE(s,numSeg,rect_anno);
    
    nameAll=[];
    for idxTrk=1:numTrk
        
        t = trackers{idxTrk};
                 %load([rpAll s.name '_' t.name '.mat'], 'results','coverage','errCenter');
        
        load([rpAll s.name '_' t.name '.mat'])
        disp([s.name ' ' t.name]);
        
        aveCoverageAll=[];
        aveErrCenterAll=[];
        errCvgAccAvgAll = 0;
        errCntAccAvgAll = 0;
        errCoverageAll = 0;
        errCenterAll = 0;
        
        lenALL = 0;
        
        switch evalType
            case 'SRE'
                idxNum = length(results);
                anno=subAnno{1};
            case 'TRE'
                idxNum = length(results);
            case 'OPE'
                idxNum = 1;
                anno=subAnno{1};
        end
        
        successNumOverlap = zeros(idxNum,length(thresholdSetOverlap));
        successNumErr = zeros(idxNum,length(thresholdSetError));
        
        for idx = 1:idxNum
            
            res = results{idx};
            
            if strcmp(evalType, 'TRE')
                anno=subAnno{idx};
            end
            
            len = size(anno,1);
            
            if isempty(res.res)
                break;
            end
            
            if ~isfield(res,'type')&&isfield(res,'transformType')
                res.type = res.transformType;
                res.res = res.res';
            end
            
            [aveCoverage, aveErrCenter, errCoverage, errCenter] = calcSeqErrRobust(res, anno);
            
            for tIdx=1:length(thresholdSetOverlap)
                successNumOverlap(idx,tIdx) = sum(errCoverage >thresholdSetOverlap(tIdx));
            end
            
            for tIdx=1:length(thresholdSetError)
                successNumErr(idx,tIdx) = sum(errCenter <= thresholdSetError(tIdx));
            end
            
            lenALL = lenALL + len;
            
        end
        
        
        if strcmp(evalType, 'OPE')
            aveSuccessRatePlot(idxTrk, idxSeq,:) = successNumOverlap/(lenALL+eps);
            aveSuccessRatePlotErr(idxTrk, idxSeq,:) = successNumErr/(lenALL+eps);
        else
            aveSuccessRatePlot(idxTrk, idxSeq,:) = sum(successNumOverlap)/(lenALL+eps);
            aveSuccessRatePlotErr(idxTrk, idxSeq,:) = sum(successNumErr)/(lenALL+eps);
        end
        
    end
end
%
dataName1=[perfMatPath 'aveSuccessRatePlot_' num2str(numTrk) 'alg_overlap_' evalType '.mat'];
save(dataName1,'aveSuccessRatePlot','nameTrkAll');

dataName2=[perfMatPath 'aveSuccessRatePlot_' num2str(numTrk) 'alg_error_' evalType '.mat'];
aveSuccessRatePlot = aveSuccessRatePlotErr;
save(dataName2,'aveSuccessRatePlot','nameTrkAll');


使用默认的代码运行configTrackers.m是没有问题的。

解决方法:

matlab可以通过load读取mat文件中的变量,我这里面简单把raw results从txt直接转化为mat文件了,没有在文件内定义results变量。

应采用如下python代码

import os
import scipy.io as scio
import numpy as np

file = '/home/hulu/Desktop/postgraduate2/otb/anno2/'  #your txt path
savefile = '/home/hulu/Desktop/postgraduate2/otb/gd_mat2/'  # your mat file path
pathlist = os.listdir(file)
# print(pathlist)

for i in range(len(pathlist)):
    path = os.path.join(file, pathlist[i])
    for j in range(len(pathlist[i])):
        if pathlist[i][j] == '.':
            save = pathlist[i][:j]
            break
    savepath = savefile + save + '_GD.mat'  ## your tracker name (here we use SiamRPN++)

    f = open(path)
    data = f.readlines()
    result = []
    for j in range(len(data)):
        x = data[j].split('\t')
        # print(x)
        x[3] = float(x[3][:-1])
        x[0] = float(x[0])
        x[1] = float(x[1])
        x[2] = float(x[2])
        result.append(x)

    res = {}
    res['res'] = result
    res['type'] = 'rect'
    Mat = {'res': res['res'], 'type': 'rect', 'len': len(res['res']), 'annoBegin': 1, 'startFrame': 1}
    M = np.array([Mat])
    Mat2 = {'__header__': 'b', '__version__': 1.0, '__globals__': [], 'results': M}
    scio.savemat(savepath, Mat2)
    print(data)


将txt格式的跟踪结果文件转化为具有正确格式的mat文件,再进行曲线绘制或进行跟踪可视化。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值