论文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函数
2. PCA_FilterBank.m函数
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>
相关文章推荐
- ###Matlab小笔记###
- XCode7中断点调试Matlab的mex文件
- Matlab plotyy画双纵坐标图实例
- Matlab基础知识
- matlab随笔(三)
- fullfile+利用matlab读取指定路径下的图像
- Matlab GUI笔记
- Matlab 简单笔记
- MATLAB:SMPD无法启动
- matlab 分块 矩阵 对角 合并
- 画极坐标图
- Matlab预分配内存
- 用matlab实现图片的缩放
- 用matlab实现多张图片合并
- My First SLAM Implementation EKF-SLAM
- Matlab如何读取文本文件
- Matlab中用fft作频谱后为什么要用fftshift
- Matlab中fft作频谱横纵坐标
- Ubuntu16.04 + cuda8.0 + GTX1080 + matlab14.04a + Opencv3.0 + caffe 安装教程
- Matlab之 rectpulse函数