视觉机器学习20讲-MATLAB源码示例(13)-稀疏表示算法

1. 稀疏表示算法

稀疏表示(Sparse Representation)也叫作稀疏编码(Sparse Coding),就是用字典中元素的线性组合去表示测试样本。

信号的稀疏表示并不是新的东西。很早就一直有在利用这一特性。例如,最简单的JPEG图像压缩算法。原始的图像信号经过DCT变换之后,只有极少数元素是非零的,而大部分元素都等于零或者说接近于零。这就是信号的稀疏性。

任何模型都有建模的假设条件。压缩感知,正是利用的信号的稀疏性这个假设。对于我们处理的信号,时域上本身就具有稀疏性的信号是很少的。但是,我们总能找到某种变换,使得在某个变换域之后信号具有稀疏性。这种变换是很多的,最常见的就是DCT变换,小波变换,gabor变换等。

然而,这种正交变换是传统视频图像处理采用的方法。目前所采用的一般不是正交变换。它是基于样本采样的。或者说是通过大量图像数据学习得到的,其结果称作字典,字典中的每一个元素称作原子。相关的学习算法称作字典学习。常见的算法例如K-SVD算法。学习的目标函数是找到所有样本在这些原子的线性组合表示下是稀疏的,即同时估计字典和稀疏表示的系数这两个目标。

2. Matlab仿真

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能:演示稀疏表示算法在计算机视觉中的应用
%基于稀疏表示实现人脸识别;
% 实验中采用 SPAMS工具箱和Yale人脸数据库
% SPAMS下载地址 : 
% http://spams-devel.gforge.inria.fr/
%环境:Win7,Matlab2018a
%Modi: C.S
%时间:2022-04-05
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


clc, clear all, close all
addpath(genpath('spams-matlab'));
isLoadImg = 0;
%% Load training and testing data
if isLoadImg
dataset = 'Yale';
fileExt = 'png';
datasetPath = ['data/',dataset];
imgDataDir = dir([datasetPath, '*.',fileExt]);
imgSide = 32;

percentTraining = 0.2;
normalization   = true;

fprintf('Loading and sperating training and testing samples ...\n');
[trainLabel, testLabel, trainSample, testSample, numClass] = getTrainTestData(datasetPath, fileExt, imgSide, percentTraining, normalization);

%  Dimension:d --- number of feature 
%            Nt--- number of testing samples
Train.X = trainSample;
Train.y = trainLabel;
Test.X  = testSample;
Test.y  = testLabel;
Nt = size(Test.y,2);
else
    load trainData.mat;
    load testData.mat
    Nt = size(Test.y,2);
end

%% run different methods for classification
% 1. Nearest Neighbor Classifier (NN)
mdl = fitcknn(Train.X', Train.y,'NumNeighbors',2);
ID1 = predict(mdl,Test.X');

% ID1 = knnclassify(Test.X', Train.X', Train.y); % 1-NN Classifier
correctSample = sum(ID1==Test.y');
accuracy(1) = correctSample/Nt;
fprintf('NN - Accuracy = %f %% (%d of %d)\n', accuracy(1)*100, correctSample, Nt);
%----------------------------------------------------------------------------------
% 2. Sparse Representation Classifier (SRC)
% "Face Recognition: A Sparse Representation Perspective" PAMI09
%----------------------------------------------------------------------------------
[ID2, relative_error] = src(Train, Test, 'omp');
correctSample = sum(ID2==Test.y);
accuracy(2) = correctSample/Nt;
fprintf('SRC(OMP Solver) - Accuracy = %f %% (%d of %d)\n', accuracy(2)*100, correctSample, Nt);

[ID3, relative_error] = src(Train, Test, 'apg');
correctSample = sum(ID3==Test.y);
accuracy(3) = correctSample/Nt;
fprintf('SRC(APG Solver) - Accuracy = %f %% (%d of %d)\n', accuracy(3)*100, correctSample, Nt);

3. 小结

稀疏表示的本质:用尽可能少的资源表示尽可能多的知识,这种表示具有计算速度快的额外好处。

在适应性(泛化能力)和稀疏性之间找到一个平衡点,最优性取决于成本函数。

有兴趣的推荐去仔细查看全文《机器学习20讲》中第十三讲内容,以及网上关于稀疏表示与字典学习的课程,深入学习了解,MATLAB仿真源码在分享的资源中已打包好,欢迎取用。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年4月7日 下午5:10
下一篇 2022年4月7日 下午5:17

相关推荐