当前位置: 首页 > news >正文

人脸识别:Arcface--loss+code

之前只接触过传统方法的人脸识别算法,本以为基于深度学习的方法会使用对比损失之类的函数进行训练,但是Arcface算法基于softmax进行了创新,本文未深究其详细的loss公式原理,在大致明白其方向下,运行了代码,记录如下。

我们知道,若分类问题的 label 有 K 个,则,softmax 最后输出K个概率, Σ k i = 1 Σk_{i} = 1 Σki=1 ,其中概率值最大的即为预测标签;
在这里插入图片描述
在这里插入图片描述

下列公式基于 Conv(wx+b) → \rightarrow Softmax → \rightarrow CrossEntropy Loss:
在这里插入图片描述
其中, f j f_{j} fj 表示类别得分 f 的向量的第 j 个元素 ( j ∈ [1, K],K 是类的数量),N 是训练数据的数量。

注意,这里先忽略b;

由矩阵点乘公式知:两个向量的点乘等于它们的数乘结果乘以两个向量之间夹角的余弦值。 A ⋅ B = ∣ A ∣ ∣ B ∣ c o s θ A·B = |A||B|cosθ AB=A∣∣Bcosθ

即,A,B均为向量,相乘以后,得到一个标量。经常用于相似度计算。
在这里插入图片描述

其中, θ j ( θ ∈ [ 0 , π ] ) θ_{j}(θ∈[0, π]) θj(θ[0,π]) 是 矢量 w j w_j wj x i x_i xi之间的角度;

如果只有两个类别 a, b,对于输入样本 x 来说(x的 label 为a),softmax强制使得 w a T > w b T w^T_a > w^T_b waT>wbT,即, ∣ ∣ w a ∣ ∣ ∣ ∣ x ∣ ∣ c o s θ a > ∣ ∣ w b ∣ ∣ ∣ ∣ x ∣ ∣ c o s θ b ||w_a||||x||cosθ_a > ||w_b||||x||cosθ_b ∣∣wa∣∣∣∣x∣∣cosθa>∣∣wb∣∣∣∣x∣∣cosθb,以便正确分类x。

为了使得分类更加严格,L-softmax提出了一种decision margin(判定间隔),要求:

∣ ∣ w a ∣ ∣ ∣ ∣ x ∣ ∣ c o s ( m θ a ) > ∣ ∣ w b ∣ ∣ ∣ ∣ x ∣ ∣ c o s θ b ||w_a||||x||cos(mθ_a) > ||w_b||||x||cosθ_b ∣∣wa∣∣∣∣x∣∣cos(mθa)>∣∣wb∣∣∣∣x∣∣cosθb,其中: θ a ∈ [ 0 , π / m ] θ_a∈[0, π/m] θa[0,π/m]

即,softmax损失并没有明确地鼓励类内紧凑性和类间可分性。

样本和参数之间的可分性可以分解为具有余弦相似性的幅值和角值:

在这里插入图片描述
按照该思路,如下图所示:
在这里插入图片描述
ArcFace 提出了 加性角度边距损失 (Additive Angular Margin Loss, ArcFace),以进一步提高人脸识别模型的判别能力,并稳定训练过程。
DCNN 特征和最后一个 FC 层权重之间的点积/内积 等于 特征和权重归一化之后的余弦距离。
先利用 反余弦 (arc-cosine) 函数来计算当前特征与目标权重之间的角度。
然后,把一个 加性角度边距 (additive angular margin) 加到目标角度,然后通过 余弦 (cosine) 函数再次获得目标 logit。
接着,通过固定的特征范数重缩放所有 logit,且后续的步骤与 Softmax Loss 中的步骤完全相同。
在这里插入图片描述

基于代码[4]运行程序;

注意:

  1. 其 test.py 是针对配对样本来进行计算准确率,即,针对测试集的.txt,是6行 12张图片,每行两张图片+label(是否相似);但是在程序测试时,是针对每张图片计算的向量,最后定位.txt中一行两个图片的向量,比较其相似性;
  2. 以灰度形式读取图片,然后使用 np.dstack 来堆叠一个图像 image 和它的水平翻转版本;在计算特征的时候,级联batch_size个图片,或者一个测试列表的图片,其输入模型的图片就是[12, 1, 128, 128] ---- 这里以6张图片举例。
    image = cv2.imread(img_path, 0)# (128, 128)image = np.dstack((image, np.fliplr(image)))# (128, 128, 2)image = image.transpose((2, 0, 1))image = image[:, np.newaxis, :, :]# [2, 1, 128, 128]
  1. 模型输出之后,取奇偶项的特征,即,还是横向级联一张图片的两种表达形式,将 [12, 512] → \rightarrow [6, 1024]
fe_1 = output[::2]
fe_2 = output[1::2]
feature = np.hstack((fe_1, fe_2))

但是在项目中,我们需要的是对于某一张图片,在图像集中找出与其同为一人的照片;为此,将 test.py 修改之后,我们进行了 仅包含6~7张 图像集 的简单测试;

因为使用的.pt应该是要求128*128的尺寸,我仅是将图片直接reshape,并未进行其他操作,故而得分都不是很高,但是简单的设置阈值,也能得到正确的结果;

针对同一个人的照片,人脸比对给出的得分在0.5左右,与其他人的得分在0.2左右;
在这里插入图片描述
在这里插入图片描述
我们的图像集中,7.jpg为阮经天,输入上述图片,测试结果也是7.jpg;

参考:

  1. ArcFace: Additive Angular Margin Loss for Deep Face Recognition
  2. https://blog.csdn.net/yiran103/article/details/83684613
  3. https://blog.csdn.net/qq_39478403/article/details/116788113
  4. https://github.com/ronghuaiyang/arcface-pytorch
  5. https://zhuanlan.zhihu.com/p/84261730

相关文章:

人脸识别:Arcface--loss+code

之前只接触过传统方法的人脸识别算法,本以为基于深度学习的方法会使用对比损失之类的函数进行训练,但是Arcface算法基于softmax进行了创新,本文未深究其详细的loss公式原理,在大致明白其方向下,运行了代码,…...

Linux-程序地址空间

目录 1. 程序地址空间分布 2. 两个问题 3. 虚拟地址和物理地址 4. 页表 5. 解决问题 6. 为什么要有地址空间 1. 程序地址空间分布 测试一下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h>int ga…...

adobe stock会员开通付费付款订阅充值教程/adobe stock免费白嫖一个月

登录adobe stock的官网&#xff0c;点击你想要下载的视频&#xff0c;然后点击免费下载&#xff0c;我们点击免费试用按钮&#xff0c;可以看到非常贵&#xff0c;需要80美金一个月&#xff0c;用fomepay可以免费白嫖一个月 点击获取一张虚拟信用卡&#xff0c;就可以白嫖一个…...

Mysql的基本命令

1 服务相关命令 命令描述systemctl status mysql查看MySQL服务的状态systemctl stop mysql停止MySQL服务systemctl start mysql启动MySQL服务systemctl restart mysql重启MySQL服务ps -ef | grep mysql查看mysql的进程mysql -uroot -hlocalhost -p123456登录MySQLhelp显示MySQ…...

leetcode.24. 两两交换链表中的节点

题目 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 思路 创建虚拟头节点&#xff0c;画图&#xff0c;确认步骤。 实现 /*** Definition for singly-li…...

后端开发框架Spring Boot快速入门

写在前面 推荐将本文与Spring Boot 相关知识和工具类一文结合起来看&#xff0c;本文为主&#xff0c;上面那篇文章为辅&#xff0c;一起食用&#xff0c;以达到最佳效果&#xff0c;当然&#xff0c;大佬随意。 IDEA创建Spring Boot工程 关于Spring Boot框架项目&#xff0…...

I2C驱动实验:验证所添加的I2C设备的设备节点

一. 简介 前面一篇文章向设备树中的 I2C1控制器节点下&#xff0c;添加了AP3216C设备节点。文章如下&#xff1a; I2C驱动实验&#xff1a;向设备树添加 I2C设备的设备节点信息-CSDN博客 本文对设备树进行测试&#xff0c;确认设备节点是否成功创建好。 二. I2C驱动实验&a…...

160 Linux C++ 通讯架构实战14,epoll 反应堆模型

到这里&#xff0c;我们需要整理一下之前学习的epoll模型&#xff0c;并根据之前的epoll模型&#xff0c;提出弊端&#xff0c;进而整理epoll反应堆模型&#xff0c;进一步深刻理解&#xff0c;这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…...

根据mysql的执行顺序来写select

过滤顺序指的是mysql的逻辑执行顺序&#xff0c;个人觉得我们可以按照执行顺序来写select查询语句。 目录 一、执行顺序二、小tips三、案例第一轮查询&#xff1a;统计每个num的出现次数第二轮查询&#xff1a;计算**最多次数**第三轮查询&#xff1a;找到所有出现次数为最多次…...

spring 和spring boot的区别

Spring是一个开源的Java开发框架&#xff0c;旨在简化Java应用程序的开发。它提供了一个综合的编程和配置模型&#xff0c;用于构建各种类型的应用程序&#xff0c;从简单的命令行工具到复杂的企业级Web应用程序。 Spring Boot是Spring框架的一个扩展&#xff0c;旨在简化Spri…...

Day84:服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

目录 端口协议-口令爆破&未授权 弱口令爆破 FTP&#xff1a;文件传输协议 RDP&#xff1a;Windows远程桌面协议 SSH&#xff1a;Linux安全外壳协议 未授权案例(rsync) 桌面应用-QQ&WPS&Clash QQ RCE 漏洞复现 WPS RCE 漏洞复现 Clas* RCE 漏洞复现 知识点…...

视频分块上传Vue3+SpringBoot3+Minio

文章目录 一、简化演示分块上传、合并分块断点续传秒传 二、更详细的逻辑和细节问题可能存在的隐患 三、代码示例前端代码后端代码 一、简化演示 分块上传、合并分块 前端将完整的视频文件分割成多份文件块&#xff0c;依次上传到后端&#xff0c;后端将其保存到文件系统。前…...

深入浅出 -- 系统架构之单体到分布式架构的演变

一、传统模式的技术改革 在很多年以前&#xff0c;其实没有严格意义上的前后端工程师之分&#xff0c;每个后端就是前端&#xff0c;同理&#xff0c;前端也可以是后端&#xff0c;即Ajax、jQuery技术未盛行前的年代。 起初&#xff0c;大部分前端界面很简单&#xff0c;显示的…...

每日一题 第七十期 洛谷 [蓝桥杯 2020 省 AB2] 回文日期

[蓝桥杯 2020 省 AB2] 回文日期 题目描述 2020 年春节期间&#xff0c;有一个特殊的日期引起了大家的注意&#xff1a;2020 年 2 月 2 日。因为如果将这个日期按 yyyymmdd 的格式写成一个 8 8 8 位数是 20200202&#xff0c;恰好是一个回文数。我们称这样的日期是回文日期。…...

蓝桥杯第十四届C++A组(未完)

【规律题】平方差 题目描述 给定 L, R&#xff0c;问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 。 输入格式 输入一行包含两个整数 L, R&#xff0c;用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 样例输入 1 5 样例输出 …...

职场口才提升之道

职场口才提升之道 在职场中&#xff0c;口才的重要性不言而喻。无论是与同事沟通协作&#xff0c;还是向上级汇报工作&#xff0c;亦或是与客户洽谈业务&#xff0c;都需要具备良好的口才能力。一个出色的职场人&#xff0c;除了拥有扎实的专业技能外&#xff0c;还应具备出色…...

【算法练习】28:选择排序学习笔记

一、选择排序的算法思想 弄懂选择排序算法&#xff0c;先得知道两个概念&#xff1a;未排序序列&#xff0c;已排序序列。 原理&#xff1a;以升序为例&#xff0c;选择排序算法的思想是&#xff0c;先将整个序列当做未排序的序列&#xff0c;以序列的第一个元素开始。然后从左…...

【关于窗口移动求和的两种计算方法】

窗口移动计算方法 例子方法1方法2运行结果: 例子 在很多算法中都会涉及到窗口滑动&#xff0c;比如基于新息序列更新的自适应卡尔曼滤波器算法中便会使用到。 已知一个数列&#xff1a;OCV [1;2;3;4;5;6;7;8;9;10;11;12;13;14;15]&#xff0c;定义窗口长度为5&#xff0c;每次…...

Win10文件夹共享(有密码的安全共享)(SMB协议共享)

前言 局域网内&#xff08;无安全问题&#xff0c;比如自己家里wifi&#xff09;无密码访问&#xff0c;参考之前的操作视频 【电脑文件全平台共享、播放器推荐】手机、电视、平板播放硬盘中的音、视频资源 下面讲解公共网络如办公室网络、咖啡厅网络等等环境下带密码的安全…...

Client sent an HTTP request to an HTTPS server

背景 最近踩坑了 我发现域名&#xff1a;8000可以访问我的服务 但是域名&#xff1a;443却不行&#xff0c;这很反常 结果发现是nginx配置的问题&#xff0c;需要把http改成https&#xff01; 原因 如果你的后端服务&#xff08;运行在8000端口上&#xff09;已经配置了SS…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...