-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
1,070 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.