人脸验证算法Joint Bayesian详解及实现(Matlab)
python http://blog.csdn.net/cyh_24/article/details/49059475
github https://github.com/johnnyconstantine/Joint_Bayesian
实验所用的数据下载 http://www.down20.com/f-1036718061807849
下面为matlab代码,与论文的公式保持一致,运行需要比较大的内存。
addpath('../WDFdata')
%---------------------Load the training data------------------------
load('lbp_WDRef.mat')%there are  pictures,each contains  (*)
load('id_WDRef.mat')%persion id ,same id means same person
labels = id_WDRef;
clear id_WDRef;
X = double(lbp_WDRef);%trans int into double
clear lbp_WDRef;
train_mean = mean(X,);
X = bsxfun(@minus,X,train_mean);%substract the mean
% [COEFF,SCORE] = princomp(X,'econ');%PCA
[COEFF,SCORE] = pca(X,'econ');%PCA
train_x = SCORE(:,:);%
%----------------------------------------------------------
clear X;
clear SCORE;
%----------------------------------------------------------
%----------------------------------------------------------
%------------------------------load testing data-------------------------------------
load('lbp_lfw.mat')%it's 13233*5900
load('pairlist_lfw.mat')
%pairlist_lfw is an struct,it contains two * matrix,they are IntraPersonPair、ExtraPersonPair
normX = double(lbp_lfw);
train_mean = mean(normX,);
normX = bsxfun(@minus,normX,train_mean);
normX = normX * COEFF(:,:);%PCA
test_Intra = pairlist_lfw.IntraPersonPair;
test_Extra = pairlist_lfw.ExtraPersonPair;
%----------------------------------------------------------------------------------------------------------
clear lbp_lfw;
clear pairlist_lfw;
clear train_mean;
clear COEFF;
%-------------------------creat training pairs(intraPair和extraPair)---------------------------------------------------
[classes, bar, labels] = unique(labels);%labels
    nc = length(classes);%there are  person
    clear bar and classes;
train_Intra = zeros(nc*,);%*
for i=:nc%randperm(n,)
    train_Intra(*i-,:) = randperm(sum(labels == i),) + find(labels == i,,'first') - ;
    train_Intra(*i,:) = randperm(sum(labels == i),) + find(labels == i,,'first') - ;
end%choose two pictures from one person as intraPairs
train_Extra = reshape(randperm(length(labels),),,);%reshape *
train_Extra(labels(train_Extra(:,))==labels(train_Extra(:,)),:)=[];
train_Extra(size(train_Intra,)+:end,:)=[];
Dis_train_Intra = zeros(size(train_Intra,),);
Dis_train_Extra = zeros(size(train_Intra,),);
%------------------------------initialize before training---------------------------------------------------------
    m = length(labels); %
    n = size(train_x,);%
    [classes, bar, labels] = unique(labels);
    nc = length(classes);%为2995
    clear classes;
    clear bar;
    Sw = eye(size(train_x, ), size(train_x, ));
    Su = eye(size(train_x, ), size(train_x, ));%initialize sw su as identity matrix
    cur = {};%cell,*
    withinCount = ;
    numberBuff = zeros(,);% make sure that the largest number of a person is less than
    for i=:nc%
        cur{i} = train_x(labels == i,:);%make cell
        if size(cur{i},)>
            withinCount = withinCount + size(cur{i},);
        end
        if numberBuff(size(cur{i},)) ==
            numberBuff(size(cur{i},)) = ;
        end
    end%
    clear labels;
    u = zeros(n,nc);%*
    clear withinCount;
    oldSw = Sw;
    SuFG = cell(,);
    SwG = cell(,);%* cell
    %-------------------------------------EM-Like begin training-------------------------------------------------
    for k=: %set the cycle times
        F = inv(Sw);%formula()in supplementary material
        ep =zeros(n,m);
        nowp = ;
        for g = :
            if numberBuff(g)==
                G = - .* (g .* Su + Sw) \ Su / Sw;%formula()in supplementary material
                SuFG{g} = Su * (F + g.*G);%
                SwG{g} = Sw*G;
            end
        end%
        for i=:nc%
            nnc = size(cur{i}, );%number of each person
            u(:,i) = sum(SuFG{nnc} * cur{i}',2);%
            ep(:,nowp:nowp+ size(cur{i}, )-) = bsxfun(@plus,cur{i}',sum(SwG{nnc}*cur{i}',));%formula()in supplementary material
            nowp = nowp+ nnc;
        end
        Su = cov(u');%su,
        Sw = cov(ep');%sw,。
        fprintf('%d %f\n',k,norm(Sw - oldSw)/norm(Sw));
        if norm(Sw - oldSw)/norm(Sw)<1e-%
            break;
        end
        oldSw = Sw;
    F = inv(Sw);
    mapping.G = - .* ( * Su + Sw) \ Su / Sw;%formula()in supplementary material
    mapping.A = inv(Su + Sw) - (F + mapping.G);%formula()
    mapping.Sw = Sw;
    mapping.Su = Su;
%---------------------------------begin testing-------------------------------------------------------------------
    for i=:size(train_Intra,)%formula()
        Dis_train_Intra(i) = train_x(train_Intra(i,),:) * mapping.A * train_x(train_Intra(i,),:)' + train_x(train_Intra(i,2),:) * mapping.A * train_x(train_Intra(i,2),:)' -  * train_x(train_Intra(i,),:) * mapping.G * train_x(train_Intra(i,),:)';
        Dis_train_Extra(i) = train_x(train_Extra(i,),:) * mapping.A * train_x(train_Extra(i,),:)' + train_x(train_Extra(i,2),:) * mapping.A * train_x(train_Extra(i,2),:)' -  * train_x(train_Extra(i,),:) * mapping.G * train_x(train_Extra(i,),:)';
    end
    group_train = [ones(size(Dis_train_Intra,),);zeros(size(Dis_train_Extra,),)];%
    training = [Dis_train_Intra;Dis_train_Extra];%*
%-------------------------------------------------------------------------------------------------------------
    result_Intra = zeros(,);
    result_Extra = zeros(,);
    for i=:
        result_Intra(i) = normX(test_Intra(i,),:) * mapping.A * normX(test_Intra(i,),:)' + normX(test_Intra(i,2),:) * mapping.A * normX(test_Intra(i,2),:)' -  * normX(test_Intra(i,),:) * mapping.G * normX(test_Intra(i,),:)';
        result_Extra(i) = normX(test_Extra(i,),:) * mapping.A * normX(test_Extra(i,),:)' + normX(test_Extra(i,2),:) * mapping.A * normX(test_Extra(i,2),:)' -  * normX(test_Extra(i,),:) * mapping.G * normX(test_Extra(i,),:)';
    end%formula()
    group_sample = [ones(,);zeros(,)];%
    sample = [result_Intra;result_Extra];%
%---------------------------------------
   % clear normX;%
%---------------------------------------
% classification
    [p,q]=size(group_train);%*
    starderd=;
    eg1=;
    num1=;
    eg2=;
    num2=;
    for i=:p
        if group_train(i,)==
            eg2=eg2+training(i,);%training
            num2=num2+;
        else
            eg1=eg1+training(i,);
            num1=num1+;
        end
    end
    starderd=(eg1+eg2)/(num1+num2);
    [p,q]=size(sample);%sample
    label=zeros(p,);%
    accuracy=;
    for i=:p
        if sample(i,)>starderd%same person
            label(i,)=;
        else
            label(i,)=;%not same person
        end
        if label(i,)==group_sample(i,)%
            accuracy=accuracy+;
        end
    end
    result = accuracy/p %
    if(result>=0.90)%if you can't reach this high accuracy you may end this by ctl + c or just set a lower number
        clear Sw and Su and F and G and numberBuff;%this should be done by the end of the for cycle
        break;
    end
end%new added by cx match the big for cycle
display('program done');
人脸验证算法Joint Bayesian详解及实现(Matlab)的更多相关文章
- 人脸验证算法Joint Bayesian详解及实现(Python版)
		
人脸验证算法Joint Bayesian详解及实现(Python版) Tags: JointBayesian DeepLearning Python 本博客仅为作者记录笔记之用,不免有很多细节不对之处 ...
 - 一阶RC高通滤波器详解(仿真+matlab+C语言实现)
		
文章目录 预备知识 关于电容 HPF的推导 simulink 仿真 simulink 运行结果 matlab 实现 matlab 运行结果 C语言实现 如果本文帮到了你,帮忙点个赞: 如果本文帮到了你 ...
 - 一阶RC低通滤波器详解(仿真+matlab+C语言实现)
		
文章目录 1 预备知识 2 simulink 仿真 3 simulink 运行结果 4 matlab实现 5 matlab运行结果 6 C语言实现 7 C语言运行结果 如果本文帮到了你,帮忙点个赞: ...
 - 手 Q 人脸识别动画实现详解
		
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 前言 开门见山,先来看下效果吧. 看到这么酷炫的效果图,不得不赞叹一下我们的设计师.然而,站在程序员的角度上看,除了酷炫之外更多的是复杂.但是 ...
 - Java版人脸检测详解下篇:编码
		
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
 - samtools常用命令详解(转)
		
转自:samtools常用命令详解 samtools的说明文档:http://samtools.sourceforge.net/samtools.shtml samtools是一个用于操作sam和ba ...
 - 前端技术之_CSS详解第三天
		
前端技术之_CSS详解第三天 二.权重问题深入 2.1 同一个标签,携带了多个类名,有冲突: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
 - 深度学习之卷积神经网络(CNN)详解与代码实现(一)
		
卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...
 - spring事务详解(三)源码详解
		
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
 
随机推荐
- Python 函数返回多值
			
返回多值函数可以返回多个值吗?答案是肯定的.比如在游戏中经常需要从一个点移动到另一个点,给出坐标.位移和角度,就可以计算出新的坐标:# math包提供了sin()和 cos()函数,我们先用impor ...
 - LInux下inode空间报警-CROND出错导致/var/spool/postfix/maildrop/堆积
			
Linux下显示磁盘空间不足,,通过 df -ih 查询发现/dev/mapper/*****var 下的inode用满.inode介绍 通过 du -sh * 查询/目录下的问题,最终查到/var/ ...
 - poj 2388 insert sorting
			
/** \brief poj 2388 insert sorting 2015 6 12 * * \param * \param * \return * */ #include <iostrea ...
 - js 实现图片的无缝滚动
			
js 实现图片的无缝滚动 CreateTime--2018年3月7日17:18:34 Author:Marydon 测试成功 <!DOCTYPE html> <html> ...
 - 4种常见的MySQL日志类型
			
4种常见的MySQL日志类型 .错误日志 记录启动.运行或停止mysqld时出现的问题 log-error=d:/mysql_log_err.txt .查询日志 记录建立的客户端连接和执行的所有语句( ...
 - centos6.5下使用yum完美搭建LNMP环境(php5.6,mysql5.5,nginx1.10)
			
准备工作 配置防火墙,开启80端口.3306端口 不用执行这句:rm -rf /etc/sysconfig/iptables 直接进入修改:vi /etc/sysconfig/iptables 添加8 ...
 - centos6.3下yum安装redis
			
我得是centos 6.3,如果直接用yum安装redis,报错,如下: [root@CentOS6 etc]# yum install redis Loaded plugins: fastestmi ...
 - 剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
			
一.移除性算法 (remove) C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
 - Redis配置和常用命令
			
redis.conf配置文件: 引用 #是否作为守护进程运行 daemonize yes #配置pid的存放路径及文件名,默认为当前路径下 pidfile redis.pid #Redis默认监听端口 ...
 - vsftp 无法启动,500 OOPS: bad bool value in config file for: anonymous_enable
			
朋友的FTP启动不了,叫我帮他看,启动时出现以下错误信息: 500 OOPS: bad bool value in config file for: anonymous_enable 看似配置文件错误 ...