论文阅读笔记:ArcFace: Additive Angular Margin Loss for Deep Face Recognition

论文阅读笔记:ArcFace: Additive Angular Margin Loss for Deep Face Recognition

  • 1 背景
  • 2 创新点
  • 3 方法
  • 4 模块
    • 4.1 Softmax
    • 4.2 权重归一化
    • 4.3 乘性角度间隔
    • 4.4 特征归一化
    • 4.5 加性余弦间隔
    • 4.6 加性角度间隔
    • 4.7 二值化情况下的比较
    • 4.8 目标Logit分析
  • 5 效果
    • 5.1 消融实验
    • 5.2 和SOTA方法对比

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

代码:https://github.com/deepinsight/insightface

1 背景

通过深度卷积网络嵌入的人脸表示被认为是目前最先进的人脸验证、人脸聚类和人脸识别方法。深度卷积网络负责将人脸图像(通常经过姿态归一化步骤)映射为嵌入特征向量,使得同一个人的特征具有较小的距离,而不同个体的特征具有相当大的距离。

通过深度卷积网络嵌入的各种人脸识别方法在三个主要属性上是不同的。

第一个属性是用于训练模型的训练数据。虽然公开可用的训练数据有大量的ID,但它们存在注释噪声和长尾分布。由于在训练数据规模上存在数量级上的差异,来自工业界的人脸识别模型的性能要远远优于来自学术界的模型。训练数据的差异也使得一些深度人脸识别结果不完全具有可重复性。

第二个属性是网络架构和设置。高容量深度卷积网络,如Resnet和Inception-ResNet可以获得比VGG和Inception V1更好的表现。不同的深度人脸识别应用在速度和精度之间的均衡是不同的。对于移动设备上的人脸验证,实时的运行速度和紧凑的模型尺寸至关重要,对于十亿级别的安防系统,高精度和效率同等重要。

第三个属性是损失函数的设计。

  1. 基于欧式间隔的损失。一个Softmax分类层在一组已知的ID上训练,然后从网络的中间层提取特征向量,并用于在训练集ID之外的泛化识别。中心损失,范围损失,间隔损失等通过增加额外的惩罚来压缩类内差距或增加类间差距来提高识别率,但都是结合Softmax来训练识别模型。然而,当身份数量增加到百万级别时,基于分类的方法在分类层上 承受这巨大的GPU内存小号,并且需要为每个身份提供平衡和充足的训练数据。对比损失和三元组损失使用了成对训练策略。对比损失函数由正对和负对组成。损失函数的梯度拉拢正对,推开负对。三元组损失最小化锚与正样本之间的距离,最大化锚与来自不同身份的负样本之间的距离。然而,由于选择有效的训练样本,对比损失和三元组损失的训练过程非常困难。

  2. 基于角度和余弦间隔的损失。L-Softmax损失通过为每个身份添加乘性角度约束来提高特征区分度。SphereFace c o s ( m θ ) cos(m\theta) cos(mθ) 将L-Softmax应用于权值归一化的深度人脸识别。由于余弦函数的非单调性,在SphereFace中应用分段函数来保证单调性。在SphereFace的训练过程中,结合了Softmax损失,以方便和保证收敛。为了克服SphereFace的优化难度,加性余间隔际 c o s ( θ ) − m cos(\theta)-m cos(θ)m 将角间隔际移入余弦空间。加性余间隔际的实现和优化比SphereFace容易很多。与基于欧间隔际的损失相比,基于角和余间隔际的损失显式地增加了对超球面体流形的判别性约束,这与人脸位于流形上的先验是内在匹配的。

众所周知,数据、网络和损失这3个属性对人脸识别模型的性能有着从高到低的影响。

2 创新点

在本文中,作者从上述的三个属性为提高深度人脸识别做出贡献。

  1. 作者以自动和手动两种方式精细了训练数据和测试数据。

  2. 本文提出的网络结构在年龄和姿态的巨大变化下仍然具有鲁棒性。并探索了速度和精度之间的权衡

  3. 作者提出了一种新的损失函数,加性角度间隔(ArcFace),用于学习高判别性的特征,以实现鲁棒的人脸识别。

3 方法

在这里插入图片描述
如图1所示,所提出的损失函数 c o s ( θ + m ) cos(\theta+m) cos(θ+m) 直接基于L2归一化权重和特征在角度(弧度)空间中最大化决策边界。

4 模块

4.1 Softmax

应用最广泛的分类损失函数Softmax loss如下:
在这里插入图片描述

其中 x i ∈ R d x_i∈R^d xiRd 表示第 i i i 个样本的深层特征,属于第 y i y_i yi 类。本文将特征维数 d d d 设置为512。 W j ∈ R d W_j∈R^d WjRd 表示最后一个全连接层中权重 W ∈ R d × n W∈R^{d×n} WRd×n 的第 j j j 列, b b b 为偏差项。批次大小和类别数分别为 m m m n n n。传统的Softmax损失被应用于深度人脸识别。然而,Softmax损失函数没有显式地优化特征,使其对正样本对具有较高的相似度得分,对负样本对具有较低的相似度得分,从而导致性能较差。

4.2 权重归一化

为了简单起见,通常将固定偏差 b j = 0 b_j=0 bj=0 。然而,对目标logit做出如下变换:
在这里插入图片描述

然后,通过L2标准化来固定 ∣ ∣ W j = 1 ∣ ∣ ||W_j=1|| ∣∣Wj=1∣∣ ,这使得预测结果只依赖特征向量和权重之间的夹角。
在这里插入图片描述

在SphereFace的实验中,L2权重归一化对性能的提升不大。

4.3 乘性角度间隔

在SphereFace中,角度间隔 m m m 是通过角度上的乘法引入的:
在这里插入图片描述

其中 θ y i ∈ [ 0 , π / m ] \theta_{y_i}∈[0,\pi/m] θyi[0,π/m]。为了消除这个限制,用分段单调函数 ψ ( θ y i ) \psi(\theta_{y_i}) ψ(θyi) 代替 c o s ( m θ y i ) cos(m\theta_{y_i}) cos(mθyi), ShereFace的表达式为:

其中 ψ ( θ y i ) = ( − 1 ) k c o s ( m θ y i ) − 2 k , θ y i ∈ [ k π m , ( k + 1 ) π m ] , k ∈ [ 0 , m − 1 ] , m ≥ 1 \psi(\theta_{y_i})=(-1)^kcos(m\theta_{y_i})-2k,\theta_{y_i}∈[\frac{k\pi}{m},\frac{(k+1)\pi}{m}],k∈[0,m-1],m≥1 ψ(θyi)=(1)kcos(mθyi)2k,θyi[m,m(k+1)π],k[0,m1],m1 是控制角间隔际大小的整数。然而,SphereFace的实现过程中,为了保证训练的收敛性,引入了Softmax损失监督,权重由一个动态的超参数 λ \lambda λ 控制。加上额外的Softmax损失后, ψ ( θ y i ) \psi(\theta_{y_i}) ψ(θyi)
实际上为:
在这里插入图片描述

其中 λ \lambda λ 是一个额外的超参数,开始设置为1000,随着训练过程减小到5,以便每个类的角度空间更加紧凑。这种额外的动态超参数 λ \lambda λ 使得训练变得相对棘手。

这里的符号有点乱。 Σ \Sigma Σ 处的 m m m 前文指出是batch size。 c o s cos cos 处的 m m m 是角间隔际。

SphereFace使用角度间隔,使得同类样本的角度更小,不同类样本的角度更大。对于同类样本,当 m > 1 m>1 m>1 c o s ⁡ ( m θ y i ) cos⁡(mθ_{yi}) cos(mθyi) 相比于 c o s ( θ y i ) cos(θ_{yi}) cos(θyi) 更小,从而产生更大的损失迫使 θ y i θ_{yi} θyi 变小来增加同类特征相似度。在超球面上,角度间隔 m m m 相当于在决策边界上增加了一个额外的裕量,使得分类边界更加严格。
在这里插入图片描述

4.4 特征归一化

特征归一化被广泛应用于人脸验证,特征和权重归一化背后的直观解释是去除径向变化,并推动每个特征分布在超球流形上。作者通过L2归一化和缩放 ∣ ∣ x i ∣ ∣ ||x_i|| ∣∣xi∣∣ s s s 来固定 ∣ ∣ x i ∣ ∣ ||x_i|| ∣∣xi∣∣,其中 s s s 是超球半径。本文采用 s = 64 s=64 s=64 进行人脸识别实验。基于特征和权重归一化,我们可以得到 W j T x i = c o s θ j W_j^Tx_i=cos\theta_j WjTxi=cosθj

如果将特征归一化应用到SphereFace中,我们可以得到归一化的SphereFace,记为SphereFace-FNorm:
在这里插入图片描述

直接归一化后,梯度可能过小,导致训练速度变慢甚至停滞,引入缩放系数 s s s 可以增大梯度,保证训练稳定性。

4.5 加性余弦间隔

在加性余弦间隔中,角度间隔被移到 c o s θ cos \theta cosθ 的外侧。因此他们提出角度间隔损失:
在这里插入图片描述

余弦间隔 m m m 设置为0.35。相比与SphereFace,加性余弦间隔(Cosine-Face)有三个优点:

  1. 非常容易实现,无需复杂的超参

  2. 在没有Softmax监督的情况下,更加清晰,能够收敛

  3. 性能提升明显

c o s θ y i cos\theta_{y_i} cosθyi 需要大于 m m m 才能保证相似度为正,从而拉近了同类别特征。

4.6 加性角度间隔

虽然加性余弦间隔具有余弦空间到角度空间的一一对应关系,但这两种间隔之间仍然存在差异。事实上,与余弦间隔相比,角度间隔具有更明确的几何意义,角度空间中的间隔对应于超球面流形上的弧距离。

本文在 c o s θ cos \theta cosθ 内增加了一个间隔 m m m。当 θ ∈ [ 0 , π − m ] \theta∈[0,\pi-m] θ[0,πm] 时, c o s ( θ + m ) < c o s ( θ ) cos(\theta+m)<cos(\theta) cos(θ+m)<cos(θ) ,因此改约束对分类更加严格,提出的ArcFace定义为:
在这里插入图片描述

如果将提出的加性角度间隔 c o s ( m + θ ) cos(m+\theta) cos(m+θ) 展开,则 c o s ( θ + m ) = c o s θ c o s m − s i n θ s i n m cos(\theta+m)=cos\theta cosm-sin\theta sinm cos(θ+m)=cosθcosmsinθsinm,与加性余弦间隔 c o s ( θ ) − m cos(\theta)-m cos(θ)m 相比,本文提出的 ArcFace 类似,但由于 s i n θ sin \theta sinθ 的缘故,间隔是动态的。

在图2中,作者对所提出的ArcFace进行了说明。ArcFace不仅可以压缩特征区域,还可以对应超球面上的测地距离。
在这里插入图片描述

4.7 二值化情况下的比较

为了更好的理解从Softmax到ArcFace的过程,作者在表1和图3中给出了二分类情况下的决策边界。基于权重和特征归一化,这些方法之间的区别在于把间隔放在了哪里。
在这里插入图片描述

4.8 目标Logit分析

为了研究为什么SphereFace,CosineFace和ArcFace可以提高人脸识别性能,作者分析了训练过程中的目标 logit 曲线和 θ \theta θ 分布。

如图4(a)中,作者绘制了Softmax,SphereFace,CosineFace和ArcFace的logit曲线。对于SphereFace,最佳设置为 m = 4 , λ = 5 m=4,\lambda=5 m=4,λ=5,与 m = 1.5 , λ = 0 m=1.5,\lambda=0 m=1.5,λ=0 的曲线类似。然而,SphereFace的实现要求 m m m 为整数。当尝试最小乘法间隔, m = 2 m = 2 m=2 λ = 0 λ = 0 λ=0 时,训练不能收敛。因此,从Softmax中略微减小目标logit曲线,可以增加训练难度,提高性能,但减小过多会导致训练发散。

CosineFace和ArcFace都遵循了这一观点。从图4(a)中可以看出,CosineFace沿着 y y y 轴的负方向移动目标logit曲线,而ArcFace沿着 x x x 轴的负方向移动目标logit曲线。现在我们可以很容易的理解从Softmax到CosineFace和ArcFace的性能提升。

这里的移动是相较于softmax的目标logits曲线来看的。

对于边界 m = 0.5 m = 0.5 m=0.5 的ArcFace,当 θ ∈ [ 0 、 180 ° ] θ∈[ 0、180 °] θ[0180°] 时,目标logit曲线不是单调递减的。事实上,当 θ > 151.35 ° θ > 151.35 ° θ>151.35° 时,目标logit曲线上升。然而,如图4 ( c )所示,当从随机初始网络开始时, θ θ θ 具有高斯分布,其中心位于 90 ° 90 ° 90°,最大角度低于 105 ° 105 ° 105°。ArcFace的增加间隔在训练过程中几乎从未达到。因此,不需要对此进行明确的处理。

这里是在 θ ∈ [ π − m , π ] \theta∈[\pi-m,\pi] θ[πm,π] 的情况。

在图4 ( c )中展示了CosineFace和ArcFace在训练开始、中间和结束三个阶段的 θ θ θ 分布。分布中心由 90 ° 90 ° 90° 逐渐向 35 ° − 40 ° 35°-40° 35°40° 移动。在图4 ( a )中,可以发现ArcFace的目标logit曲线在 30 ° − 90 ° 30° - 90° 30°90° 之间低于CosineFace的目标logit曲线。因此,所提出的ArcFace在该区间内比CosineFace施加了更严格的边距惩罚。

在图4 ( b )中展示了Softmax,CosineFace和ArcFace在训练批次上估计的目标logit收敛曲线。我们还可以发现,在开始时,ArcFace的边距惩罚比CosineFace重,因为红色的点线比蓝色的点线更低。在训练结束时,ArcFace比CosineFace收敛得更好,因为 θ θ θ 的直方图在左边(图4(c )),目标logit收敛曲线更高(图4(b))。从图4 (c )中,我们可以发现在训练结束时,几乎所有的 θ θ θ 都小于 60 ° 60 ° 60°

该域之外的样本是最难的样本,也是训练数据集的噪声样本。即使CosineFace在 θ < 30 ° θ < 30° θ<30°时施加了更严格的边界惩罚(图4(a)),在训练结束时也只有很少部分 θ \theta θ 达到了这个域图4 ( c ) )。因此,我们也可以理解为何SphereFace在这一部分中即使有比较小的余量也能获得非常好的性能。

总之,当 θ ∈ [ 60 ° 、 90 ° ] θ∈[ 60°、90°] θ[60°90°] 时,添加过多的间隔惩罚可能会导致训练发散,例如. Sphere Face ( m = 2 , λ = 0 m = 2 , λ = 0 m=2,λ=0 )。当 θ ∈ [ 30 ° , 60 ° ] θ∈[ 30 ° , 60 °] θ[30°,60°] 时增加间隔可以潜在地提高性能,因为这一部分对应于最有效的半难的负样本。当 θ < 30 ° θ < 30 ° θ<30° 时,增加间隔并不能明显改善性能,因为这段时间对应的是最简单的样本。当我们回到图4(a)并对 [ 30 ° , 60 ° ] [ 30 ° , 60 °] [30°,60°] 之间的曲线进行排序时,我们可以理解为什么在它们的最佳参数设置下,性能可以从Softmax,SphereFace,CosineFace到ArcFace提高。注意,这里的 30 ° 30 ° 30° 60 ° 60 ° 60° 分别为容易和困难训练样本的粗略估计阈值。

在这里插入图片描述

5 效果

5.1 消融实验

当使用conv3 × 3和step = 1作为第一个卷积层时,网络输出为7 × 7。相比之下,如果使用conv7 × 7和step = 2作为第一个卷积层,网络输出仅为3 × 3。从表2中可以明显看出,在训练过程中选择较大的特征图可以获得更高的验证精度,对应SE-LResNet50E。
在这里插入图片描述

网络结构设置实验,多种设置如下:

  • Option-A:使用全局池化层( GP )

  • Option-B:在GP后使用一个全连接( FC )层

  • Option-C:在GP后使用FC -批标准化( BN )

  • Option-D:在GP后使用FC - BN -参数化校正线性单元( PReLu)

  • Option-E:在最后一个卷积层后使用BN - Dropout - FC - BN
    在这里插入图片描述

权重衰减值实验效果。
在这里插入图片描述

角度间隔 m m m 的消融实验。
在这里插入图片描述

不同的损失的效果对比。
在这里插入图片描述

不同backbone的消融实验。
在这里插入图片描述

5.2 和SOTA方法对比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过使用Triplet Loss微调后的效果。
在这里插入图片描述

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

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

相关文章

代码随想录算法训练营 | 图论 | DFS

98. 所有可达路径// DFS #include <bits/stdc.h> using namespace std;vector<vector<int>> result; vector<int> path;void dfs(const vector<list<int>> &graph, int i, int target) {if (i target) {result.push_back(path);retu…

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks KDD22 推荐指数&#xff1a;#paper/⭐⭐#​ 动机 本文探讨了图神经网络&#xff08;GNN&#xff09;在迁移学习中“预训练-微调”框架的局限性及改进方向。现有方法通过预训练&#xff08…

迷你世界脚本方块接口:Block

方块接口&#xff1a;Block 彼得兔 更新时间: 2024-08-27 11:04:56 具体函数名及描述如下&#xff1a; 序号 函数名 函数描述 1 isSolidBlock(...) 是否是固体方块 2 isLiquidBlock(...) 是否是液体方块 3 isAirBlock(...) 是否是气体方块 4 getBl…

Windows下git疑难:有文件无法被跟踪

Windows下git疑难&#xff1a;有文件无法被跟踪 最近在写一个c# WinFrom程序&#xff0c; 奇怪的是&#xff0c;frmMain.cs这个文件一直无法被跟踪 研究了很久&#xff0c; 参考这一篇 https://blog.csdn.net/m0_37315653/article/details/83064810 git rm --cached ./ -r 之…

Live2d官方项目运行

Live2d官方项目运行 1-参考网址 教程网址&#xff1a;https://blog.csdn.net/qq_39123467/article/details/131735085live2d官方地址&#xff1a;https://live2d.com/cubism-sdk/download/ 2-上手实践 1&#xff09;先打开官方项目-全部路径打开2&#xff09;cd /CubismSdkFo…

BUU43 [BJDCTF2020]The mystery of ip 1

前置知识&#xff1a; X - Forwarded - For注入 X - Forwarded - For&#xff08;XFF&#xff09;是一个 HTTP 头字段&#xff0c;用于记录客户端的真实 IP 地址。当客户端请求经过代理服务器时&#xff0c;代理服务器会将客户端的 IP 地址添加到 X - Forwarded - For 头中。…

张岳教授:语言模型推理与泛化研究 | ICLR 2025 特邀报告与团队专场

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; AITIME 01 ICLR 2025预讲会特邀报告 AITIME 02 ICLR 2025预讲会西湖大学张岳老师实验室专场 01 AI生成文本的自动化检测 Glimpse: Enabling White-Box Methods to Use Proprietary Models for Zero-Shot LLM-Ge…

MySQL SQL 优化专题

MySQL SQL 优化专题 1. 插入数据优化 -- 普通插入&#xff08;不推荐&#xff09; INSERT INTO tb_user VALUES(1,tom); INSERT INTO tb_user VALUES(2,cat); INSERT INTO tb_user VALUES(3,jerry);-- 优化方案1&#xff1a;批量插入&#xff08;推荐&#xff0c;不建议超过1…

【AI深度学习基础】NumPy完全指南进阶篇:核心功能与工程实践(含完整代码)

NumPy系列文章 入门篇进阶篇终极篇 一、引言 在掌握NumPy基础操作后&#xff0c;开发者常面临真实工程场景中的三大挑战&#xff1a;如何优雅地处理高维数据交互&#xff1f;如何在大规模计算中实现内存与性能的平衡&#xff1f;怎样与深度学习框架实现高效协同&#xff1f;…

Python学习第十八天之深度学习之Tensorboard

Tensorboard 1.TensorBoard详解2.安装3.使用4.图像数据格式的一些理解 后续会陆续在词博客上更新Tensorboard相关知识 1.TensorBoard详解 TensorBoard是一个可视化的模块&#xff0c;该模块功能强大&#xff0c;可用于深度学习网络模型训练查看模型结构和训练效果&#xff08;…

【GraphQL API 漏洞简介】

GraphQL API 漏洞简介 一、漏洞原理与分类二、漏洞检测方法三、典型利用方式四、工具推荐防御建议 GraphQL API 因其灵活性和高效性被广泛应用&#xff0c;但也因设计和实现缺陷存在多种安全风险。以下从漏洞原理、检测方法及利用方式三个维度进行详细分析&#xff1a; 一、漏洞…

Windows逆向工程入门之MASM数据结构使用

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 第一章&#xff1a;MASM数据定义体系精要 1.1 基础数据类型全景 1.1.1 整型数据规范 1.1.2 浮点数据编码 1.2 复合数据结构 1.2.1 多维数组定义 1.2.2 复杂结构体 第二章&#xf…

筑牢安全防线:工商业场所燃气泄漏防护新方案

燃气安全是企业经营不可逾越的生命线。在餐饮后厨、化工车间、酒店锅炉房等场所&#xff0c;可燃气体一旦泄漏&#xff0c;极易引发严重事故。如何实现精准监测、快速响应&#xff0c;成为工业及商业领域安全管理的核心诉求。旭华智能深耕安全监测领域&#xff0c;推出的工业及…

本地部署大数据集群前置准备

1. 设置VMware网段 虚拟网络编辑器——更改设置——选择VMnet8——子网改成192.168.88.0——NAT设置——网关设置为192.168.88.2 2. 下载CentOS操作系统 下载CentOS 7.6(1810)版本 3. 在VMware中安装CentOS操作系统 创建新的虚拟机——典型——安装光盘映像文件——输入账…

【蓝桥杯单片机】第十二届省赛

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…

PyCharm接入本地部署DeepSeek 实现AI编程!【支持windows与linux】

今天尝试在pycharm上接入了本地部署的deepseek&#xff0c;实现了AI编程&#xff0c;体验还是很棒的。下面详细叙述整个安装过程。 本次搭建的框架组合是 DeepSeek-r1:1.5b/7b Pycharm专业版或者社区版 Proxy AI&#xff08;CodeGPT&#xff09; 首先了解不同版本的deepsee…

CSS 系列之:grid 布局

基本概念 <template><div class"parent"><div class"box">p1-1</div><div class"box">p1-2</div><div class"box">p1-3</div></div><div class"parent"><…

数学软件Matlab下载|支持Win+Mac网盘资源分享

如大家所了解的&#xff0c;Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛&#xff0c;常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 Matlab将数值分析、矩阵计算、科学…

水仙花数(华为OD)

题目描述 所谓水仙花数&#xff0c;是指一个n位的正整数&#xff0c;其各位数字的n次方和等于该数本身。 例如153是水仙花数&#xff0c;153是一个3位数&#xff0c;并且153 13 53 33。 输入描述 第一行输入一个整数n&#xff0c;表示一个n位的正整数。n在3到7之间&#x…

物联网同RFID功能形态 使用场景的替代品

在物联网&#xff08;IoT&#xff09;和自动识别技术领域&#xff0c;除了RFID标签外&#xff0c;还有一些其他技术产品可以在形态和大小上与RFID标签相似&#xff0c;同时提供类似或更强大的功能。以下是几种能够替代RFID标签的产品&#xff1a; 一、NFC标签 NFC&#xff08;…