【开放词汇分割】Side Adapter Network for Open-Vocabulary Semantic Segmentation

论文链接:Side Adapter Network for Open-Vocabulary Semantic Segmentation

代码链接:https://github.com/MendelXu/SAN

作者:Mengde Xu,Zheng Zhang,Fangyun Wei,Han Hu,Xiang Bai

发表单位:华中科技大学、微软亚洲研究院

会议/期刊:CVPR2023 Highlight

一、研究背景

ImageNet 上的分割结果。对于每个图像,将其类别与 coco 类别结合起来作为推理过程中的词汇表,并且仅可视化注释类别的掩码

现代语义分割方法依赖于大量标注数据,但数据集通常只包含数十到数百个类别,数据收集和标注成本高昂。近年来,大规模视觉-语言模型(如CLIP)在图像分类任务中取得了巨大成功,但在像素级别的语义分割中应用这些模型面临挑战,因为这些模型的训练侧重于图像级别的对比学习,它学习到的表示缺乏语义分割所需的像素级识别能力。弥补表示粒度差距的一种解决方案是在分割数据集上微调模型。然而,分割数据集的数据量远小于视觉语言预训练数据集,因此微调模型在开放词汇识别上的能力常常受到损害。

将语义分割建模为区域识别问题绕过了上述困难。早期尝试采用两阶段训练框架。

在第一阶段,训练一个独立模型来生成一组蒙版图像作物作为蒙版建议。

在第二阶段,使用视觉语言预训练模型(例如 CLIP)来识别蒙版图像裁剪的类别。然而,由于掩模预测模型完全独立于视觉语言预训练模型,它错过了利用视觉语言预训练模型强大特征的机会,并且预测的掩模图像裁剪可能不适合识别,这会导致模型笨重、缓慢且性能低下。

SAN 概述

为了实现这一目标,提出了一个新的框架(上图所示),称为侧适配器网络 (side adapter network, SAN)。由于端到端训练,它的掩模预测和识别是 CLIP 感知的,并且由于利用了 CLIP 的特性,它可以是轻量级的。

红色虚线表示训练期间的梯度流。在框架中,冻结的 CLIP 模型仍然充当分类器,并且侧适配器网络生成掩码提案和注意偏差,以指导 CLIP 模型的更深层来预测提案明智的分类逻辑。在推理过程中,将 mask proposal 和proposal logits 结合起来,通过 Matmul(矩阵乘法函数)得到最终的预测。

二、整体框架

本文提出了一种新的开放词汇语义分割框架——Side Adapter Network (SAN)。该方法将语义分割任务建模为区域识别问题。SAN附加在冻结的CLIP模型上,具有两个分支:一个用于预测掩码提案,另一个用于预测应用在CLIP模型中的注意力偏差,以识别掩码的类别。整个网络可以端到端训练,使附加的侧网络能够适应冻结的CLIP模型,从而使预测的掩码提案对CLIP感知。

作者证明这种解耦设计提高了分割性能,因为用于 CLIP 识别掩模的区域可能与掩模区域本身不同。为了最大限度地降低 CLIP 的成本,进一步提出了单前向设计:将浅层 CLIP 块的特征融合到 SAN,并将其他更深的块与注意力偏差相结合以进行掩模识别。

因为用于 CLIP 识别掩模的区域可能与掩模区域本身不同的理解:CLIP模型主要是通过对比学习在图像级别进行训练的,其学习到的特征更偏向于全局或大范围的图像特征,而不是具体的像素级别特征。当CLIP模型应用于掩模识别时,它的注意力机制可能会关注到一些与掩模区域有重叠但并不完全一致的区域。这种不完全一致性是因为CLIP的注意力机制可能会将注意力分散到整个图像中一些相关的部分,而不仅仅是掩模的边界或内部区域。

假设有一张图像,其中有一只狗在草地上。CLIP模型可能会关注到整只狗以及周围的草地作为特征进行分类,而语义分割任务仅需要标注出狗的具体轮廓区域。这时,CLIP的识别区域(整只狗和部分草地)与实际需要的掩模区域(狗的轮廓)并不完全一致。

出于公平性和可重复性的目的,该研究基于官方发布的 CLIP 模型。重点关注已发布的 ViT CLIP 模型,因为视觉 Transformer 事实上已经取代 ConvNet 成为计算机视觉社区的主导骨干网,并且为了概念的一致性和简单性,侧适配器网络也由视觉 Transformer 实现。

准确的语义分割需要高分辨率图像,但已发布的ViT CLIP模型是针对低分辨率图像(例如224×224)设计的,直接应用于高分辨率图像,性能较差。为了缓解输入分辨率的冲突,在 CLIP 模型中使用低分辨率图像,在侧适配器网络中使用高分辨率图像。作者证明这种不对称输入分辨率非常有效。此外,还探索仅微调 ViT 模型的位置嵌入并注意改进。

三、核心方法 Side Adapter Network

3.1 架构介绍

Side Adapter Network (SAN) 是一个端到端的框架,旨在充分利用CLIP模型在开放词汇语义分割中的能力。SAN由一个轻量级的视觉Transformer实现,可以利用CLIP的特征,并且有两个输出:掩码提案和用于掩码识别的注意力偏差。这些注意力偏差应用于CLIP的自注意力机制,以识别掩码提案的类别。

在实践中,将浅层 CLIP 层的特征融合到 SAN 中,并将注意力偏差应用于更深的 CLIP 层以进行识别。通过这种单前向设计,可以最大限度地降低 CLIP 模型的成本。

SAN的详细架构

  • 输入图像:输入图像被分割成16×16的图像块,每个块通过线性嵌入层投射为视觉tokens。

  • 视觉tokens与查询tokens:这些视觉tokens与N个可学习的查询tokens连接在一起,并输入到随后的Transformer层中。

  • 输出:SAN有两个输出:掩码提案和用于掩码识别的注意力偏差。查询tokens和视觉tokens分别通过两个独立的3层MLP(多层感知器)投射为256维度的向量,用于生成掩码提案和注意力偏差。

投影查询标记可以表示为 \mathbf{Q}_{\mathrm{mask}}\in\mathbb{R}^{N\times256},其中N是查询标记的数量,默认等于100。投影视觉标记可以表示为\mathbf{V}_{\mathrm{mask}}\in\mathbb{R}^{\frac{H}{16}}\times\frac{W}{16}\times256 ,其中H和W是输入的高度和宽度图像。最后的预测mask由Q mask和V mask的内积生成:

\mathbf{M}=\mathbf{V}_\text{mask}\mathbf{Q}_\text{mask}^\mathrm{T}

其中,\mathbf{M}\in\mathbb{R}^{\frac{H}{16}}\times\frac{W}{16}\times N ,产生注意力偏差类似于掩模预测。查询标记和视觉标记也由 3 层 MLP 投影,表示为 \mathbf{Q}_{\mathrm{attn}}\in\mathbb{R}^{N\times256} , {V}_{\mathrm{attn}}\in\mathbb{R}^{\frac{H}{16}\times\frac{W}{16}\times K\times256},其中 K 是 ViT CLIP 的注意力头数量。通过内部生成Q attn和V attn,得到了注意力偏差:

\mathbf{B=V_{attn}Q_{attn}^{T}}

其中, \mathbf{B}\in\mathbb{R}^{\frac{H}{16}\times\frac{W}{16}\times K\times N},此外,如果需要,注意力偏差将进一步调整为 \mathbf{B}\in\mathbb{R}^{h\times w\times K\times N},其中h和w是 CLIP 中注意力图的高度和宽度。在实践中,Q mask和Q attn可以共享,并且注意力偏差将应用于CLIP的多个自注意力层中,即偏差用于不同的自注意力层中。

掩模预测和识别的解耦设计背后的动机很直观:用于在 CLIP 中识别掩模的感兴趣区域可能与掩模区域本身不同。

3.2 Feature fusion on visual tokens 视觉标记上的特征融合

在ViT模型中,视觉tokens和[CLS] token是主要的特征表示。为了充分利用CLIP模型的强大特征,SAN将CLIP模型的视觉tokens与SAN的视觉tokens进行特征融合。具体步骤如下:

  • 特征重排:由于CLIP和SAN的视觉tokens数量和特征维度可能不同,首先将CLIP的视觉tokens重新排列为特征图,经过1×1卷积和重尺寸操作来调整通道维度和特征图大小。

  • 特征融合:将调整后的CLIP特征图与SAN的对应特征图进行逐元素相加,从而实现特征融合。特征融合在多个层次上进行,例如在12层的ViT-B/16 CLIP模型和8层的SAN模型中,将CLIP的{stem,3,6,9}层的特征与SAN的{stem,1,2,3}层的特征融合。

3.3 Mask recognition with attention bias 带有注意偏差的掩模识别

原始的CLIP模型只能通过[CLS] token进行图像级的识别,为了在CLIP模型中实现精确的掩码识别,SAN引入了注意力偏差,这些偏差用于指导CLIP模型的[CLS] token在感兴趣区域进行识别。

在 CLIP 中使用注意偏差来预测掩模的图示

左图创建一组 [SLS] 令牌(即影子 [CLS] 令牌副本)并将其应用于 CLIP。这些[SLS]令牌在注意力偏差的影响下更新。 右图该图显示了不同类型的令牌如何相互作用。方块的颜色表示query token和key token之间的关系:黑色表示query没有被key更新,白色表示query可以正常被key更新,灰色表示在attention的作用下query可以被key更新偏见。

过程总结:

  • 生成[SLS] tokens:创建一组[CLS] token的影子副本([SLS] tokens),这些副本在更新时仅受视觉tokens的影响,而不会反过来影响视觉tokens或[CLS] tokens。

  • 添加注意力偏差:在计算注意力时,将预测的注意力偏差Bk添加到注意力矩阵中,从而引导[SLS] tokens的特征逐渐适应掩码预测。

  • 类别预测:通过比较[SLS] token与CLIP文本嵌入的类别名称之间的距离或相似度,轻松获得掩码的类别预测。

在计算注意力时,预测的注意力偏差 Bk 被添加到注意力矩阵中,从而引导[SLS] tokens的特征逐渐适应掩码预测。公式如下:

X_{[SLS]}^{l+1}=\text{softmax}(Q_{[SLS]}^lK_{\text{visual}}^l+B_k)V_{[SLS]}^l

其中,l 表示层数,k表示第 k个注意力头,Q[SLS]=Wq X[SLS]和 V[SLS]=Wv X[SLS] 是[SLS] tokens的查询和value嵌入,Kvisua l=Wk Xvisual 是视觉tokens的键嵌入,Wq,Wk,Wv 是查询、键、value嵌入层的权重。

在原始设计中,计算复杂度为:

\mathcal{O}((T_{\mathrm{visual}}+T_{[\mathrm{CLS}]}+T_{[\mathrm{SLS}]}))^2

Tvisual​ 是视觉tokens的数量,T[CLS] 是[CLS] token的数量(通常为1),T[SLS]​ 是[SLS] tokens的数量。

这个计算复杂度考虑了所有类型的tokens,并假设它们都通过屏蔽自注意力层(masked self-attention layer)进行更新。具体来说,每个token与所有其他token进行交互,导致了二次复杂度。

为了降低计算复杂度,作者提出使用交叉注意力(cross-attention)来更新[SLS] tokens。交叉注意力与自注意力共享嵌入权重,但只涉及特定类型的token之间的交互。这使得计算复杂度降低为:

\mathcal{O}((T_{\mathrm{visual}}+T_{[\mathrm{CLS}]})^2+T_{[\mathrm{SLS}]}(T_{\mathrm{visual}}+T_{[\mathrm{CLS}]}))

随着注意力偏差的应用,[SLS] tokens 的特征逐渐演化以适应掩码预测。掩码的类别预测通过比较[SLS] tokens和CLIP文本嵌入的类别名称之间的距离或相似度来获得:

P\in\mathbb{R}^{C\times N}

其中 C 是类别数量,N 是查询tokens的数量。

3.4 Segmentation map generation

最后,结合掩码提案 M\in\mathbb{R}^{\frac H{16}\times\frac W{16}\times N}和掩码的类别预测 P\in\mathbb{R}^{C\times N},通过矩阵乘法生成最终的分割图 S:

\large S=M\times P^T

其中, S\in\mathbb{R}^{\frac H{16}\times\frac W{16}\times C}

为了训练模型,mask生成通过dice损失L mask_dice和二元交叉熵损失L mask_bce进行监督。mask模识别通过交叉熵损L cls进行监督。总损失为:

L_{\mathrm{seg}}=\lambda_{1}L_{\mathrm{mask_dice}}+\lambda_{2}L_{\mathrm{mask_bce}}+\lambda_{3}L_{\mathrm{cls}}

损失权重𝜆1、𝜆2、𝜆3分别为 5.0、5.0 和 2.0。 通过端到端训练,侧适配器网络可以最大限度地适应冻结的CLIP模型,因此掩模建议和注意偏差是CLIP感知的。

四、实验结果

在 6 个数据集上进行了实验:COCO Stuff、ADE20K-150、ADE20K-847、Pascal Context-59、Pascal Context-459 和 Pascal VOC。按照常见的做法,所有模型都在 COCO Stuff 的训练集上进行训练,并在其他数据集上进行评估。

  • COCO Stuff:它包含 164K 图像和 171 个注释类,分为训练集、验证集和测试集,分别包含 118K、5K 和 41K 图像。在实验中,默认使用完整的118K训练集作为训练数据。

  • ADE20K-150(ADE-150):它是一个大规模场景理解数据集,包含 20K 训练图像和 2K 验证图像,总共 150 个注释类。

  • ADE20K-847(ADE-847):它具有与 ADE20K-150 相同的图像,但有更多注释的类(847 个类),这对于开放词汇语义分割来说是一个具有挑战性的数据集。

  • Pascal VOC(VOC) :Pascal VOC 包含 20 类语义分割注释,其中训练集和验证集分别包含 1464 个和 1449 个图像。

  • Pascal Context-59:它是一个用于语义理解的数据集,包含 5K 训练图像、5K 验证图像以及总共 59 个带注释的类。

  • Pascal Context-459:它具有与 Pascal Context-59 相同的图像,但有更多注释的类(459 个类),这也广泛用于开放词汇语义分割。

Dataset Analysis:为了澄清并有利于对开放词汇能力的理解,作者通过计算其他数据集和训练数据集 COCO Stuff 之间的类别相似度来进行简单的分析,结果显示在表1。

  • 提取文本嵌入:使用预训练的CLIP模型,将每个数据集的类别名称转换为文本嵌入向量。

  • 计算余弦相似度:对于每一对数据集,计算其类别嵌入向量之间的余弦相似度。具体来说,对于两个类别集合A和B中的每个类别对(a, b),计算它们的余弦相似度,然后利用这些相似度计算Hausdorff(豪斯多夫,对于点集 A 中的每个点 a,找到点集 B 中距离 a 最近的点,然后在这些最近距离中取最大值)距离,作为这两个数据集之间的相似度度量。

  • 生成相似度表:通过上述步骤,得到不同数据集之间的相似度,结果显示在表1中。

在五个验证数据集中,Pascal VOC和Pascal Context-59的相似度高达0.9,这意味着它们更擅长衡量视觉类别方面的域内开放词汇能力。此外,Pascal Context-459、ADE20K-150和ADE20K-847的相似度得分较低,这使得它们能够更好地评估跨领域开放词汇能力。

表 1:验证数据集和训练集(即 COCO Stuff)之间的标签集相似度。基于CLIP文本编码器通过Hausdorff距离和余弦相似度测量。

与最先进方法的性能比较。 † SimSeg [33] 在其论文中使用 COCO Stuff 的子集进行训练。为了公平比较,使用他们官方发布的代码在完整的 COCO Stuff 上重现了他们的方法。 * RN101:ResNet-101 [14]; EN-B7:EfficientNet-B7 [29]; SAN 整体。ensemble是使用集成技巧的结果,而不是默认设置。

与其他方法的训练和测试效率比较。

Param.代表方法中可训练参数的总数(以百万为单位)。输入图像的分辨率为640×640。CLIP型号为ViT-B/16。 * 目前还没有可用的官方代码,按照他们论文中的描述重新实现他们的方法。 OvSeg与 SimSeg具有相似的结构,但它对整个 CLIP 模型进行了微调,从而产生了更多的可训练参数。

不同的特征融合策略。 ViT-B/16 的最后 3 层用于所有实验中的掩模预测。

特征融合层数量和掩模预测层数量之间的权衡

SAN轻量级的关键是利用CLIP模型的强大功能。通过实验说明了表中特征融合的重要性。 如果不融合 CLIP 功能,mIoU 将从 27.8 下降到 21.1。

此外,还注意到,融合较深层(例如第9层)的特征比融合较浅层(例如stem层)的特征要好,并且仅融合第9层的特征可以达到27.1 mIoU,比融合高+6.0 mIoU没有特征融合的基线。这一观察结果与更深层次的特征往往更具语义性的直觉是一致的。此外,与单层融合相比,融合多层特征可以进一步提高性能 +0.8 mIoU。

为了最小化 CLIP 的推理成本,采用单前向设计,即较浅的层用于特征融合,其他较深层用于mask识别,因此需要进行权衡,如上表所示。 当前9层用于特征融合,后3层用于掩模识别时,性能最佳。

掩模预测头的设计选择。 (a) 单头和来自 CLIP 的阻塞梯度的两阶段训练; (b) 单头端到端训练; (c) 解耦头端到端训练。红色虚线表示训练期间的梯度流。

与其他两阶段框架不同,本文的方法是端到端的训练框架。

作者研究了其他两个框架之间的差异。由于注意力偏差分支必须通过 CLIP 进行训练,为了进行比较,在 CLIP 的自注意力层中使用 mask proposal 代替注意力偏差。如果来自 CLIP 的梯度被阻止,则该方法退化为两阶段框架,即掩模预测与 CLIP 识别隔离。否则,该方法是单头端到端训练框架,并且掩模预测是 CLIP 感知的。

两阶段与端到端。这一显着改进证明了 CLIP 感知掩模预测的重要性。

单头和解耦头的比较。只需很少的额外参数和触发器,解耦头就可以显着提高性能。所有模型都经过端到端训练。

单头设计意味着模型只有一个注意力头来处理掩码预测和识别。解耦头设计意味着模型在处理掩码预测和识别时,使用了多个注意力头,这些头之间的计算是解耦的。

ViT-B/16 CLIP 模型输入分辨率的影响。改变 CLIP 输入分辨率,同时始终在侧面适配器网络中使用 640*640 图像。

微调位置嵌入可以提高性能

方法的定性结果。 (a) 和 (b) 是具有不同词汇表(分别为 ADE-150 和 ADE-847)的相同输入图像的结果

SAN容量的影响。代表模型中可训练参数的总数(以百万为单位)。

注意偏差设计的消融和[SLS]令牌的初始化方法

Prompt工程的效果。单个模板“{} 的照片”。用于不使用Prompt工程的模型。

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

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

相关文章

python(6)numpy的使用详细讲解

在numpy中,最基本的数据结构是数组,因此我们首先需要了解如何创建一个数组。numpy提供了多种数组创建方法,包括从列表或元组创建、从文件中读取数据、使用特定函数创建等。下面是一些常用的创建方法: 一、创建数组 1. 从列表或元…

CesiumJS【Basic】- #037 绘制轮廓线(Entity方式)

文章目录 绘制轮廓线(Entity方式)1 目标2 代码2.1 main.ts绘制轮廓线(Entity方式) 1 目标 使用Entity方式绘制轮廓线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(<

10月开始,所有新来日本的外国人都必须加入公共年金体系!

为了吸引更多外国人来日本工作并为他们提供更好的养老保障&#xff0c;日本厚生劳动省最近宣布了一项新政策。 从今年10月开始&#xff0c;所有新来日本的外国人都必须加入公共年金体系。 虽然之前已经有这个要求&#xff0c;但还是有不少人没加入。 因此&#xff0c;日本年金机…

Excel保存时弹出“请注意,您的文档的部分内容可能包含文档检查器无法删除的个人信息”

前言 Excel保存时弹出“请注意&#xff0c;您的文档的部分内容可能包含文档检查器无法删除的个人信息”&#xff0c;本节会介绍如何查看无法删除的个人信息是什么&#xff0c;以及如何关闭该提示窗口 一、关闭弹窗提醒 1、点击文件 – 选项 2、点击选择信任中心 – 信任中心…

烟台网站建设前需要了解哪些

在进行烟台网站建设之前&#xff0c;需要了解以下几个重要的方面&#xff1a; 1. 目标和定位&#xff1a;在建设网站之前&#xff0c;需要明确网站的目标和定位。是为了展示公司业务&#xff0c;还是为了销售产品&#xff0c;或者是为了提供信息和服务等。根据不同的目标和定位…

Soul打造安全社交元宇宙环境,全力守护用户线上社交安全

在数字化时代的浪潮中,智能安全线上社交正成为人们日常生活中的重要组成部分。随着人们对社交媒体和在线平台依赖程度的不断增加,保障个人信息安全和网络安全变得至关重要。在此背景下,社交平台致力于采取多种措施来保障用户的隐私安全,提升社交体验的质量和安全性。而Soul全方…

程序员日志之DNF手游55级版本全职业攻略

目录 传送门正文日志1、概要2、异界套和遗迹悲鸣套坑3、全职业攻略鬼剑士-狂战士鬼剑士-鬼泣鬼剑士-剑魂鬼剑士-阿修罗格斗家-散打格斗家-气功师神枪手-漫游枪手神枪手-枪炮师魔法师-元素师魔法师-魔道学者圣职者-圣骑士 传送门 SpringMVC的源码解析&#xff08;精品&#xff…

黄子韬徐艺洋领证传闻引热议

黄子韬徐艺洋领证传闻引热议&#xff0c;经纪人火速辟谣&#xff1a;谣言止于智者7月1日&#xff0c;娱乐圈再度掀起一阵波澜&#xff0c;一则关于黄子韬与徐艺洋疑似领证的传闻迅速席卷网络&#xff0c;引发了无数粉丝和网友的关注和讨论。然而&#xff0c;在短短几个小时内&a…

Python从0到100(三十四):Python中的urllib模块使用指南

1. urllib模块概述 在Python中&#xff0c;除了广泛使用的requests模块之外&#xff0c;urllib模块也是处理HTTP请求的重要工具。urllib模块在Python 2中分为urllib和urllib2两个模块&#xff0c;而在Python 3中&#xff0c;它们被合并为一个urllib模块。本文将重点介绍Python…

数据恢复:移动硬盘数据恢复全攻略

一、移动硬盘数据恢复概述 在数字化时代&#xff0c;数据已成为我们生活中不可或缺的一部分。移动硬盘作为便携式存储设备&#xff0c;因其大容量、高便携性和稳定性而广受欢迎。然而&#xff0c;在使用过程中&#xff0c;我们可能会遇到数据丢失的问题&#xff0c;这可能是由…

Python 算法交易实验75 QTV200后续想法梳理

说明 在第一步获取数据源&#xff0c;然后进入Mongo(第一个数据节点)开始&#xff0c;QTV200的数据流体系就开始动了。后续用多少时间完成不太好确定&#xff0c;短则数周&#xff0c;长则数月。毕竟有过第一版实验的基础&#xff0c;应该还是可以做到的。 下面就是天马行空&…

CentOS中使用SSH远程登录

CentOS中使用SSH远程登录 准备工作SSH概述SSH服务的安装与启动建立SSH连接SSH配置文件修改SSH默认端口SSH文件传输 准备工作 两台安装CentOS系统的虚拟机 客户机&#xff08;192.168.239.128&#xff09; 服务器&#xff08;192.168.239.129&#xff09; SSH概述 Secure S…

Python基础之多进程

文章目录 1 多进程1.1 简介1.2 Linux下多进程1.3 multiprocessing1.4 Pool1.5 进程间通信1.6 分布式进程 1 多进程 1.1 简介 要让Python程序实现多进程&#xff08;multiprocessing&#xff09;&#xff0c;我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个fork…

如何在本地一键配置最强国产大模型

自从OpenAI的ChatGPT横空出世以来&#xff0c;国内外各类大语言模型&#xff08;LLM&#xff09;层出不穷&#xff0c;其中不乏Google的Gemini、Claude、文心一言等等。相较于竞争激烈的商业模型赛道&#xff0c;以Llama为代表的开源大模型的进步速度也十分惊人。 伴随着大语言…

ANSYS新能源汽车动力电池仿真应用案例

燃料电池是一种非燃烧过程的电化学能转换装置&#xff0c;将氢气&#xff08;等燃料&#xff09;和氧气的化学能连续不断地转换为电能&#xff0c;是发电设备而非储能设备。 根据电解质的不同&#xff0c;分为碱性燃料电池AFC、磷酸燃料电池PAFC、熔融碳酸盐燃料电池MCFC、固体…

微机原理 复习

第一章导论 1.3 冯诺依曼体系结构 &#xff08;1&#xff09;以二进制形式表示指令和数据 &#xff08;2&#xff09;程序和数据事先放在存储器中&#xff08;预存储&#xff09; &#xff08;3&#xff09;由运算器、控制器、输入设备和输出设备五大部件组成 字长、主频…

css实现一个三角形

实现不用方向的三角形可根据border进行设置。具体代码如下&#xff1a; .triangle-up {width: 0;height: 0;border-top: 10px solid transparent;border-left: 10px solid transparent;border-right: 10px solid transparent;border-bottom: 10px solid black;}.triangle-rig…

6-14题连接 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例子2.6. 使用唯一标识码替换员工ID2.7- 产品销售分析 I2.8 - 进店却未进行过交易的顾客2.9 - 上升的温度2.10 - 每台机器的进程平均运行时间2.11- 员工奖金2.12-学生们参加各科测试的次数2.13-至少有5名直接下属的经理2.14 - 确认率 1. 相关知识点 left …

Redis Cluster 模式 的具体实施细节是什么样的?

概述 参考&#xff1a;What are Redis Cluster and How to setup Redis Cluster locally ? | by Rajat Pachauri | Medium Redis Cluster 的工作原理是将数据分布在多个节点上&#xff0c;同时确保高可用性和容错能力。以下是 Redis Cluster 运行方式的简要概述&#xff1a; …

Vue 快速入门案例

步骤一&#xff1a;引入vue.js文件 添加<script>标签并标明路径 步骤二&#xff1a;定义Vue对象 el Vue接管区域 data 定义数据模型 步骤三&#xff1a;编写视图层的展示 v-model 绑定数据模型 {{要展示的数据模型}} 运行效果 总结 文本框里的值&a…