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

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

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

相关文章

06-kafka及异步通知文章上下架

kafka及异步通知文章上下架 1)自媒体文章上下架 需求分析 2)kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性msusmsms级以内可用性高(主从)高(主从&#…

spring中各种bean加载顺序

具体加载顺序按照罗列的顺序 XXXAware ApplicationContextAware、EnvironmentAware、BeanFactoryAware、BeanClassLoaderAware 顾名思义,用于获取对应的对象,需要在实体类中声明对应的对象且当前类为普通类能被注入。 InitializingBean void afterProp…

pyaudio webrtcvad实现实时录制语音加VAD检测没人说话自动停止录制

vad检测没人说话超过2秒就自动停止录制并保存前面有人说话的音频文件 pip install webrtcvad代码: import pyaudio import wave import time import webrtcvadCHUNK = 320 # 20ms 的语音帧 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 WAVE_OUTPUT_FILENAME

【leetcode面试经典150题】7.买卖股票的最佳时机(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

下载页面上的视频

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

WindowsPowerShell安装配置Vim的折腾记录

说明 vim一直以来都被称为编辑器之神一样的存在。但用不用vim完全取决于你自己,但是作为一个学计算机的同学来说,免不了会和Linux打交道,而大部分的Linux操作系统都预装了vim作为编辑器,如果是简单的任务,其实vim只要会…

leetcode.19. 删除链表的倒数第 N 个结点

题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 思路 先遍历一遍得到链表的长度l,在从头开始删除第l-n个节点即可 实现 class Solution {public ListNode removeNt…

Java_自定义实体类的列表List<T>调用remove()失败讲解

示例1 前提: 新建一个主类Demo1。 需求: 在一个列表中有三条String的数据,想要使用remove(Object o)删掉其中一条。 结果: remove(Object o)成功把数据删掉。 示例2 前提: 新建一个自定义实体类DataExample和一个主…

爬取学习强国视频小示例

因为需要爬取的视频数量并不是很大,总共需要将131个视频下载下来,所以就直接去手动找找视频的地址和名称保存下来的。由于页面是动态加载的,所以我们无法在网站源码中直接找到视频的超链接。设想是可以用Selenium模拟浏览器点击进行动态加载获…

uni-app如何实现高性能

这篇文章主要讲解uni-app如何实现高性能的问题? 什么是uni-app? 简单说一下什么是uni-app,uni-app是继承自vue.js,对vue做了轻度定制,并且实现了完整的组件化开发,并且支持多端发布的一种架构&#xff0c…

电脑上音频太多,播放速度又不一致,如何批量调节音频播放速度?

批量调节音频速度是现代音频处理中的一个重要环节,尤其在音乐制作、电影剪辑、有声书制作等领域,它能够帮助制作者快速高效地调整音频的播放速度,从而满足特定的制作需求。本文将详细介绍批量调节音频速度的方法、技巧和注意事项,…

移动Web学习04-移动端订单结算页PC端个人中心页面

5、电商结算页面案例 css body{background-color: #F2F2F2; } * {box-sizing: border-box;margin: 0;padding: 0; }.main{padding: 12px 11px 80px; }.pay{display: flex;height: 80px;background-color: #fff;bottom: 0;width: 100%;border-top: 1px solid #ededed;position:…

04-自媒体文章-自动审核

自媒体文章-自动审核 1)自媒体文章自动审核流程 1 自媒体端发布文章后,开始审核文章 2 审核的主要是审核文章的内容(文本内容和图片) 3 借助第三方提供的接口审核文本 4 借助第三方提供的接口审核图片,由于图片存储到minIO中&…

探索 AWK:Linux 下的文本处理

打印特定字段 打印出每行的第三个字段 # cat file.txt 1 2 3 4 5 10 20 30 40 50# awk {print $3} file.txt 3 30文本转换和格式化 给第3行都加10 # awk {$3$310; print $1, $2, $3, $4, $5} file.txt 1 2 13 4 5 10 20 40 40 50数据分析 累加第一列的和 # awk {print $1…

JAVA毕业设计132—基于Java+Springboot+Vue的自习室座位预约小程序管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的自习室座位预约小程序管理系统(源代码数据库)132 一、系统介绍 本项目前后端分离带小程序,分为管理员、用户两种角色 1、用户: 注…

B3799 [NICA #1] 序列

[B3799 NICA #1] 序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 发现两个操作跟顺序无关&#xff0c;最大子序列和就是所有正数之和。 对数组进行排序&#xff0c;之后求前缀和。用 n o w now now记录操作一加了多少。找到第一个 a i n o w < 0 a_i now \lt 0 ai​…

【Arthas案例】某应用依赖两个GAV-classifier不同的snakeyaml.jar,引起NoSuchMethodError

多个不同的GAV-classifier依赖冲突&#xff0c;引起NoSuchMethodError Maven依赖的三坐标体系GAV(G-groupId&#xff0c;A-artifactId&#xff0c;V-version) classifier通常用于区分从同一POM构建的具有不同内容的构件物&#xff08;artifact&#xff09;。它是可选的&#xf…

泰坦尼克号幸存者数据分析

泰坦尼克号幸存者数据分析 1、泰坦尼克号数据集2、数据集加载与概览3、泰坦尼克号幸存者数据分析4、哪些人可能成为幸存者&#xff1f; 1、泰坦尼克号数据集 泰坦尼克号的沉没是世界上最严重的海难事故之一&#xff0c;造成了大量的人员伤亡。这是一艘号称当时世界上最大的邮轮…

​​​​​​​【人工智能】手写数字识别

手写数字识别 实验背景 数据集介绍 MNIST数据集包含了一系列的手写数字图像&#xff0c;包括0到9的数字。每张图像都是灰度图像&#xff0c;尺寸为28x28像素。数据集共包含60000张训练图像和10000张测试图像。 MNIST数据集的目标是通过训练一个模型&#xff0c;使其能够正确地识…

Spring Boot 集成 RabbitMQ(二)

什么是Spring Boot&#xff1a; Spring Boot是Spring Framework的简化版&#xff0c;其目标是使用尽可能少的配置来简化Spring应用的开发、部署和维护。它根据项目的依赖关系自动配置Spring环境&#xff0c;开箱即用。 什么是RabbitMQ&#xff1a; RabbitMQ是一种开源的、实…