目前我们有一个任务,在一个130个ID的目标数据底库做检索。用来检索的数据属于130类中的一个,每类1~3个,共224个检索数据。(也就是从224个数据里面选一个,与130个数据算相似度),准确率按130的top-1来算。
我们有该类型数据X的特征提取方法F(X),G(X),提取后的特征记为f,g。
只用特征 f 可以达到91%的准确率,只用特征 g 可以达到84%的准确率。
我们希望融合这两种特征,让准确率超过91%。简单的把特征值串在一起只有85%。
典型关联分析(Canonical Correlation Analysis,简称CCA)可以用来搞这个。
代码 https://github.com/mhaghighat/ccaFuse
该实验数据存放方式
Index_Image
|---------id(1)
|--------xxx.jpg
.
.
.
|---------id(130)
Index_Feature
|---------id(1)
|--------xxx.f
|--------xxx.g
.
.
.
|---------id(130)
Database_Image
|---------id(1).jpg
.
.
|---------id(130).jpg
Database_Feature
|---------id(1).f
|---------id(1).g
.
.
.f 和.g 文件都是以json格式存在的特征值文件,在matlab里面使用json需要下载一个jsonlab库,参考 https://blog.csdn.net/sophia_xw/article/details/70141208
特征融合代码如下,目标是在每个数据(例如xxx.jpg)的对应的特征文件(例如xxx.f 和xxx.g)的同级路径下,生成融合特征.cca文件
clear
clc
addpath('D:\\Program Files\\MATLAB\\R2016a\\bin\\my_workshop\\jsonlab-1.5');
trainX = [];
trainY = [];
testX = [];
testY = [];
train_json_save_path = {};
test_json_save_path = {};
for i = 1:130
f_path = sprintf('D:\\Database_Feature\\id(%d).f', i);
g_path = sprintf('D:\\Database_Feature\\id(%d).g', i);
trainX = [trainX;loadjson(f_path)];
trainY = [trainY;loadjson(g_path)];
savepath = sprintf('D:\\Database_Feature\\id(%d).cca', i);
train_json_save_path = [train_json_save_path, {savepath}];
end
for i = 1:130
path = sprintf('D:\\Index_Image\\id(%d)',i);
subdir = dir(path);
for j = 1:length(subdir)
if(isequal(subdir(j).name, '.')||isequal(subdir(j).name, '..'))
continue;
end
len = length(subdir(j).name);
title_name = subdir(j).name(1:len-4)
f_path = sprintf('D:\\Index_Feature\\id(%d)\\%s.f',i,title_name);
g_path = sprintf('D:\\Index_Feature\\id(%d)\\%s.g',i,title_name);
testX = [testX;loadjson(f_path)];
testY = [testY;loadjson(g_path)];
savepath = sprintf('D:\\Index_Feature\\id(%d)\\%s.cca',i,title_name);
test_json_save_path = [test_json_save_path, {savepath}];
end
end
[trainZ,testZ] = ccaFuse(trainX,trainY,testX,testY,'fusion');
for i = 1:130
savepath = char(train_json_save_path(i));
raw = trainZ(i,:);
savejson('', raw, savepath);
end
for i = 1:224
savepath = char(test_json_save_path(i));
raw = testZ(i,:);
savejson('', raw, savepath);
end
最后使用.cca的特征准确率可以达到96%。