Matlab实现CCA多模特征融合

目前我们有一个任务,在一个130个ID的目标数据底库做检索。用来检索的数据属于130类中的一个,每类1~3个,共224个检索数据。(也就是从224个数据里面选一个,与130个数据算相似度),准确率按130的top-1来算。

我们有该类型数据X的特征提取方法F(X),G(X),提取后的特征记为fg。

只用特征 可以达到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%。

猜你喜欢

转载自blog.csdn.net/XLcaoyi/article/details/111942057
今日推荐