人脸识别之caffe-face

2023-11-16

该论文为2016年的一篇ECCV,ADiscriminative Feature Learning Approach for Deep Face Recognition。还是深圳先进院乔宇老师组的一篇。不管是思想还是效果都非常的棒。

论文思想:

 

整体流程就是读取输入的图像,然后做个前向传播,应用softmax loss+center loss学习到DiscriminativeFeatures,然后进行标签的预测。

         softmaxloss可以实现将2个类别分开,center loss可以实现减少类类距离,增加类间距离的效果,有点类似,线性判别分析LDA(Linear Discriminant Analysis)的思想。在效果上优于contrastiveloss和triplet loss,解决了这2个方法在采样问题中的trick。

         其中,softmaxloss公式如下:

 

center loss公式如下:

 

 

总体的损失函数就是下面的式子:

 

实际的mnist测试效果如下图所示:

左图为不加center_loss的效果,右图为加了center_loss的效果。可见效果确实是不错的。

最后,测试2张人脸图像的相似性,直接计算cosine distance,简单的理解,2个特征向量越相似,夹角就会越小,cos值就会越大,也就是2个人脸越相似。

 

注意事项:

因为必须首先确保matcaffe的正确安装,linux下安装成功的标志为在cafferoot/matlab/+caffe/目录下有caffe_.mexa64存在。同理,windows为caffe\Build\x64\Release\matcaffe\+caffe\private下有caffe_.mexw64存在。

 

直接跑测试的demo的话,原版的caffe就可以跑,因为虽然作者使用了center_loss,但是在检测的过程中,只用到了前向传播,在face_deploy.prototxt中是没有center_loss这个layer的。

跑训练的话就需要编译作者提供的caffe了,里面用到了center_loss,原版的caffe是不带的,或者自己加进去,重新编译下。可以看到在face_train_test.prototxt中是包含center_loss这一层的。

实验结果:

测试图像如下,大小为816*816,

 

matlab源码运行效果:

 

 

本人改好的c语言release下运行效果(8G内存+XeonE3-1225)

 

本人改好的CUDA下运行效果(titanX)

 

官方程序链接:https://github.com/ydwen/caffe-face

http://ydwen.github.io/

 

tensorflow 版本的centerloss 实现:

def get_center_loss(features, labels, alpha, num_classes):
    # alpha:中心的更新比例
    # 获取特征长度
    len_features = features.get_shape()[1]
    # 建立一个变量,存储每一类的中心,不训练9
    centers = tf.get_variable('centers', [num_classes, len_features], dtype=tf.float32,
        initializer=tf.constant_initializer(0), trainable=False)
    # 将特征reshape成一维
    labels = tf.reshape(labels, [-1])
 
    # 获取当前batch每个样本对应的中心
    centers_batch = tf.gather(centers, labels)
    # 计算center loss的数值
    loss = tf.nn.l2_loss(features - centers_batch)
 
    # 以下为更新中心的步骤
    diff = centers_batch - features
 
    # 获取一个batch中同一样本出现的次数,这里需要理解论文中的更新公式
    unique_label, unique_idx, unique_count = tf.unique_with_counts(labels)
    appear_times = tf.gather(unique_count, unique_idx)
    appear_times = tf.reshape(appear_times, [-1,1])
 
    diff = diff / tf.cast((1+ appear_times), tf.float32)
    diff = alpha * diff
    # 更新中心
    centers = tf.scatter_sub(centers, labels, diff)
 
    return loss, centers

 

人脸识别训练:

该训练最重要的其实还是数据集的准备,也就是先期数据的预处理,所有的图片都要crop为112*96的大小,因为这里是使用的caffe自带的train进行训练的。

修改face_train_test.prototxt中的相关参数,

18行:source的位置,训练的图片,格式为路径/图片名  类别(从0开始)

39行:source的位置,测试的图片,格式为路径/图片名  类别

1146行:num_output,输出的个数,CASIA有10575个,但是有3个和LFW一样,所以这里作者用了10572个

1175行:num_output,输出的个数,CASIA有10575个,但是有3个和LFW一样,所以这里作者用了10572个

1180行:loss_weight,这里作者程序中给的是0.008,论文中验证的是0.003最佳,可以结合自己的数据集实际测试,本人测试效果差距不大,该参数为center_loss的乘积参数

然后下面的脚本开始训练,

 

cd $CAFFE-FACE_ROOT
./build/tools/caffe train -solver face_example/face_solver.prototxt -gpu X,Y

ps:CASIA-WebFace和LFW重复照片的对应关系为,

 

LFW识别率测试:

 

由于作者提供了其LFW数据集提取出来的特征矩阵,所以,本人也对其LFW识别率进行了测试。

首先,LFW的这个测试,包含了6000对测试比对,其中3000对为同一个人的比对,3000对不同人之间的比对,下面贴一个本人写的matlab小程序。

 

%directed by watersink2016.12.26
%any question,send me watersink2016@gmail.com

clc;clear;

pair = importfile('pair.txt',1, 6001);
pic1=pair(:,1);
num1=pair(:,2);
pic2_num2=pair(:,3);
num2=pair(:,4);
LFW_Feature=load('LFW_Feature');

similarone=[];
similartwo=[];

for i=2:6001
%    第一行不做处理
i
str1='';
str2='';
if  length(pic2_num2{i})<4
    %处理同一个人
    str1=strcat(strcat(strcat(pic1{i},'_'),num2str(num1{i},'%04d')),'.jpg');
    str2=strcat(strcat(strcat(pic1{i},'_'),num2str(str2num(pic2_num2{i}),'%04d')),'.jpg');
else
    %处理不同人
    str1=strcat(strcat(strcat(pic1{i},'_'),num2str(num1{i},'%04d')),'.jpg');
    str2=strcat(strcat(strcat(pic2_num2{i},'_'),num2str(num2{i},'%04d')),'.jpg');
end
    numnum1=find(strcmp(LFW_Feature.list,str1)==1);
    numnum2=find(strcmp(LFW_Feature.list,str2)==1);
    similar=dot(LFW_Feature.feature(:,numnum1),LFW_Feature.feature(:,numnum2))/norm(LFW_Feature.feature(:,numnum1))...
        /norm(LFW_Feature.feature(:,numnum2));

    if length(pic2_num2{i})<4
        similarone=[similarone;similar];
    else
        similartwo=[similartwo;similar];
    end

end

%画最后相似性得分图
figure,plot(similarone);
xlabel('category');ylabel('similarity');title('oneself to oneself');
figure,plot(similartwo);
xlabel('category');ylabel('similarity');title('oneself to otherselves');

%测试不同阈值下的最终识别率
similiarityAll=[];
for threshold=0:0.0001:1
    threshold
    numpos=0;
    numneg=0;
    for i=1:size(similarone,1)
        if similarone(i)>=threshold
            numpos=numpos+1;
        else
            numneg=numneg+1;
        end
         if similartwo(i)<threshold
             numpos=numpos+1;
         else
             numneg=numneg+1;
        end
    end
    similiarity=numpos/(numpos+numneg);
    similiarityAll=[similiarityAll;similiarity];
    
end
bestthreshold=find(similiarityAll==max(similiarityAll));
figure,plot([0:0.0001:1],similiarityAll),hold on,plot(bestthreshold/10000,max(similiarityAll),'*r');
xlabel('threshold');ylabel('similarity');title('different threshold generate different similiarity');

 

 

 

 

上面第一个图为,3000对自己和自己的图像进行比对的cos距离值,第二幅图为自己和别人的图片进行比对的cos距离值,第三幅图为不同阈值(0-1)下的识别率,红色标记的*表示为最佳的识别率。

本人测试的最终的最佳识别率为0.9875,该识别率下的阈值为

    0.4164
    0.4165
    0.4166
    0.4167
    0.4395
    0.4396
    0.4397
    0.4398
    0.4399
    0.4400
    0.4401
    0.4402
    0.4403

和作者论文中的0.9928还是有个小差距的。可能出错的地方可能就是本人处理数据的某些细节可能和作者的不一样把,或者这里提供的不是最好的那个模型,而是一个供开源测试的模型吧,本人猜测。这里,希望可以得到大神的指正。

程序和所需文件下载链接:http://download.csdn.net/detail/qq_14845119/9721049

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

人脸识别之caffe-face 的相关文章

  • 蓝桥杯第十四届省赛完整题解 C/C++ B组

    没有测评 不知道对不对 仅仅过样例而已 试题 A 日期统计 本题总分 5 分 问题描述 小蓝现在有一个长度为 100 的数组 数组中的每个元素的值都在 0 到 9 的 范围之内 数组中的元素从左至右如下所示 5 6 8 6 9 1 6 1
  • 虚拟服务器lan网段地址,lan侧服务器ip地址

    lan侧服务器ip地址 内容精选 换一换 云平台支持修改主网卡的私有IP地址 具体操作请参见本节内容 如需修改扩展网卡的私有IP地址 请删除网卡 并挂载新网卡 云服务器已关机 如果网卡绑定了虚拟IP或者DNAT规则 需要先解绑 如果网卡上有

随机推荐

  • 双向交错CCM图腾柱无桥单相PFC学习仿真与实现(2)SOGI_PLL学习仿真总结

    目录 前言 SOGI基本原理 锁相环基本原理 仿真实现及说明 总结 前言 前面总结了双向交错CCM图腾柱无桥单相PFC系统实现 后面把问题细分 关于SOGI锁相环的应用和学习在这里总结下 双向交错CCM图腾柱无桥单相PFC学习仿真与实现 1
  • 大数据流处理(Spark Streaming + Kafka)面试常考考点

    1 ack Kafka Producer的参数 是把数据写到Kafka broker里面去时需要的参数 常见的值有1 0 all 1 0 leader不做等待 只管发不管结果 延时性最低 持久性最差 1 默认 只要leader写数据到本地即
  • Windows 安装 Nginx

    Nginx下载nginx documentation Nginx 是一个高性能的网页服务器 能够反向代理HTTP HTTPS SMTP POP3 IMAP的协议链接 也可以作为一个负载均衡器和 HTTP 缓存 是一个免费 开源 高性能的 H
  • LeGO-LOAM建图

    1 安装LeGO LOAM LeGO LOAM需要依赖 ROS 环境 和 gtsam 遇到github下载慢的情况 可以从gitee导入仓库下载 1 1安装依赖项 wget wget O software gtsam zip https g
  • win10程序员计算器面板按钮介绍

    HEX 十六进制 DEC 十进制 OCT 八进制 BIN 二进制 注意这里的二进制为二进制补码形式 每输入一个数 进制转换会自动进行 QWORD 四字 64位 DWORD 双字 32位 WORD 字 16位 BYTE 字节 8位 Lsh 左
  • 递归实现逆序输出整数——C语言

    本题目要求读入1个正整数n 然后编写递归函数reverse int n 实现将该正整数逆序输出 输入格式 输入在一行中给出1个正整数n 输出格式 对每一组输入 在一行中输出n的逆序数 输入样例 12345 结尾无空行 输出样例 54321
  • BFC渲染机制

    BFC block formatting context 块级格式化上下文 实际就是一个隔离罩 W3C CSS2 1 规范中的一个概念 它是页面中的一块渲染区域 并且有一套渲染规则 它决定了其子元素将如何定位 以及和其他元素的关系和相互作用
  • 2013年9月24日星期二(demo5_1参数化2D直线)

    现在很想封装下3D的 将所谓的难度踏在脚下 好 现在准备了 代码到哪里 分析到哪里 首先 包含各种头文件 include common h include DDraw Interface h using namespace std HWND
  • iMazing传输 iPhone 备忘录和通话记录功能

    对于经常需要进行客户联系的业务员来说 通过整理通话记录 能够统计到拜访客户的次数 效果等数据 如果是通过手动统计的方式 将耗费大量的时间与精力 iMazing为苹果设备用户提供了功能齐全的通话管理功能 用户可以通过使用该功能 查询相关的通话
  • 使用Python搭建代理服务器- 爬虫代理服务器详细指南

    搭建一个Python爬虫代理服务器可以让你更方便地管理和使用代理IP 下面是一个详细的教程来帮助你搭建一个简单的Python爬虫代理服务器 1 首先 确保你已经安装了Python 你可以在官方网站 https www python org
  • 打开c语言生成exe文件,出现闪退的解决方法

    额 在给大一学弟上第一节实验课的时候 经常有学弟问我 为什么打开c语言生成的exe文件 立马闪退 起初个别问的时候 我只是简单的说明程序运行完了 就自动关了 现在先不用涉及这个 以后自然懂了 但是后来问的人多了 我就觉得有必要先给他们提一下
  • Entity Framework Core系列教程-24-使用存储过程

    在Entity Framework Core中使用存储过程 在这里 您将学习如何在Entity Framework Core中执行数据库存储过程 EF Core提供了以下方法来执行存储过程 DbSet
  • 【总结】C++各种进制转换函数汇总

    文章目录 前言 一 指定格式转换输出 二 任意2 36进制数转化为10进制数 三 10进制数转换为任意的n进制数 四 使用字符串流string stream进制转换 前言 进制之间的转换有两种方法 自定义进制转换函数 将一个n进制的数转换为
  • FFmpeg中AVDictionary介绍

    FFmpeg中的AVDictionary是一个结构体 简单的key value存储 经常使用AVDictionary设置或读取内部参数 声明如下 具体实现在libavutil模块中的dict c h 提供此结构体是为了与libav兼容 但它
  • gcc命令生成静态库和动态库

    一 基本概念1 1什么是库在windows 平台和linux 平台下都大量存在着库 本质上来说库是一种可执行代码的二进制形式 可以被操作系统载入内存执行 由于windows 和linux 的平台不同 主要是编译器 汇编器和连接器的不同 因此
  • pandas 数据结构

    Series常用操作 知道 Series创建 传入一个Python列表 如果传入的数据类型是统一的数字 那么最终的dtype类型是int64 如果传入的数据类型是统一的字符串 那么最终的dtype类型是object 如果传入的数据类型是多种
  • TensorFlow搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)

    目录 I 前言 II CNN LSTM III 代码实现 3 1 数据处理 3 2 模型训练 测试 3 3 实验结果 IV 源码及数据 I 前言 前面已经写了很多关于时间序列预测的文章 深入理解PyTorch中LSTM的输入和输出 从inp
  • input标签限制只能输入数字

  • 操作系统实验:银行家算法(C语言)

    实验内容 某系统中进程P1 P2 P3 Pn 同时请求资源R1 R2 R3 Rn 已知t0时刻资源分配情况 参考下表 1 编写程序 分析当前系统状态是否安全 若系统安全 请输出安全序列 2 在系统安全的情况下 若有进程提出资源请求 如t1时
  • 人脸识别之caffe-face

    该论文为2016年的一篇ECCV ADiscriminative Feature Learning Approach for Deep Face Recognition 还是深圳先进院乔宇老师组的一篇 不管是思想还是效果都非常的棒 论文思想