基于局部视觉特征聚合的图像检索

基于局部视觉特征聚合的图像检索

1、算法实现

1、对所有20幅图像的sift描述子特征向量进行k-means聚类,聚为m类。代码如下:

% 对每一段进行k-means聚类,k=16
[Idx,C] = kmeans(siftDescriptorTrain',16,'Options',opts);

2、将每张图像的sift描述子特征向量按VLAD方式聚合成一个维度为128*m维的长向量。具体步骤如下:对每个特征向量,找与它距离最近的聚类中心,具有相同聚类中心的归为一类。对每一类,计算该类中所有特征向量与对应聚类中心的向量差的和,得到m个128维的向量,将这m个向量归并为一个128*m维的长向量。存储空间由128*k降到128*m,k为每幅图像的特征向量数,代码如下:

v1 = cell(20,1);
vlad = zeros(20 , 128*16);
for i = 1 : 20
    minposition = zeros(1,featNum(i));
    % 判断待匹配图像的每一个特征点各属于哪一类(基于上述相应的codebook进行量化)
    for j =1 : featNum(i)
        tmpFeat = repmat(SiftFeat{i}(:,j),1,16);
        d1 = sum((tmpFeat - C).^2); % distance
        minposition(j) = find(d1==min(d1));
    end
    v1{i} = zeros(128,16);

    for j =1 : featNum(i)
        v1{i}(:,minposition(j)) = v1{i}(:,minposition(j)) + SiftFeat{i}(:,j) - C(:,minposition(j));
    end

    vlad(i,:) = reshape(v1{i},1,128*16);    
end

3、将每幅图像作为查询图像,计算与其余19幅图像的距离,计算距离的方法为计算两个128*m维向量的欧式距离。然后将距离从小到大排序,并计算检索精度(检索精度:在检索排序结果中,统计排在前4的图像中的相关图像的数目,计算该相关结果数的平均值(取值范围在[1, 4]))。计算复杂度由19*19*128*k降为19*19*128*m,k为每幅图像的特征向量数,代码如下:

% 将每幅图像作为查询图像,计算与其余19幅图像的距离
dist = zeros(20,20);
for i = 1 : 20
    for j = i+1 : 20
        dist(i,j) = sum((vlad(i,:)-vlad(j,:)).^2);
        dist(j,i) = dist(i,j);
    end
end

v = zeros(20,20);
ind = zeros(20,20);
% 距离从小到大排序
[v(1 : 20,:), ind(1 : 20,:)] = sort(dist(1 : 20,:) , 2);
% 取前4个
ind = ind(:,2:5);

index = zeros(20,1);
for i = 1 : 20
    fndex{i} = fndex{i}(end-14 : end-10);
    index(i) = str2double(fndex{i});
end

% 统计排在前4的图像中的相关图像的数目
count = zeros(20,1);
for i = 1 : 20
    tmp = floor(index(i)/4);
    for j = 1 : 4
        if floor(index(ind(i,j))/4) == tmp
            count(i) = count(i) + 1;
        end
    end
end
% 算平均值
mean(count)

综上,存储空间由128*k降到128*m,计算复杂度由19*19*128*k降为19*19*128*m。

2、实验结果

次数 1 2 3 4 5 6 平均值
检索精度 2.6500 2.5500 2.6000 2.5500 2.5000 2.6500 2.5833

参考资料

http://www.cnblogs.com/mafuqiang/p/6909556.html

源代码

http://download.csdn.net/download/jianwen_jiang/10211105

你可能感兴趣的:(图像检索,图像分析)