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。
次数 | 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