Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
gk966988 authored Aug 1, 2019
1 parent 8fa3dc5 commit 4fa6dc5
Show file tree
Hide file tree
Showing 13 changed files with 1,070 additions and 0 deletions.
41 changes: 41 additions & 0 deletions DBD.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
function [W] = DBD(X, sw, sb, params)
% X:MDPDV数据
% K:取特征向量的个数
% Loop_num:循环次数

lambda1 = 1e-3; % 论文数值
lambda2 = 1e-4; % 论文数值
lambda3 = 0.01; % 论文数值
opts.record = 0;
opts.mxitr = 3000;
opts.xtol = 1e-5;
opts.gtol = 1e-5;
opts.ftol = 1e-8;
K = params.K; % 论文数值
[n_Sample, n_Feature] = size(X);
M = mean(X,1);
data = (X - repmat(M,n_Sample,1));
[eigenvector, eigenvalue] = eig(data'*data); % 求特征向量、特征值
[value, index]= sort(diag(eigenvalue),'descend');
W0 = eigenvector(:, index(1:K)); % 取前k个特征向量初始化W

Loop_num = 100;
W = W0;
for i = 1:Loop_num
% 固定W,更新B
B = double(X*W>0);

% 固定B,更新W
F1 = lambda1*(X'*X) + lambda2* sw - lambda3*sb;
F2 = -2*lambda1*X'*B;
[W, G]= OptStiefelGBB(W, @objectfunc,opts,F1,F2');
end
end

function [F, G] = objectfunc(W, F1, F2)
F = trace(W'*F1*W) + trace(F2*W);
G = 2*F1*W + F2';
end



58 changes: 58 additions & 0 deletions Extract_feature.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
function fea = Extract_feature(img,W,D,params)

clusters = params.clusters;
M = params.M;
N = params.N;

Tdata = double(img);
[h, w] = size(img);

R = params.R;
spoints = [];
for i=-R:R
spoints=[spoints;0,i];
end

for i=-R:R
spoints = [spoints;i,0];
end
for i=-R:R
spoints = [spoints;i,i];
end
for i=-R:R
spoints = [spoints;i,-i];
end
spoints(R+1,:)=[];
spoints(3*R+1,:)=[];
spoints(5*R+1,:)=[];
spoints(7*R+1,:)=[];
CG = Tdata((R+1):(h-R), (R+1):(w-R));
Tcode1 = zeros(size(CG,1),size(CG,2),size(spoints,1));
for ii=1:size(spoints,1)
Tmp = Tdata(((R+1):(h-R))+spoints(ii,1),((R+1):(w-R))+spoints(ii,2));
Tcode1(:, :, ii) = Tmp-CG;
end

[Th, Tw, ~] = size(Tcode1);
delta_h = round(Th / M);
delta_w = round(Tw / N);

fea = zeros(1,M*N*clusters);
cnt=0;
for i = 1:M
s_h = delta_h * (i-1) + 1;
e_h = s_h + delta_h - 1;
e_h = min(e_h, Th);
for j = 1:N
s_w = delta_w * (j-1) + 1;
e_w = s_w + delta_w - 1;
e_w = min(e_w, Tw);
Tmp = Tcode1(s_h:e_h, s_w:e_w, :);
[t_h, t_w, t_d] = size(Tmp);
Tmp = reshape(Tmp, t_h*t_w, t_d);

fea((cnt+1):cnt+clusters)= ...
getHist(double(Tmp*W{i,j} > 0), D{i,j});
cnt = cnt+clusters;
end
end
75 changes: 75 additions & 0 deletions Loda_data.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
clear all;
clc;

register_path='.\data\Register\';
test_path='.\data\TestImage\';
register_image_num = 360; % 注册图片总数
test_image_num = 525; % 测试图片总数
width = 96;
height = 64;


data = zeros( height, width, register_image_num);
label = cell(1, register_image_num);
register_fingerID = dir(register_path); % 获取文件夹
N=size(register_fingerID,1);
% CLASSES = N - 2;
num = 0;
for i = 3:N
fingerdir=strcat(register_path,register_fingerID(i,1).name,'\');
redister_IDname = register_fingerID(i, 1).name;
file=dir(fingerdir); % 获取图片
N1=size(file,1);

pre_class = N1 - 2; % 每个ID 图片的个数
for j=3:N1
filename=strcat(fingerdir,file(j,1).name);
img= imread(filename);

img = rgb2gray(img);
% figure(1);
% imshow(img);
% img = imresize(img,[height, width], 'bicubic');
img = double(img);
% figure(2);
% imshow(img);
data(:, :, num+j-2) = img;
label{1, num+j-2} = redister_IDname;
end
num = num + N1 - 2;
end
save train data label


data = zeros( height, width, test_image_num);
label = cell(1, test_image_num);
test_fingerID = dir(test_path); % 获取文件夹
N=size(test_fingerID,1);
% CLASSES = N - 2;

num_2 = 0;
for i = 3:N
fingerdir=strcat(test_path,test_fingerID(i,1).name,'\');
test_IDname = test_fingerID(i, 1).name;
file=dir(fingerdir); % 获取图片
N1=size(file,1);

pre_class = N1 - 2; % 每个ID 图片的个数
for j=3:N1
filename=strcat(fingerdir,file(j,1).name);
img= imread(filename);

img = rgb2gray(img);
img = double(img);
data(:, :, num_2+j-2) = img;
label{1, num_2+j-2} = test_IDname;
end
num_2 = num_2 + N1 - 2;
end
save test data label






121 changes: 121 additions & 0 deletions MDPDV_extract.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
function [MDPDV, sw, sb] =MDPDV_extract(data, param)
M = param.M;
N = param.N;
train_num = param.train_num;
block_w = param.block_w;
block_h = param.block_h;
stride_h = param.stride_h;
stride_w = param.stride_w;
image_num = size(data,3);
% 暂定窗口的R为3,则线上的像素点为24个
R = param.R;
Th = size(data(:,:,1), 1); % 图片的高
Tw = size(data(:,:,1), 2); % 图片的宽
spoints = [];
for i=-R:R
spoints=[spoints;0,i];
end

for i=-R:R
spoints = [spoints;i,0];
end
for i=-R:R
spoints = [spoints;i,i];
end
for i=-R:R
spoints = [spoints;i,-i];
end
spoints(R+1,:)=[];
spoints(3*R+1,:)=[];
spoints(5*R+1,:)=[];
spoints(7*R+1,:)=[];

% spoints= [0,-8;0,-7;0,-6;0,-5;0,-4;0,-3;0,-2;0,-1;0,1;0,2;0,3;0,4;0,5;0,6;0,7;0,8;
% -8,0;-7,0;-6,0;-5,0;-4,0;-3,0;-2,0;-1,0;1,0;2,0;3,0;4,0;5,0;6,0;7,0;8,0;
% -8,-8;-7,-7;-6,-6;-5,-5;-4,-4;-3,-3;-2,-2;-1,-1;1,1;2,2;3,3;4,4;5,5;6,6;7,7;8,8;
% -8,8;-7,7;-6,6;-5,5;-4,4;-3,3;-2,2;-1,1;1,-1;2,-2;3,-3;4,-4;5,-5;6,-6;7,-7;8,-8];
MDPDV = cell(M, N); % M:行的分块数,N:列的分块数
for i=1:M
for j=1:N
MDPDV{i,j} = zeros( block_w * block_h, size(spoints,1), size(data,3) ); % (窗宽*窗长*图片数, 64)
end
end
cnt = 0;

% Tdata = zeros(Th+R*2, Tw+R*2);
for d=1:size(data,3)
[h, w] = size(data(:,:,d));
Tdata = padarray(data(:,:,d), [R, R], 'replicate', 'both');
Tdata( (1+R):(h+R) , (1+R):(w+R) ) = double(data(:,:,d)); % 一张图片
%Tdata = preproc2(Tdata,0.2,1,2,[],[],10);

CG = Tdata((R+1):(h+R), (R+1):(w+R)); % 一张图片
Tcode1 = zeros(size(CG,1),size(CG,2),size(spoints,1)); % (图长,图宽,24)

for ii=1:size(spoints,1) % 1:24
Tmp = Tdata(((R+1):(h+R))+spoints(ii,1),((R+1):(w+R))+spoints(ii,2));
Tcode1(:, :, ii) = Tmp-CG;
end

for i = 1:M
r = (i-1)*stride_h;
for j = 1:N
c = (j-1)*stride_w;
Tmp = Tcode1(r+1:r+block_h, c+1:c+block_w, :);
% MDPDV{i,j}(cnt+1:cnt+block_w * block_h,:) = ...
% reshape(Tmp, block_w * block_h, size(spoints,1));
MDPDV{i,j}(:,:,d) = reshape(Tmp, block_w * block_h, size(spoints,1));
end
end
end

% 计算sw, sb
sw = cell(M,N); % 类内间距和
sb = cell(M,N); % 类间间距和
m = cell(M,N); % 所有样本的平均值
% 计算所有样本的平均值
for i=1:M
for j=1:N
m{i,j}=mean(MDPDV{i,j}, 3);
end
end
% 计算类间间距和

for i=1:M
for j=1:N
sw{i,j} = zeros(size(spoints, 1),size(spoints, 1));
sb{i,j} = zeros(size(spoints, 1),size(spoints, 1));
for k = 1:train_num
sw{i,j} = sw{i,j} + (MDPDV{i,j}(:, :, k) - mean(MDPDV{i,j}(:,:, 1:train_num), 3))'*(MDPDV{i,j}(:, :, k) - mean(MDPDV{i,j}(:,:, 1:train_num), 3));
end
sb{i,j} =sb{i,j} + 6*(mean(MDPDV{i,j}(:,:,1:train_num), 3)-m{i,j})'*(mean(MDPDV{i,j}(:,:,1:train_num),3)-m{i,j});
end
end

for i=1:M
for j=1:N
for k = 2*train_num:train_num:image_num
for z = k-train_num+1:k
sw{i,j} = sw{i,j} + (MDPDV{i,j}(:, :, z) - mean(MDPDV{i,j}(:,:, k-train_num+1:k), 3))'*(MDPDV{i,j}(:, :, z) - mean(MDPDV{i,j}(:,:, k-train_num+1:k), 3));
end
% sw{i, j} = sw{i, j} + (bsxfun(@minus,MDPDV{i,j}(block_w*block_h*(k-2):block_w*block_h*k, :),mean(MDPDV{i,j}(block_w*block_h*(k-2):block_w*block_h*k, :))))'* (bsxfun(@minus,MDPDV{i,j}(block_w*block_h*(k-2):block_w*block_h*k, :),mean(MDPDV{i,j}(block_w*block_h*(k-2):block_w*block_h*k, :))));
% sw{i, j} = sw{i,j} + var(MDPDV{i, j}(block_w*block_h*(k-2):block_w*block_h*k, :), 0, 1);
% sb{i,j} =sb{i,j} + 3*(mean(MDPDV{i,j}(block_w*block_h*(k-2):block_w*block_h*k, :))-m{i,j}).^2;
% sb{i,j} = 3*(mean(MDPDV{i,j}(block_w*block_h*(k-2):block_w*block_h*k, :))-m{i,j})'*(mean(MDPDV{i,j}(block_w*block_h*(k-2):block_w*block_h*k, :))-m{i,j});
sb{i,j} = sb{i,j} + train_num*(mean(MDPDV{i,j}(:,:,k-train_num+1:k), 3)-m{i,j})'*(mean(MDPDV{i,j}(:,:,k-train_num+1:k),3)-m{i,j});
end
end
end

for i=1:M
for j=1:N
MDPDV{i,j} = permute(MDPDV{i,j},[2, 1, 3]);
MDPDV{i,j} = reshape(MDPDV{i,j},size(spoints,1),[])';
end
end






16 changes: 16 additions & 0 deletions MGramSchmidt.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
function V = MGramSchmidt(V)
[n,k] = size(V);

for dj = 1:k
for di = 1:dj-1
V(:,dj) = V(:,dj) - proj(V(:,di), V(:,dj));
end
V(:,dj) = V(:,dj)/norm(V(:,dj));
end
end


%project v onto u
function v = proj(u,v)
v = (dot(v,u)/dot(u,u))*u;
end
Loading

0 comments on commit 4fa6dc5

Please sign in to comment.