在 MATLAB 中累积选票



首先,我的问题的一些背景:

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

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

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


然而,我不确定投票的最有效方法是什么。目前我使用的是动态单元格数组,每次投票支持新模型和基础三元组对时,都会向数组添加一行。否则,现有候选人的票数将递增。

    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

这肯定不是最有效的方法。我立即可以看到,事先初始化数组以存储选票会更有效。但是,一般来说有更好的方法来解决这个问题吗?我需要尝试找到最有效和最优雅的投票方式,因为通常有数百个点需要检查,时间很宝贵。

谢谢

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

尺寸为:

  • 坐标A
  • 坐标B
  • 坐标C

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

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

相关内容

  • 没有找到相关文章

最新更新