• 《ArcFace: Additive Angular Margin Loss for Deep Face Recognition》
    2018,Jiankang Deng et al.Insight Face

引言:
Centre loss主要惩罚了深层特征与其相应的欧几里得空间类中心之间的距离,以实现类内紧凑性。
SphereFace假设在最后一个完全连接的层中的线性变换矩阵可以用角空间中的类中心来表示,并且以乘法方式惩罚深度特征与其相应的权重之间的角度
本文提出了一种用于人脸识别的Additive Angular Margin Loss(ArcFace)算法。

算法流程如图所示:

DCNN特征和最后一个完全连接的层之间的点积等于特征和权重归一化之后的余弦距离。利用余弦函数(arc-cosine function)计算人脸特征和目标权重之间的夹角。然后,在目标角度上增加一个附加的角余量,通过余弦函数再次得到目标logit。最后,我们用一个固定的特征范数重新缩放所有logits,并且后续步骤与softmax loss中的步骤完全相同。

ArcFace的优点:
Engaging. ArcFace利用归一化超球面中角与弧之间的精确对应关系直接优化测地线距离间隔。
Effective. ArcFace在十个人脸识别基准(包括大规模图像和视频数据集)上实现了最先进的性能。
Easy. ArcFace在深度学习框架中极其容易实现。
Efficient. ArcFace在训练过程中不会带来复杂的计算量。

ArcFace算法
传统的softmax loss损失函数:

为了简化计算,把偏置b设置为0,,然后权重和输入的内积用下面式子表示

然后使用L2正则化处理Wj使得||Wj||=1,L2正则化就是将Wj向量中的每个值都分别除以Wj的模,从而得到新的Wj,新的Wj的模就是1。这一步操作在SphereFace、CosineFace中都有做。 再乘以一个scale参数s;

将cos(θyi)用cos(θyi+m)替代,这部分是ArcFace的核心,公式也是非常简洁,m默认取0.5。

这样修改的原因:
角度距离比余弦距离在对角度的影响更加直接

算法流程:

通过组合所有的边际惩罚,我们将SphereFace、ArcFace和CosFace实现在一个统一的框架中,以m1、m2和m3作为超参数。

Geometric Difference.
不同损失函数的决策边界:

图示:

注:ArchFace中是直接在角度空间(angular space,也就是横纵坐标是角度θ1和θ2,不是softmax或CosineFace中的cosθ1和cosθ2)中最大化分类界限。

不同损失函数的比较结果:

总结:
本文提出了一种附加角间距(Angular Margin)损失函数,它能够有效地提高通过DCNN学习的特征嵌入在人脸识别中的识别能力。

参考代码

import tensorflow as tf
import mathdef arcface_loss(embedding, labels, out_num, w_init=None, s=64., m=0.5):''':param embedding: the input embedding vectors:param labels:  the input labels, the shape should be eg: (batch_size, 1):param s: scalar value default is 64:param out_num: output class num:param m: the margin value, default is 0.5:return: the final cacualted output, this output is send into the tf.nn.softmax directly'''cos_m = math.cos(m)sin_m = math.sin(m)mm = sin_m * m  # issue 1threshold = math.cos(math.pi - m)with tf.variable_scope('arcface_loss'):# inputs and weights normembedding_norm = tf.norm(embedding, axis=1, keep_dims=True)embedding = tf.div(embedding, embedding_norm, name='norm_embedding')weights = tf.get_variable(name='embedding_weights', shape=(embedding.get_shape().as_list()[-1], out_num),initializer=w_init, dtype=tf.float32)weights_norm = tf.norm(weights, axis=0, keep_dims=True)weights = tf.div(weights, weights_norm, name='norm_weights')# cos(theta+m)cos_t = tf.matmul(embedding, weights, name='cos_t')cos_t2 = tf.square(cos_t, name='cos_2')sin_t2 = tf.subtract(1., cos_t2, name='sin_2')sin_t = tf.sqrt(sin_t2, name='sin_t')cos_mt = s * tf.subtract(tf.multiply(cos_t, cos_m), tf.multiply(sin_t, sin_m), name='cos_mt')# this condition controls the theta+m should in range [0, pi]#      0<=theta+m<=pi#     -m<=theta<=pi-mcond_v = cos_t - thresholdcond = tf.cast(tf.nn.relu(cond_v, name='if_else'), dtype=tf.bool)keep_val = s*(cos_t - mm)cos_mt_temp = tf.where(cond, cos_mt, keep_val)mask = tf.one_hot(labels, depth=out_num, name='one_hot_mask')# mask = tf.squeeze(mask, 1)inv_mask = tf.subtract(1., mask, name='inverse_mask')s_cos_t = tf.multiply(s, cos_t, name='scalar_cos_t')output = tf.add(tf.multiply(s_cos_t, inv_mask), tf.multiply(cos_mt_temp, mask), name='arcface_loss_output')return output

注:博众家之所长,集群英之荟萃。

ArcFace:Insight Face相关推荐

  1. 人脸识别系列(十七):ArcFace/Insight Face

    论文链接:ArcFace: Additive Angular Margin Loss for Deep Face Recognition 作者开源代码:https://github.com/deepi ...

  2. python/ML/DL学习目录

    第一部分:python语法学习 . /*******环境搭建************/ 1. Anaconda安装 2. Anaconda的使用 3. Spyder的使用中遇到的问题 4. Jupyt ...

  3. Arcface v1 论文翻译与解读

    神罗Noctis 2019-10-13 16:14:39  543  收藏 4 展开 论文地址:http://arxiv.org/pdf/1801.07698v1.pdf 最新版本v3的论文翻译:Ar ...

  4. 人脸识别:arcFace Loss详解

    论文链接:ArcFace: Additive Angular Margin Loss for Deep Face Recognition  作者开源代码:https://github.com/deep ...

  5. insight切换窗口 source_Source Insight函数调用关系显示设置

    当我们需要设置source Insight的项目代码中函数调用关系时,可通过如下的设置来实现: 1.显示函数调用关系窗口 Source Insight工具栏中"View"-> ...

  6. 度量学习:ArcFace算法和工程应用总结

    目录 前言 1 度量学习简介 2 ARCFace介绍 3 实际应用时的探讨 探讨1:类似于人脸识别这样的应用,从0到落地应用的大概流程是怎样的? 探讨2:怎么评估这个特征提取器网络训练好了? 探讨3: ...

  7. Sourse Insight使用教程及常见的问题解决办法

    1.下载安装 2.创建项目new project(注意不是file-->new ),而是project-->new project,输入项目名称和密码. 3.添加文件,其实就是将你的整个项 ...

  8. linux环境insight安装与使用

    去官网下载:ftp://sourceware.org/pub/insight/releases 安装步骤 # wget ftp://sourceware.org/pub/insight/release ...

  9. 实战:人脸识别的Arcface实现 | CSDN博文精选

    来源 | CSDN博客 本文将简单讲述arcface从训练到部署的整个过程,主要包括前期的数据筛选和准备,模型训练以及模型部署. 此文参考的arcface的代码地址: https://github.c ...

最新文章

  1. 20个绝密电脑小技巧
  2. cocos2d-x游戏开发(十五)游戏加载动画loading界面
  3. 前端优化-vue-cli4安装webpack-bundle-analyzer分析包文件
  4. 电脑微信扫一扫在哪_怎么进入和管理企业微信的后台?
  5. 二叉排序树求每个结点平衡因子程序
  6. PMP考试答题技巧-模拟题库
  7. Visual Leak Detector(vld)无法显示内存泄露行号
  8. face_recognition库的使用
  9. 【聚类分析】基于FCM聚类实现交通干道车流量聚类分析及预测含Matlab源码
  10. java工程师职责负责_java工程师岗位职责
  11. Unable to open OMF51 file...
  12. 如何简单可靠地装系统-软碟通
  13. oppo手机注册服务器地址,oppo云登录服务器(oppo云服务登录入口)
  14. JavaScript(第三天)—爱创课堂专业前端培训
  15. Redis缓存过期和淘汰策略
  16. 短信验证注册,一个完整而优雅的JAVA后端实现
  17. 解决Ubuntu 20.04 播放视频,因缺少编解码器无法处理音频/视频流,以及解决‘因没有公钥,无法验证下列签名’问题
  18. 什么值传递和引用传递
  19. PHP对接企业微信审批回调
  20. WINDOW中判断文件是否存在的方法

热门文章

  1. linux下删除以 - 开头的文件
  2. 2016北京集训测试赛(九)Problem C: 狂飙突进的幻想乡
  3. 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)...
  4. 各种稀奇古怪的问题(持续更新中)
  5. java ODBC连接MYSQL数据库
  6. cstring转int(long转CString)
  7. 敏捷软件开发(2)--- 设计原则
  8. HTTP-XMLHttpRequest
  9. vue-cli3 在qq浏览器不兼容
  10. 服务器遇到大流量攻击的处理过程