人脸识别: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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024.4.2-[作业记录]-day07-CSS 盒子模型(显示模式、盒子模型)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.2 学习笔记CSS标签元素显示模式1 块元素2 行内元素3 行内块元素4…

计算机组成结构—存储器概述

目录 一、存储器的分类 1.按存储介质分类 半导体存储器 磁性材料存储器 光盘存储器 2.按存取方式分类 随机存储器(Random Access Memory, RAM) 只读存储器(Read Only Memory, ROM) 串行访问存储器…

如何在iPhone上恢复永久删除的照片?

2007 年,Apple Inc. 推出了这款震撼人心的智能手机,后来被称为 iPhone。您会惊讶地发现,迄今为止,Apple Inc. 已售罄 7 亿台 iPhone 设备。根据 2023 年 8 月的一项调查数据,95% 的智能手机利润都落入了苹果公司的口袋…

下载页面上的视频

引言:有些页面上的视频可以直接右键另存为或者F12检索元素找到视频地址打开后保存,但有些视频页面是转码后的视频,不能直接另存为视频格式,可以参考下本方法 以该页面视频为例:加载中...点击查看详情https://wx.vzan.c…

#SOP#-如何使用AI辅助论文创作

#SOP#-如何使用AI辅助论文创作 ——2024.4.6 “在使用工具的时候,要做工具的主人” 最终交付物: 一份可执行的AI辅助创作论文的指导手册 交付物质量要求: 不为任何AI大模型付费!不为任何降重网站付费!通过知网检查论…

苍穹外卖08(地址簿功能,用户下单功能,订单支付全过程,内网穿透Cpolar)

目录 一、导入地址簿功能代码 1. 需求分析和设计 1 产品原型 2 接口设计 2. 代码导入 3. 功能测试 二、用户下单 1. 需求分析和设计 1 产品原型 2 接口设计 3 表设计 2. 代码开发 1 DTO设计 2 VO设计 3 开发代码 3. 功能测试 三、订单支付 1 微信支付介绍 1 …

Java 学习和实践笔记(51):二分法查找(折半检索)

二分法查找(折半检索)又叫binary search. 要在一堆数据中查找是否存在某一个已知数,二分法查找的步骤: 第一步,对数据实现排序 第二步,将该数与排序后的数据集的中间一个数进行比较 第三步,…

非关系型数据库(缓存数据库)redis的性能管理

目录 一.Redis性能管理 1.Info Memory——查看Redis内存使用 2.内存碎片率 3. 内存使用率 4.内存回收key 二.缓存的穿透,击穿和雪崩 1.缓存的穿透 1.1 问题描述 1.2 缓存穿透发生的条件 1.3 缓存穿透发生的原因 1.4 解决方案 2 缓存的击穿 2.1 问题描…

使用SVD将图像压缩四分之一(MATLAB)

SVD压缩前后数据量减少的原因在于,通过奇异值分解(SVD),我们将原始数据(如图像)转换成了一种更加紧凑的表示形式。这种转换依赖于数据内部的结构和相关性,以及数据中信息的不均匀分布。 让我们…

以 2021inCTF-DeadlyFastGraph 入门 JSC利用

前言 最近一直在入门浏览器的利用,然后一直都在搞 V8,然后接触的比较多的都是一些混淆、越界的洞,希望后面可以入门 jit 然后在今年的阿里云 CTF 中看到了一道 jsc 相关的题目,当时本来想做一做的,但是环境一直没有搭…

vLLM介绍

vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架,旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM是一个快速且易于使用的库,用于 LLM 推理和服务,可以和HuggingFace 无缝集成。vLLM利用了全新的注意力算法「Page…

ZKP价值链路的垂直整合

1. ZKP proof生命周期 从ZKP(zero-knowledge proof)生命周期,先看围绕ZKP的价值链路形成: 1)User intent用户意图:以某用户意图为起点,如想要在某zk-rollup上swap某token、证明其身份、执行某…

java数据结构与算法刷题-----LeetCode405. 数字转换为十六进制数

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 分组位运算 分组位运算 这道题正常来说可以用转换7进制的思想来&…

加速度:电子元器件营销网站的功能和开发周期

据工信部预计,到2023年,我国电子元器件销售总额将达到2.1万亿元。随着资本的涌入,在这个万亿级赛道,市场竞争变得更加激烈的同时,行业数字化发展已是大势所趋。电子元器件B2B商城平台提升数据化驱动能力,扩…

算法学习18:动态规划

算法学习18:动态规划 文章目录 算法学习18:动态规划前言一、线性DP1.数字三角形:f[i][j] max(f[i - 1][j - 1] a[i][j], f[i - 1][j] a[i][j]);2.1最长上升子序列:f[i] max(f[i], f[j] 1);2.2 打印出最长子序列3.最长公共子序…

[从零开始学习Redis | 第九篇] 深入了解Redis数据类型

前言: 在现代软件开发中,数据存储和处理是至关重要的一环。为了高效地管理数据,并实现快速的读写操作,各种数据库技术应运而生。其中,Redis作为一种高性能的内存数据库,广泛应用于缓存、会话存储、消息队列…

MySQL - 基础三

11、事务管理 CURD不加控制,会有什么问题? 当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库时,客户端B检查了票数,发现大于0,于是又卖了一次票。然后A将票数更新回数据库。这是就出现…

09 flink-sql 中基于 mysql-cdc 的 select * from test_user 的具体实现

前言 这也是最近帮一个朋友看问题 遇到的一个问题 然后 引发了一下 对于 flink-sql 里面的一些 常规处理的思考, 理解 原始问题主要是 在测试库可以使用 flink-sql 可以正常同步, 但是 在生产环境 无法正常同步数据 这个问题 我们后面单独 记录一篇文章 测试用例 下载…

设计模式总结-外观模式(门面模式)

外观模式 模式动机模式定义模式结构外观模式实例与解析实例一:电源总开关实例二:文件加密 模式动机 引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦…

携程旅行 abtest

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章…