您的位置:首页 > 编程语言 > MATLAB

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

2016-09-29 21:29 1891 查看
本文参考的文献   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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: