人脸识别经典论文Arcface解读

news2024/12/30 3:49:43

来源:投稿 作者:小灰灰
编辑:学姐

研究背景

1、在人脸识别时,我们需要特征的discrimination

2、之前提出到的一些方法,如triplet loss,center loss, L-softmax,a-softmax都有一些缺陷。

3、centerloss:提出的类别是两个类别,强制改变特征的内在分布,需要联合softmax一起训练,但是对于类别多的时候很难训练。

Triplet loss:训练数据选择复杂度高,semi-hard样本的选择也很复杂,大大降低训练的效率。

SphereFace,CosFace:计算复杂度高,需要辅助函数(保证单调性),以及计算cos(m*theta),并且训练很不稳定,难收敛,需要很多的策略,比如一开始要和softmax的loss做插值。

基于以上问题,发现用深度学习提取特征的主要挑战就是设计好的具有区分性的损失函数,所以提出arcface来获得高度具有区分性的特征用作人脸,并且有着清晰到的几何解释,在很多人脸识别任务上取得了很好的效果。

主要提出了新的用于识别的损失函数,additive angular margin loss,他们最大的区别在于ArchFace是直接在角度空间(angular space)中最大化分类界限,而CosineFace是在余弦空间中最大化分类界限,文章还清洗了公开数据集MS-Celeb-1M的数据,强调了干净数据的对实验结果的影响,还对网络结构和参数做了优化。

总的来说ArcFace做了很多实验来验证additive angular margin、网络结构设计和数据清洗的重要性。

论文标题:

ArcFace: Additive Angular Margin Loss for Deep Face Recognition

论文链接:

https://arxiv.org/pdf/1801.07698.pdf

论文代码:

https://github.com/deepinsight/insightface

数据集:

训练数据集:分别采用CASIA、VGGFACE2、MS1MV2、DeepGlint-Face(包括MS1M-Deepglin和Asian-Deepglin)

人脸验证数据集:LFW、YTF、CFP-FP、AGEDB-30

大姿态和大年龄数据集:CPLFW、CALFW

大规模图像数据集:MegaFace,IJB-B,IJB-C,Trillion-Pairs,iQIYI-VID(视频)

网络结构

我们将特征向量L2归一化,权重L2归一化,他俩的夹角为θ,计算cos(θj),求反余弦arccos(θyi)得到特征xi与真实权值Wyi之间的夹角θyi,添加角度间隔m,再求余弦cos(θyj+m),将所有的log乘以特征尺度s,然后将logit送到softmax函数得到各类别概率。再用Ground Truth OneHot Vector一起算出交叉熵损失。

也就是DCNN特征和最后一个完全连接层之间的点积等于特征和权重归一化后的余弦距离。我们利用arc-cosine函数来计算当前特征和目标权重之间的角度。然后,在目标角上加上一个附加的角度间隔,用余弦函数重新计算逻辑回归的反向传播过程。然后,我们用一个固定的特征范数重新缩放。

看上图,可以看到ArcFace已经具有很好的类内紧凑性和类间差异性。

(A)在样本和中心之间插入测地距离边距。

(B)减小样本与相应中心之间的测地距离。

(C)增加不同中心之间的测地距离。

(D)三个样本之间的测地距离边界。

为了提高人脸识别模型的识别能力,本文提出了一种与(A)中测地距离(弧)边缘惩罚完全对应的加性角边缘损失(ArcFace)。大量的实验结果表明,(A)策略是最有效的。

损失函数

SphereFace、CosineFace还是ArcFace的损失函数,都基于传统的softmax loss进行修改得到的,本质的目的就是一个打压,对目标的概率增加难度。

那么softmax loss函数是:

表示第i个样本的深度特征, 属于第i个类,d=512, 表示权重的第j列,bj是一个偏置项。

 因此经过演算,我们得出的ArcFace 函数是:

显而易见的理解就是:

使用8个包含足够样本的不同身份的人脸,分别训练具有具有softmax和ArcFace loss的网络,如上图可见,点表示样本,线表示每个身份的中心方向。

基于特征归一化,所有人脸特征都被推送到具有固定半径的圆弧空间。随着fixed radius惩罚的加入,最近类别之间的测地距离差距变得明显。

Softmax loss提供了可分离的特征,但是边界会产生模糊性,而arcface loss显然在类之间产生了明显的差距。

在人脸识别的领域中,不同损失函数的决策边界。虚线表示决策boundary,灰色区域表示决策margins。

实验结果

在不同数据集上此方法的效果。

消融实验,如下图可见,我们首先使用ResNet50探索CASIA数据集上ArcFace的角度设置。在我们的实验中观察到的最佳角度为0.5。可以更容易地设置SphereFace和CosFace的边距,我们发现当分别设置为1.35和0.35时,它们的性能最佳。

MegaFace上不同型号的CMC和ROC曲线。结果在原始和改进的MegaFace数据集上进行评估。

更多论文解读+代码数据集可点击卡片👇关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022.12.25 学习周报

文章目录摘要文献阅读1.题目2.摘要3.问题和方案4.介绍5.Attention Transfer5.1 Activation-based Attention Transfer5.2 Gradient-based Attention Transfer6.实验7.结论深度学习Attention机制的本质Encoder to Decoder抛开encoder-decoderAttention函数工作机制Attention机制…

20221225 海豚调度2.0.5连接星环库使用记录

阳阳的一周,算是挺过来了,现在只剩感冒了,迷迷糊糊的干了一周,混口饭吃不容易呀!简单记录一下遇到的问题吧! 连接hive(星环)数据库失败 方案一 : 海豚调度2.0.5使用的hive包是2.0版本,星环库包…

云原生之部署wordpress博客及设置圣诞主题风格

2022年圣诞节到来啦,很高兴这次我们又能一起度过~ CSDN诚邀各位技术er分享关于圣诞节的各种技术创意,展现你与众不同的精彩!参与本次投稿即可获得【话题达人】勋章【圣诞快乐】定制勋章(1年1次,错过要等下一年喔&#…

Python的条条框框

Python的条条框框 了解编程语言的分类 从运行角度的分类 从运行角度来看,编程语言的类型可以分为两种:编译型和解释型。 Python属于解释型语言。 解释型语言: 代码可以直接运行。当然,这也是依赖于附加程序(解释器&…

【VUE3】保姆级基础讲解(三)非父子组件通讯,$refs,动态组件,keep-alive,Composition API

目录 非父子组件通讯 全局事件总线mitt库 组件的生命周期 $refs 动态组件 keep-alive 异步打包 v-model绑定组件 Composition API 定义响应式数据 readonly toRefs与toRef computed $ref 生命周期钩子 provide和inject watch侦听 watchEffect script setup语法…

C++必须掌握的知识点

面向对象的三大特性 封装 继承 父类中所有的非静态成员都会被子类继承下去,只是父类的私有成员被编译器屏蔽了,访问不到。可以利用开发人员工具查看对象模型继承中,先构造父类,再构造子类,析构的顺序和构造的顺序完…

QT系列第8节 自定义对话框

在实际业务开发中经常要有各种各样的对话框来处理用户信息,本节就结合例子来说明如何自定义对话框。 目录 1.创建对话框 2.创建非模态对话框 3.创建模态对话框 4.综合案例 1.创建对话框 (1)项目鼠标右键菜单 - 添加新文件 (…

Hexo + Butterfly 自定义页脚

原文链接 :Hexo Butterfly 自定义页脚 推荐阅读 基于 Hexo 从零开始搭建个人博客(一): 环境准备基于 Hexo 从零开始搭建个人博客(二): 项目初识基于 Hexo 从零开始搭建个人博客(三): 主题安装…

CSDN每日一练最长递增的区间长度 C语言

题目名称:最长递增的区间长度 时间限制:1000ms 内存限制:256M 题目描述 给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3 (注意:测试用例仅做参考,…

Spring web开发之Request 获取三种方式

在开发 Java Web 项目中,我们经常使用 HttpServletRequest 获取请求参数、请求头等信息。在Spring项目,我们通常会使用 Spring 提供的注解获取参数,如 RequestParam、RequestHeader。 不过在某些场景下,我们可能需要从 HttpServl…

初识Docker:(4)Docker基本操作

初识Docker:(4)Docker基本操作1 镜像操作1.1 镜像名称1.2 镜像操作命令1.3 案例:docker拉取nginx镜像利用docker save将nginx镜像导出磁盘,然后再通过load加载回来1.4 镜像操作总结2 容器操作2.1 案例创建运行一个ngin…

【阅读笔记】《持续交付2.0》中理解分支、发布策略

文章目录1. 前言1.1 分支、发布 管理上解耦2. 主干 (Trunk) 和分支 (Branch)2.1 Trunk 开发 Trunk 发布2.1.1 Trunk 开发 Trunk 发布需要解决:重构的需求2.1.2 Trunk 开发 Trunk 发布需要解决:未开发完成的功能被带入发布版本2.2 Trunk 开发 Branch 发布…

leetcode:6272. 好分区的数目【思维转换(正难则反) + dp定义 + 背包问题 + 选or不选】

目录题目截图题目分析ac code总结题目截图 题目分析 先特判&#xff0c;如果sum(nums) < 2 * k显然不可能成功&#xff01;返回0出现Mod大概率就是dp1000的话提示我们用平方复杂度的dp这种取子序列的问题&#xff0c;本质就是选or不选的问题如果我们只考虑一维dp,dp[i]肯定…

Linux--信号

目录1. 信号概念2. 信号产生前2.1 信号产生的各种方式3. 信号产生中信号保存的方式3.1 阻塞信号3.2 信号屏蔽字4. 信号产生后信号处理的方式4.1 信号集操作函数4.2 sigprocmask函数4.3 sigpending函数4.4 sigaction函数5. 信号是什么时候被处理的1. 信号概念 信号是进程之间事…

golang访问KingbaseES V8R6

概述 本文介绍go语言连接KingbaseES V8R6数据库的步骤 测试环境 操作系统&#xff1a;CentOS 7.2.1511 数据库版本&#xff1a;KINGBASE (KingbaseES) V008R006C007B0012 go版本&#xff1a;go version go1.19.4 linux/amd64 KingbaseES go驱动获取 go连接kingbase数据库需…

MySQL为什么使用B+树为索引结构

目录 1、什么是索引 2、索引的类型 3、为什么要用索引 4、索引的使用场景 5、索引为什么要用B树&#xff0c;为什么不能用二叉树、红黑树、B树&#xff1f; 介绍一款可以帮助理解数据结构的网站&#xff08;很好用&#xff09;&#xff1a;Data Structure Visualization …

hadoop生产调优之Hadoop-Yarn 生产经验(参数调优)

一、常用的调优参数 1&#xff09;调优参数列表 &#xff08;1&#xff09;Resourcemanager 相关 yarn.resourcemanager.scheduler.client.thread-count ResourceManager 处理调度器请求的线程数量 yarn.resourcemanager.scheduler.class 配置调度器&#xff08;2&#xff0…

js中ArrayBuffer和node中Buffer的关系和区别

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。 它是一个字节数组&#xff0c;通常在其他语言中称为“byte array”。你不能直接操作 ArrayBuffer 中的内容&#xff1b;而是要通过类型化数组对象或 DataView 对象来操作&#xff0c;它们会将缓冲区中的数据…

C++、python、VS code插件安装与SSH使用

下载按照VS coda 官网&#xff1a;https://code.visualstudio.com 1.安装相关插件 1.中文插件&#xff08;可选&#xff09; MS-CEINTL.vscode-language-pack-zh-hans 2.C插件&#xff08;必选&#xff09; ms-vscode.cpptools 3.ssh 远程&#xff08;必选&#xff09; ms-vs…

数据结构——快排的三种实现方式

坚持看完&#xff0c;结尾有思维导图总结 这里写目录标题什么是快排&#xff1f;如何实现递归单次的排序要如何实现hore 的办法![在这里插入图片描述](https://img-blog.csdnimg.cn/40b2ac63f2424bd1828a45f8509ff116.gif#pic_center)坑位法双指针法总结什么是快排&#xff1f;…