1

이미지 폴더가 있습니다. 각 이미지에서 VLAD 피쳐를 계산하고 싶습니다. 각 이미지 위에Matlab을 사용하여 VLFeat의 SIFT 설명자에서 VLAD 추출

I 루프는로드, 다음과 같이 SIFT 기술자를 얻었다 :

repo = '/media/data/images/'; 
filelist = dir([repo '*.jpg']); 
sift_descr = {} 

for i = 1:size(filelist, 1) 
    I = imread([repo filelist(i).name]) ; 
    I = single(rgb2gray(I)) ; 
    [f,d] = vl_sift(I) ; 
    sift_descr{i} = d 
end 

그러나, VLAD는 2D로 설명의 행렬을 필요로한다. here을 참조하십시오. VLAD 인코딩 전에 SIFT 설명자를 처리하는 올바른 방법은 무엇입니까? 고맙습니다.

답변

1

먼저 시각적 단어 사전을 구하거나 구체적으로 표현해야합니다. k을 사용하는 모든 이미지의 SIFT 기능을 클러스터링합니다. 즉, 클러스터링을 의미합니다. [1]에서, 예를 들어, 64 또는 256 클러스터를 권장합니다.

이를 위해 우리는 모든 설명자를 하나의 행렬로 연결해야합니다. 그런 다음 vl_kmeans 함수로 전달할 수 있습니다. 또한 vl_kmeans 함수는 입력이 single 또는 double이어야하기 때문에 설명자를 uint8에서 single으로 변환합니다.

all_descr = single([sift_descr{:}]); 
centroids = vl_kmeans(all_descr, 64); 

둘째, 당신은 차원이 할당 매트릭스를 만들 필요가 NumberOfClusters --NumberOfDescriptors하여 클러스터에 각각의 기술자를 할당. 이 할당 매트릭스를 만들면 많은 유연성을 얻을 수 있습니다. 즉, 소프트 또는 하드 할당을 수행 할 수 있습니다. 가장 가까운 이웃 검색 또는 kd- 트리 또는 기타 근사 또는 계층 적 최근 접 방안을 사용할 수 있습니다.

이 자습서에서 그들은 kd-trees를 사용하므로 다음과 같이 고집합니다. 첫째, kd-tree를 만들어야합니다. 이 작업은 바로 centroids을 찾은 후 소속 :

kdtree = vl_kdtreebuild(centroids); 

그런 다음, 우리는 각각의 이미지에 대한 VLAD 벡터를 구성 할 준비가 된 것입니다. 따라서 모든 이미지를 다시 살펴보고 독립적으로 VLAD 벡터를 계산해야합니다. 먼저 튜토리얼에서 설명한대로 할당 매트릭스를 만듭니다. 그런 다음 vl_vlad 함수를 사용하여 SIFT 설명자를 인코딩 할 수 있습니다. 얻어진 VLAD 벡터는 크기를 NumberOfClusters있을 것이다 * SiftDescriptorSize, 즉이 예에서 64 * 128 ..

enc = zeros(64*128, numel(sift_descr)); 

for k=1:numel(sift_descr) 

    % Create assignment matrix 
    nn = vl_kdtreequery(kdtree, centroids, single(sift_descr{k})); 
    assignments = zeros(64, numel(nn), 'single'); 
    assignments(sub2ind(size(assignments)), nn, 1:numel(nn))) = 1; 

    % Encode using VLAD 
    enc(:, k) = vl_vlad(single(sift_descr{k}), centroids, assignments); 
end 

마지막으로, 데이터베이스의 모든 이미지에 대한 고차원 VLAD 벡터를 갖는다. 일반적으로 VLAD 설명자의 크기를 줄이기를 원할 것입니다. PCA를 사용합니다. 데이터베이스에없는

지금 주어진 새로운 이미지, 당신은 SIFT는 vl_sift를 사용하여 기능을 추출 vl_kdtreequery으로 할당 행렬을 생성하고, vl_vlad을 사용하여 해당 이미지에 대한 VLAD 벡터를 만들 수 있습니다. 그래서, 당신은 새로운 무게 중심을 찾아야하거나 새로운 KD-트리를 생성하지 않습니다

% Load image and extract SIFT features 
new_image = imread('filename.jpg'); 
new_image = single(rgb2gray(new_image)); 
[~, new_sift] = vl_sift(new_image); 

% Create assignment matrix 
nn = vl_kdtreequery(kdtree, centroids, single(new_sift)); 
assignments = zeros(64, numel(nn), 'single'); 
assignments(sub2ind(size(assignments)), nn, 1:numel(nn))) = 1; 

% Encode using VLAD 
new_vlad = vl_vlad(single(new_sift), centroids, assignments); 

[1] Arandjelovic, R., & Zisserman, A. (2013). VLAD에 관한 모든 것. IEEE 컴퓨터 시각 및 패턴 인식 (CVPR) 회의, 1578-1585. https://doi.org/10.1109/CVPR.2013.207

+0

대단히 감사합니다. 정말 고마워요. –

관련 문제