1

画像内の複数の ROI (関心領域) から標準の Bag of Visual Words ヒストグラムを計算するための既存の関数/ツールを探しています。説明させてください:

(1) 各「ピクセル」が整数を運ぶ画像があるとします: 1 ... K そのような各「ピクセル」は次の情報を持っています

  1. x,y 座標
  2. 1 から K までの値

(2) 大量の固定サイズ領域が次の形式のすべての画像からサンプリングされているとします。

  1. (x1,y1) - 上、左の座標
  2. (x2,y2) - 下、右の座標

(3) すべての領域について: その領域に含まれる「ピクセル」値の発生回数をカウントする K ビン ヒストグラムを計算します。

MATLAB で次の関数を実装しましたが、コードに複数の for ループがあるため、非常に遅くなります。

function [H words] = sph_roi( wind, tree, desc, feat, bins )
% FUNCTION computes an SPH histogram for a collection of windows. Spatial
% information is captured by splitting the window in bins horizontally.
%
%   [H words] = sph_roi( obj_wind, tree, desc, feat, [ bins ] );
%
% INPUT :
%   wind        - sampled ROI windows
%                   [left_x, top_y, right_x, bottom_y] - see sample_roi()
%   tree        - vocabulary tree
%   desc        - descriptors matrix
%   feat        - features matrix
%   bins        - number of horizontal cells (1=BOVW, 2... SPH)
%                   by default set to the multiples of window height.
%
% OUTPUT :
%   H           - SPH histograms
%   words       - word IDs found for every descriptor
%

verbose = 0;

% input argument number check
if nargin < 4
error( 'At least 4 input arguments required.' );
end

% default number of horizontal cells
if nargin < 5
bins = -1;  % will be set in multiples of each window height corresp.
end

% number of windows
num_wind = size( wind, 1 );

% number of visual words
num_words = tree.K;

% pre-compute all visual words
words = vl_hikmeanspush( tree, desc );

% initialize SPH histograms matrix
H = zeros( num_words * bins, num_wind );

% compute BOVW for each ROI
for i = 1 : num_wind

if verbose == 1
    fprintf( 'sph_roi(): processing %d / %d\n', i, num_wind );
end

% pick a window
wind_i = wind( i, : );

% get the dimensions of the window
[w h] = wind_size( wind_i );

% if was not set - the number of horizontal bins
if bins == -1
    bins = round( w / h );
end

% return a list of subcell windows
scw = create_sph_wind( wind_i, bins );

for j = 1 : bins

    % pick a cell
    wind_tmp = scw( j, : );

    % get the descriptor ids falling in that cell
    ids = roi_feat_ids( wind_tmp, feat );

    % compute the BOVW histogram for the current cell
    h = vl_hikmeanshist( tree, words(ids) );

    % assemble the SPH histogram in the output matrix directly
    H( 1+(j-1)*num_words : j*num_words, i ) = h( 2:end );

end

end

function ids = roi_feat_ids( w, f )
% FUNCTION returns those feature ids that fall in the window.
%
%   ids = roi_feat_ids( w, f );
%
% INPUT :
%   w   - window
%   f   - all feature points
%
% OUTPUT :
%   ids - feature ids
%

% input argument number check
if nargin ~= 2
error( 'Two input arguments required.' );
end

left_x = 1;
top_y = 2;
right_x = 3;
bottom_y = 4;

% extract and round the interest point coordinates
x = round( f(1,:) );
y = round( f(2,:) );

% bound successively the interest points
s1 = ( x > w(left_x) ); % larger than left_x
s2 = ( x < w(right_x) ); % smaller than right_x
s3 = ( y > w(top_y) ); % larger than top_y
s4 = ( y < w(bottom_y) ); % smaller than bottom_y

% intersection of these 4 sets are the ROI enclosed interest points
ids = s1 & s2 & s3 & s4;

% convert ids to real
ids = find( ids );

OpenCV や Intel の MKL で提案されたルーチンを見てきましたが、適切なものは見つかりませんでした。Matlab のプロファイラーを使用して、roi_feat_ids() にかなりの時間が費やされ、関数 sph_roi() の各領域の外側のループも遅いことがわかりました。MEX ファイルを実装する前に、既存のコードを再利用できるかどうかを確認したいと思います。

4

1 に答える 1

1

これをスピードアップするために私がすることがいくつかあります。

  1. 最後の行 ( を削除する必要がありますids = find( ids );。論理マスクは、find を使用するよりもはるかに高速であり、find ステートメントが機能するほとんどすべての場合に機能します。これにより、機能や読みやすさを損なうことなく、関数が大幅に高速化されると思います。 .
  2. s1、s2、s3、および s4 ステートメントのいくつかを組み合わせると、より高速になる可能性があります。
  3. 必要でない限り、for ループで大きなデータ セットを作成しないようにしてください。具体的には、次のことを行うために 2 行を削除します。ids = roi_feat_ids( scw( j, : ), feat );

後の 2 つは少し時間を節約できるかもしれませんが、最初の 2 つは大幅な時間の節約になるはずです。幸運を!

于 2012-04-10T21:22:47.813 に答える