论文阅读笔记:UniFace: Unified Cross-Entropy Loss for Deep Face Recognition

论文阅读笔记:UniFace: Unified Cross-Entropy Loss for Deep Face Recognition

  • 1 背景
  • 2 创新点
  • 3 方法
    • 3.1 回顾softmax损失
    • 3.2 统一交叉熵损失
    • 3.3 人脸验证中的UCE损失
    • 3.4 进一步的优化
      • 3.4.1 边际UCE损失
      • 3.4.2 平衡BCE损失
  • 4 实验
    • 4.1 消融实验
    • 4.2 和SOTA方法对比

论文:UniFace_ICCV_2023_paper.pdf

代码:https://github.com/cvi-szu/uniface

1 背景

一个通用的人脸识别系统包含3个核心步骤:人脸检测、人脸特征提取和识别(包括一对一验证和一对其余识别)。因此,判别性的人脸特征学习对于人脸识别系统至关重要。具体来说,一个主体的面部特征应该接近属于同一身份的特征,而远离其他身份的特征,即来自正对的最小特征相似度理想情况下应该大于一个阈值 t t t ,来自负对的最大特征相似度应该小于这个阈值t。

基于深度学习的人脸识别方法根据其学习目标可以分为两类:

  • 样本到样本的距离

  • 样本到类的相似性

基于样本间距离的方法将人脸图像映射到一个高度紧凑的欧式特征空间,其中距离被用来度量人脸特征的相似性。然而,这类方法的训练是困难的,因为需要复杂的采样策略来构建有效的负对和正对/元组。

基于样本间相似度的方法通常采用softmax损失作为学习目标,将人脸识别作为多类别分类问题来处理。一些工作提出将softmax损失与额外精心设计的损失相结合,以增加类内相似性或降低类间相似性。这些方法引入了额外的超参数,需要对超参数进行精细的调整。其他工作(如L-softmax损失,SphereFace,AMsoftmax,CosFace 和 ArcFace等)通过引入类间边距对原始的softmax损失进行扩展,以减少类内距离,增大类间距离。然而,Softmax损失只是鼓励单个训练样本与其对应的正类代理之间的最大角度相似度,并没有考虑该正类代理与其他样本之间的相似性。换句话说,在softmax和边际softmax损失下,很难选择一个统一的阈值 t t t 来分离负样本对和正样本对,如图1所示。
在这里插入图片描述

为了解决这个问题,本文提出了一个统一交叉熵损失UCE,他明确的鼓励所有正样本到类的相似度都大于一个阈值 t = c o s θ t t=cos\theta t t=cosθt,而所有负样本到类的距离都小于这个阈值。作者进一步改进了UCE损失:

  • 引入了强制边际

  • 提出了两种可供选择的方式来平衡大量人脸身份的训练

作者将使用UCE损失训练的人脸检测模型命名为UniFace。

2 创新点

  • 在研究了softmax损失之后,作者发现它学习到的最小正样本到类的相似度实际上并不能保证大于它的最大负样本到类的相似度。为了解决这个问题,我们通过假设一个固定的阈值t来约束正负样本对的相似性,从而设计了UCE损失。

  • 本文是第一个将统一的 t t t 作为一个自动可学习的参数纳入深度人脸识别框架的工作。UCE损失鼓励所有正样本到类的相似度都大于负样本到类的相似度,这与实际人脸识别应用的期望非常匹配。

  • UCE损失单独使用效果很好,可以直接替代现有深度人脸识别模型(表1和表2)中的softmax损失。此外,作者还提出了UCE的两个扩展,即边际UCE和平衡UCE损失,以结合边际和平衡策略来提高UCE损失的性能。值得注意的是,边际UCE损失比softmax损失对超参数更加稳健(图3 ( a ) )。

3 方法

3.1 回顾softmax损失

假设 M M M 是在由 N N N 个主体组成的面部样本集 D D D 上训练的深度人脸模型,
在这里插入图片描述

其中, D i D_i Di 表示包含同一主体 i i i 的面部图像子集。对于任意样本 X ∈ D X∈D XD,令:
在这里插入图片描述

表示 X X X 的特征,其中 M M M 为特征向量的长度。然后,我们可以得到一个特征集合 F F F,
在这里插入图片描述

在使用softmax损失训练的人脸模型中,采用全连接(FC)分类器,权重矩阵 W W W 和偏置 b b b,根据 X X X 的特征 x x x 进行分类,其中:
在这里插入图片描述

在式(4)中, W i ∈ R M × 1 W_i∈R^{M×1} WiRM×1 是主体 i i i 的类别代理。

为了方便,分别归一化 W W W 并省略 B B B
在这里插入图片描述

对于所有的 x ∈ F x∈F xF,将特征归一化为 ∣ ∣ x ∣ ∣ = s ||x||=s ∣∣x∣∣=s

随机抽取 N N N 个样本 { X ( i ) } i = 1 N ⊂ D \{X^{(i)}\}_{i=1}^N⊂D {X(i)}i=1ND,其中 ∀ i , X ( i ) ∈ D i ∀i,X^{(i)}∈D_i i,X(i)Di。那么,对于给定的样本 X ( i ) X^{(i)} X(i),典型的多类softmax损失为:
在这里插入图片描述

其中,
在这里插入图片描述

< x ( i ) , W j > <x^{(i)},W_j> <x(i),Wj> 为两个向量的内积。

我们称 c o s θ x , w ( i i ) = 1 s W i T x ( i ) cos \theta_{x,w}^{(ii)} = \frac{1}{s}W_i^Tx^{(i)} cosθx,w(ii)=s1WiTx(i) 为正样本类间相似度, c o s θ x , w ( i j ) = 1 s W j T x ( i ) cos \theta_{x,w}^{(ij)} = \frac{1}{s}W_j^Tx^{(i)} cosθx,w(ij)=s1WjTx(i) 为负样本类间相似度,从而得到样本类间相似度矩阵 S s a m − c l a S_{sam-cla} Ssamcla
在这里插入图片描述

为了正确分类 X ( i ) X(i) X(i),softmax损失鼓励比负样本到类的相似性 ( c o s θ x , w ( i j ) ) (cos \theta_{x,w}^{(ij)}) (cosθx,w(ij)) 更大的正样本到类的相似性 ( c o s θ x , w ( i i ) ) (cos \theta_{x,w}^{(ii)}) (cosθx,w(ii)) ,即
在这里插入图片描述

那么,存在 t i t_i ti 使得:
在这里插入图片描述

然而,softmax损失没有考虑 c o s θ x , w ( j i ) cos \theta_{x,w}^{(ji)} cosθx,w(ji) c o s θ x , w ( i i ) cos \theta_{x,w}^{(ii)} cosθx,w(ii) 之间的关系。也就是说,可能存在一个负样本对 ( x ( j ) , W i ) (x^{(j)},W_i) (x(j),Wi) ,其相似度甚至大于正样本对 ( x ( i ) , W i ) (x^{(i)},W_i) (x(i),Wi),即可能存在一个样本 X ( j ) ∈ D j , j ≠ i X^{(j)}∈D_j,j≠i X(j)Dj,j=i,,其特征 x ( j ) x^{(j)} x(j) 满足:
在这里插入图片描述

我们预期来自正对的相似度大于某个阈值 t t t,来自负对的相似度小于 t t t。虽然在式(13)和(14)中,人脸图像 X ( i ) X^{(i)} X(i) X ( j ) X^{(j)} X(j) 都被正确地归类到正确地主体中。我们注意到,与我们的预期相反,正样本对 ( x ( i ) , W i ) (x^{(i)},W_i) (x(i),Wi) 比负样本对 ( x ( j ) , W i ) (x^{(j)},W_i) (x(j),Wi) 具有更小的相似度。由于 t i < t j t_i < t_j ti<tj,可以很容易地得出结论,没有统一的相似度阈值 t = t i = t j t = t_i = t_j t=ti=tj 可以同时正确地将正样本对 ( x ( i ) , W i ) (x^{(i)},W_i) (x(i),Wi) ( x ( j ) , W i ) (x^{(j)},W_i) (x(j),Wi) 与负样本对 ( x ( j ) , W i ) (x^{(j)},W_i) (x(j),Wi) 分开。

因此用式(11)中的样本到类的相似度矩阵 S s a m − c l a S_{sam-cla} Ssamcla 来选择阈值是困难的,即softmax是鼓励对角元素 c o s θ x , w ( i i ) cos \theta_{x,w}^{(ii)} cosθx,w(ii) 在第 i i i 行占优,以实现样本 X ( i ) X^{(i)} X(i) 的良好分类,而忽略了鼓励 c o s θ x , w ( i i ) cos \theta_{x,w}^{(ii)} cosθx,w(ii) 在第 i i i 列占优,然而这在人脸识别中也很重要。

3.2 统一交叉熵损失

为了避免式(14)中的问题,并鼓励一个相似矩阵 S s a m − c l a S_{sam-cla} Ssamcla 的行和列都是对角占优的。作者期望一个统一的阈值 t t t,使得:
在这里插入图片描述
如果我们将特征与其正类代理之间的最大夹角定义为 θ p o s \theta_{pos} θpos,将特征与其负类代理之间的最小夹角定义为 θ n e g \theta_{neg} θneg,即:
在这里插入图片描述
在这里插入图片描述
那么,当且仅当 θ p o s ≤ θ n e g \theta_{pos}≤\theta_{neg} θposθneg,且统一阈值 t = c o s θ t t=cos\theta_t t=cosθt,存在一个阈值 t t t 使得任意样本都满足式(15),对任意 θ t \theta_t θt 有效,其中:
在这里插入图片描述

即图1中所有行中所有的“×”都要在所有的“o”左边。

如3.1中所述,softmax损失没有考虑统一阈值 t t t 的约束。作者首次将统一阈值 t t t 作为一个可自动学习的参数加入到损失函数中。提出的统一交叉熵UCE损失前提是存在一个统一阈值 t = c o s θ t t=cos\theta_t t=cosθt(即 θ p o s ≤ θ n e g \theta_{pos}≤\theta_{neg} θposθneg)。从式(8)中的softmax开始推导:
在这里插入图片描述

根据式(16)-(18),可得:
在这里插入图片描述

不等式的详细推导见附录。

附录证明过程:
在这里插入图片描述
在这里插入图片描述

定义UCE损失 L u c e ( X ( i ) ) L_{uce}(X^{(i)}) Luce(X(i)) 为:
在这里插入图片描述
其中 b ˜ = s c o s θ t + l o g ( N − 1 ) \~b=scos\theta_t+log(N-1) b˜=scosθt+log(N1) 是一个待学习的常数。

式(23)中第一项中的 e − s c o s θ x , w ( i i ) + b ˜ = e − s ( c o s θ x , w ( i i ) − c o s θ t − l o g ( N − 1 ) s ) e^{-scos\theta _{x,w}^{(ii)}+\~b}=e^{-s(cos\theta_{x,w}^{(ii)}-cos\theta_t-\frac{log(N-1)}{s})} escosθx,w(ii)+b˜=es(cosθx,w(ii)cosθtslog(N1)) ,第二项中的 e s c o s θ x , w ( i j ) + b ˜ = e s ( c o s θ x , w ( i j ) − c o s θ t − l o g ( N − 1 ) s ) e^{scos\theta _{x,w}^{(ij)}+\~b}=e^{s(cos\theta_{x,w}^{(ij)}-cos\theta_t-\frac{log(N-1)}{s})} escosθx,w(ij)+b˜=es(cosθx,w(ij)cosθtslog(N1)),缩放因子 s > 0 s>0 s>0,当模型训练收敛时,则会出现 c o s θ x , w ( i i ) − c o s θ t − l o g ( N − 1 ) s > 0 cos\theta_{x,w}^{(ii)}-cos\theta_t-\frac{log(N-1)}{s}>0 cosθx,w(ii)cosθtslog(N1)>0 , c o s θ x , w ( i j ) − c o s θ t − l o g ( N − 1 ) s < 0 cos\theta_{x,w}^{(ij)}-cos\theta_t-\frac{log(N-1)}{s}<0 cosθx,w(ij)cosθtslog(N1)<0,即 c o s θ x , w ( i j ) < c o s θ t + l o g ( N − 1 ) s < c o s θ x , w ( i i ) cos\theta_{x,w}^{(ij)}<cos\theta_t+\frac{log(N-1)}{s}<cos\theta_{x,w}^{(ii)} cosθx,w(ij)<cosθt+slog(N1)<cosθx,w(ii) ,其中 l o g ( N − 1 ) s \frac{log(N-1)}{s} slog(N1) 为常数可以忽略不计,所以训练目标满足式(15)。

UCE损失比softmax损失对正负样本到类特征之间的举例更有约束。当使用UCE损失代替softmax损失训练模型时,期望最终的样本特征更具有判别性。如图2所示,在提出的UCE损失划分的特征空间中, x ( 1 ) x^{(1)} x(1) W 1 W_1 W1 之间的相似性比原始的softmax损失训练增加,而 x ( 2 ) x^{(2)} x(2) W 1 W_1 W1 之间的相似性降低。
在这里插入图片描述

虽然UCE损失的最终公式(式(23))类似于二元交叉熵损失,但他们之间有几个关键区别。首先,UCE损失是从显式统一阈值 t t t 的目标设计的,用于约束正负样本对的相似性,而BCE损失及其变体没有这种显式约束。其次,从softmax损失中推导出UCE损失,并通过清晰的数学推导给出了统一阈值 t t t 与偏差 b ˜ = s c o s θ t + l o g ( N − 1 ) \~b=scos\theta_t+log(N-1) b˜=scosθt+log(N1) 的关系,然后通过图4(c)的定性说明来评估 t t t 是否符合人脸验证的预期。最后,作者在一个大型的benchmark上系统的比较了UCE损失和BCE损失,其中作者比较了:

  1. 一个为不同类别分配各自偏置的标准BCE损失

  2. 一个直接删除了任何偏置的修改BCE损失,这意味着偏置 b = 0 b=0 b=0

实验结论表明,UCE损失比BCE损失的两个朴素变体表现更佳,见表1。

3.3 人脸验证中的UCE损失

在真实人脸验证系统中,对于任意两个人脸图像样本, X ( i ) ∈ D i , X ( j ) ∈ D j X^{(i)}∈D_i,X^{(j)}∈D_j X(i)Di,X(j)Dj,通过比较它们的特征相似度 g ( X ( i ) , X ( j ) ) g(X^{(i)},X^{(j)}) g(X(i),X(j)) 与置信度阈值 t ∗ t^* t,选择一个统一的阈值来验证他们是否来自同一主体,这个过程隐含了一个损失 L v L_v Lv
在这里插入图片描述

其中 α \alpha α 是重加权参数。

那么在训练中,对于给定的 X ( i ) X^{(i)} X(i),它的损失为:
在这里插入图片描述

对于每一个样本,都会耗费大量的计算量,利用类代理 W i W_i Wi 代替了 F i F_i Fi 中的所有特征 x ( i ) x^{(i)} x(i),设计了一个合理的损失函数。对于所有的 i i i
在这里插入图片描述

式(27)中,损失采用函数 R e L U ( x ) = m a x ( 0 , x ) ReLU(x)=max(0,x) ReLU(x)=max(0,x) x = 0 x=0 x=0 处不可微,一个合理的替代可以是 softplus 函数:
在这里插入图片描述

β \beta β 趋于+∞时,softplus(x)趋于ReLU(x) 。

利用softplus函数,则 L v 3 ( X ( i ) ) L_{v3}(X^{(i)}) Lv3(X(i)) 可代换为:
在这里插入图片描述

当我们令 α = β = s \alpha=\beta=s α=β=s 时,
在这里插入图片描述

损失 L v 4 ( X ( i ) ) L_{v4}(X^{(i)}) Lv4(X(i)) 就是提出的UCE损失 L u c e ( X ( i ) ) L_{uce}(X^{(i)}) Luce(X(i)),满足 b ˜ ∗ = s t ∗ \~b^*=st^* b˜=st。因此,作者将UCE损失和人脸验证联系起来。

3.4 进一步的优化

3.4.1 边际UCE损失

先前的工作表明边际softmax损失比原始的性能更好。在这里通过增加一个余弦余量 m m m,将所提出的UCE损失扩展到边际UCE损失:
在这里插入图片描述

3.4.2 平衡BCE损失

L u c e L_{uce} Luce L u c e − m L_{uce-m} Lucem 只计算一个正样本对 ( x ( i ) , W i ) (x^{(i)},W_i) (x(i),Wi) 的相似度,但却有 N-1 个负样本对 ( x ( i ) , W j ) (x^{(i)},W_j) (x(i),Wj) ,这种不平衡会导致不理想的性能。本文引入两个参数来平衡正负样本对的数量:
在这里插入图片描述

其中 p j p_j pj 是负样本对 ( x ( i ) , W j ) (x^{(i)},W_j) (x(i),Wj) 从均匀分布中抽样得到的随机数, λ \lambda λ r r r 分别是所有负样本对的重加权和抽样参数。不同的 λ \lambda λ r r r 的影响如图3所示。
在这里插入图片描述

4 实验

4.1 消融实验

UCE损失中超参数的消融实验。
在这里插入图片描述

不同框架中使用UCE损失的提升。
在这里插入图片描述

normalized softmax损失,BCE损失和UCE损失的效果对比。
在这里插入图片描述

4.2 和SOTA方法对比

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

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

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

相关文章

DeepSeek崛起:如何在云端快速部署你的专属AI助手

在2025年春节的科技盛宴上&#xff0c;DeepSeek因其在AI领域的卓越表现成为焦点&#xff0c;其开源的推理模型DeepSeek-R1擅长处理多种复杂任务&#xff0c;支持多语言处理&#xff0c;并通过搜索引擎获取实时信息。DeepSeek因其先进的自然语言处理技术、广泛的知识库和高性价比…

LLM大型语言模型(一)

1. 什么是 LLM&#xff1f; LLM&#xff08;大型语言模型&#xff09;是一种神经网络&#xff0c;专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络&#xff0c;通常训练于海量文本数据上&#xff0c;有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …

石基大商:OceanBase + Flink CDC,搭建连锁零售系统数据湖

本文作者&#xff1a;白剑&#xff0c;石基大商连锁事业部架构组 石基大商连锁事业部专注于连锁零售软件&#xff0c;为企业提供ERP解决方案。石基在零售行业拥有众多知名品牌客户&#xff0c;如华润万家、永旺、永辉和联华等&#xff0c;并与很多地方性零售企业紧密合作。而对…

LeetCode 分割回文串(回溯、dp)

131.分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些 子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1a;[["a","a","b"],["a…

好数——前缀和思想(题目分享)

今天我的舍友去参加“传智杯”广东省的省赛&#xff0c;跟我说了这样一道题&#xff0c;他说他想不出来怎么去优化代码&#xff0c;怎么做都是套用两层for循环超时&#xff0c;下面我就根据题意&#xff0c;使用前缀和的算法去优化一下思路&#xff0c;题目本身是不难的&#x…

记录uniapp小程序对接腾讯IM即时通讯无ui集成(2)

完成以上步骤之后开始进行登录&#xff0c;登陆就需要账号。这个账号我们可以在腾讯云中创建。 有了账号之后开始去小程序进行登陆操作。腾讯云接口文档 这里除了帐号还需要一个校验值userSig正常项目开发这个字段可以在登陆后让后端返回&#xff0c;现在是测试我们直接去控制…

智能指针的使用和原理

目录 C标准库智能指针的使用 auto_ptr的了解 unique_ptr的了解 shared_ptr的了解 应用 析构问题 解决办法 方案一&#xff1a;特化 方案二&#xff1a;删除器 智能指针原理 shared_ptr循环引用问题 了解weak_ptr shared_ptr的线程安全问题 内存泄漏 如何避免内存…

【北上广深杭大厂AI算法面试题】深度学习篇...这里详细说明ResNet中为什么不用dropout?

【北上广深杭大厂AI算法面试题】深度学习篇…这里详细说明ResNet中为什么不用dropout? 【北上广深杭大厂AI算法面试题】深度学习篇…这里详细说明ResNet中为什么不用dropout? 文章目录 【北上广深杭大厂AI算法面试题】深度学习篇...这里详细说明ResNet中为什么不用dropout?…

stm32移植LCD2002驱动

介绍 LCD2002支持20X2个字符串显示&#xff0c;引脚功能和读写时序跟LCD1602都很像 LCD类型&#xff1a;字符点阵 点 阵 数&#xff1a;202 外形尺寸&#xff1a;116.0mm37.0mm&#xff08;长宽&#xff09; 视域尺寸&#xff1a;83.0mm18.6mm 点 距 离&#xff1a;0.05mm…

*动态规划(4)

持续更新 1.入门 ⽤于解决多阶段决策问题的算法思想。它通过将复杂问题分解为更⼩的⼦问题&#xff0c;并存储⼦问题的解&#xff08;通常称为“状态”&#xff09;&#xff0c;从⽽避免重复计算&#xff0c;提⾼效率。因此&#xff0c;动态规划⾥&#xff0c;蕴含着分治与剪枝…

计算机毕业设计SpringBoot+Vue.js社团管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

现今大语言模型性能(准确率)比较

现今大语言模型性能(准确率)比较 表头信息:表的标题为“大语言模型性能比较结果”(英文:Table 1: Large Language Model Performance Comparison Results),表明该表是用于对比不同大语言模型的性能。列信息: 模型:列出参与比较的不同大语言模型名称,包括LLAMA3(70B)…

合成复用原则

合成复用原则 也被称为组合复用原则或聚合复用原则。 合成复用原则提倡尽量使用组合或者聚合等关联关系来实现代码复用&#xff0c;而不是通过继承关系来复用代码。组合是一种强的 “拥有” 关系&#xff0c;体现了严格的部分和整体的关系&#xff0c;部分和整体的生命周期一…

Unity 对象池技术

介绍 是什么&#xff1f; 在开始时初始化若干对象&#xff0c;将它们存到对象池中。需要使用的时候从对象池中取出&#xff0c;使用完后重新放回对象池中。 优点 可以避免频繁创建和销毁对象带来性能消耗。 适用场景 如果需要对某种对象进行频繁创建和销毁时&#xff0c;例…

记一次ScopeSentry搭建

介绍 Scope Sentry是一款具有资产测绘、子域名枚举、信息泄露检测、漏洞扫描、目录扫描、子域名接管、爬虫、页面监控功能的工具&#xff0c;通过构建多个节点&#xff0c;自由选择节点运行扫描任务。当出现新漏洞时可以快速排查关注资产是否存在相关组件。 目前功能 插件系…

LeetCode热题100JS(20/100)第四天|​41. 缺失的第一个正数​|​73. 矩阵置零​|​54. 螺旋矩阵​|​48. 旋转图像​

41. 缺失的第一个正数 题目链接&#xff1a;41. 缺失的第一个正数 难度&#xff1a;困难 刷题状态&#xff1a;1刷 新知识&#xff1a; 解题过程 思考 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 [1,2] 中的数字都在数组中…

ComfyUI+Lumina小试牛刀

序 本文主要研究一下Lumina Image 2.0模型的中文提示词进行文生图。 步骤 安装ComfyUI git clone https://github.com/comfyanonymous/ComfyUI cd ComfyUI python3 -m pip install -r requirements.txt启动ComfyUI python3 -u main.py --listen --port6889 --disable-auto…

我的世界1.20.1forge模组开发进阶物品(7)——具有动画、3D立体效果的物品

基础的物品大家都会做了对吧?包括武器的释放技能,这次来点难度,让物品的贴图呈现动画效果和扔出后显示3D立体效果,这个3D立体效果需要先学习blockbench,学习如何制作贴图。 Blockbench Blockbench是一个用于创建和编辑三维模型的免费软件,特别适用于Minecraft模型的设计…

HarmonyOS NEXT开发进阶(十一):应用层架构介绍

文章目录 一、前言二、应用与应用程序包三、应用的多Module设计机制四、 Module类型五、Stage模型应用程序包结构六、拓展阅读 一、前言 在应用模型章节&#xff0c;可以看到主推的Stage模型中&#xff0c;多个应用组件共享同一个ArkTS引擎实例&#xff1b;应用组件之间可以方…

C++学习之C++初识、C++对C语言增强、对C语言扩展

一.C初识 1.C简介 2.第一个C程序 //#include <iostream> //iostream 相当于 C语言下的 stdio.h i - input 输入 o -output 输出 //using namespace std; //using 使用 namespace 命名空间 std 标准 &#xff0c;理解为打开一个房间&#xff0c;房间里有我们所需…