累积在MATLAB中的投票

时间:2013-10-04 10:26:56

标签: matlab hashmap object-recognition

首先,我的问题有一点背景:

我正在使用几何散列技术构建对象识别系统。我的哈希表由基础三元组确定的模型中的点的仿射坐标索引(允许任何学习对象的仿射不变表示)。每个哈希表条目都是一个结构:

entry = struct('ModelName', modelName, 'BasisTriplet', [a; b; c])];

现在,从图像点提取任意基础三元组,然后相对于该基础计算所有其他点的仿射坐标,并将其用作哈希表的索引。对于此哈希箱中存在的每个条目,将对modelName和基础三元组进行投票。 在检查所有点之后,将具有足够高票数的模型及其相应的基础三元组作为对象的候选者,并且执行进一步的验证步骤。


但我不确定投票的最有效方法是什么。目前我正在使用动态单元阵列,每次投票选择新模型和基础三元组时,都会在阵列中添加一行。否则,现有候选人的投票数会增加。

    for keylist = 1:length(keylist)
        % Where keylist is an array of indicies to the relevant keys to look up
        % xkeys is the n by 2 array of all of the keys in the hash table
        % Obtain this hash bin
        bin = hashTable(xkeys(keylist(i), 1), xkeys(keylist(i), 2));
        % Vote for every entry in the bin
        for entry = 1:length(bin)
            % Find the index of this model/basis in the voting accumulator
            indAcc = find( strcmp(bin.ModelName, v_models(:, 1)) & myIsEqual(v_basisTriplets, bin.BasisTriplet) );
            if isempty(indAcc)
                % If entries do not exist yet, Add new entries
                v_models = [v_models; {bin.ModelName, 1}]; 
                v_basisTriplets = cat(3, v_basisTriplets, bin.BasisTriplet);
            else
                % Otherwise increment the count
                v_models(indAcc, 2) = v_models(indAcc, 2)+1;
            end
        end
    end

有一个单独的3D数组(v_basisTriplets),其中2D基础数组连接并沿第3维索引。我确实在单元阵列中也有这些基础三元组,但是我很难在这个单元阵列中搜索2D数组。 myIsEqual函数只搜索第三维并检查每个索引处的2D数组是否相等,返回一个数组相等的1D向量,以便在查找中使用。

function ind = myIsEqual(vec3D, A)

    ind = zeros(size(vec3D, 3), 1);
    for i = 1:size(vec3D, 3)
        ind(i) = isequal(vec3D(:, :, i), A);
    end

这肯定不是最有效的方式。我立刻就会发现,初始化数组以预先存储投票会更有效率。然而,总的来说,有更好的方法来解决这个问题吗?我需要尝试找到最有效和最优雅的投票方式,因为通常需要检查数百个点,时间才有价值。

由于

1 个答案:

答案 0 :(得分:0)

如果您只考虑时间效率,请考虑使用4d矩阵。

尺寸为:

  • 模型
  • coordinateA
  • coordinateB
  • coordinateC

根据此矩阵大小与您检查的点数之间的比率,请考虑使用稀疏矩阵。

请注意,特别是如果你不能使用稀疏数组,这种方法可能是内存效率低下的,因此可能是不可行的。