论文PCANet: A Simple Deep Learning Baseline for Image Classification?的matlab源码解读(一)

本文参考的文献   http://www.lai18.com/content/1452306.html 

https://my.oschina.net/Ldpe2G/blog/275922

http://blog.csdn.net/orangehdc/article/details/37763933

http://blog.csdn.net/funny75/article/details/50937302 matlab源码注释

http://blog.csdn.net/u014365862/article/details/51213280 C++源码注释            

论文链接:http://arxiv.org/abs/1404.3606

matlab代码:Matlab Codes for Download

C++代码:https://github.com/Ldpe2G/PCANet


本文是对PCANet论文的matlab代码的详细解释,纯属个人理解,能力有限,如果错误欢迎指正!

1。im2col_mean_removal.m函数

<span style="font-family:Times New Roman;font-size:18px;">function im = im2col_mean_removal(varargin) 
% 从PCA_FilterBank函数传入的参数 im2col_mean_removal(InImg{i},[PatchSize PatchSize])

% 输入 
% 图片矩阵 InImg(m*n) 
% 采样矩阵大小 patchsize12=[k1,k2] 
% 图片通道数 chl(默认为1) 
% 在输入的矩阵InImg上,按行滑动采样矩阵,得到patch,每个patch按列展开,减去均值成为输出矩阵im的列,所以输出矩阵im为 k1*k2 行,(m−k1+1)*(n−k2+1) 列

NumInput = length(varargin);
InImg = varargin{1};
patchsize12 = varargin{2}; 

z = size(InImg,3);
im = cell(z,1);% 这里im是一行一行得存储样本
if NumInput == 2
    for i = 1:z
        iim = im2colstep(InImg(:,:,i),patchsize12);%窗口采样,然后按列展开为列向量
        im{i} = bsxfun(@minus, iim, mean(iim))'; %@minus是加法的函数数柄,后面有转置;mean()返回iim中每一列的平均值,并组成1*iimY的矩阵
        %转置后每一行代码一个patch样本
		%         iim = bsxfun(@minus, iim, mean(iim)); %这里iim中每一列中的元素减去该列的均值
%         im{i} = bsxfun(@minus, iim, mean(iim,2))';
    end
else 
    for i = 1:z
        iim = im2colstep(InImg(:,:,i),patchsize12,varargin{3});
        im{i} = bsxfun(@minus, iim, mean(iim))'; 
%         iim = bsxfun(@minus, iim, mean(iim)); 
%         im{i} = bsxfun(@minus, iim, mean(iim,2))';
    end 
end
im = [im{:}]';%{:}将元胞数组转换为矩阵,再转置, 转置后还是每列代表一个patch</span>


2. PCA_FilterBank.m函数

<span style="font-family:Times New Roman;font-size:18px;">function V = PCA_FilterBank(InImg, PatchSize, NumFilters) 
% =======INPUT=============
% InImg            Input images (cell structure)  
% PatchSize        the patch size, asumed to an odd number.
% NumFilters       the number of PCA filters in the bank.
% =======OUTPUT============
% V                PCA filter banks, arranged in column-by-column manner 按列方式排列 
% =========================

addpath('./Utils')

% to efficiently cope with the large training samples, if the number of training we randomly subsample 10000 the
% training set to learn PCA filter banks 随机抽样10000个样本
ImgZ = length(InImg);% 返回InImg行和列的最大值
MaxSamples = 100000;
NumRSamples = min(ImgZ, MaxSamples); 
RandIdx = randperm(ImgZ); %randperm是matlab函数,功能是随机打乱一个数字序列。
RandIdx = RandIdx(1:NumRSamples);%随机打乱样本后取前NumRSamples个样本

%% Learning PCA filters (V)
NumChls = size(InImg{1},3); %size 确定图像的维数,如果InImg是彩色图像的话,size(InImg,3)是等于3的,因为彩色图像每个像素点由R、G、B三个色彩组件组成,每个色彩组件有一个值(0到255之间)。
Rx = zeros(NumChls*PatchSize^2,NumChls*PatchSize^2);% 用来存储图像的协方差矩阵,传进的参数是PCANet.PatchSize(stage)

for i = RandIdx %1:ImgZ
    im = im2col_mean_removal(InImg{i},[PatchSize PatchSize]); % collect all the patches of the ith image in a matrix, and perform patch mean removal
    Rx = Rx + im*im'; % sum of all the input images' covariance matrix
end
Rx = Rx/(NumRSamples*size(im,2));% 求协方差,size(im,2)返回im矩阵的列数(即样本的个数,参考求样本协方差的公式)
% [V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量
[E D] = eig(Rx);%E是特征向量,D是特征值构成的对角阵
[~, ind] = sort(diag(D),'descend');% [sA,index] = sort(A),排序后,sA是排序好的向量,index 是向量sA中对A的索引。获得前NumFilters个最大特征值的索引
%%取前NumFilters个特征向量,作为下一步的滤波器,得到特征值最大的前NumFilter个特征向量,特征向量为(k1k2)*NumFilters
V = E(:,ind(1:NumFilters));  % principal eigenvectors </span>


  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值