您的位置:首页 > 其它

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

2018-01-18 00:02 543 查看

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

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、实验结果

4000
次数123456平均值
检索精度2.65002.55002.60002.55002.50002.65002.5833

参考资料

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

源代码

http://download.csdn.net/download/jianwen_jiang/10211105
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息