【论文阅读】ViTAE:Vision transformer advanced by exploring intrinsic inductive bias

news/2024/5/15 5:15:58

ViTAE:Vision transformer advanced by exploring intrinsic inductive bias

    • 论文地址
    • 摘要:
    • 简介:
    • 3 方法论
      • 3.1 重温视觉变压器
      • 3.2 ViTAE
      • 3.3 缩减单元
      • 3.4 Normal cell
      • 3.5 模型细节
    • 4 训练
      • 4.1 Implementation details
      • 4.2 Comparison with the state-of-the-art
    • 5 局限性与讨论
    • 6 总结

论文地址

1、论文地址
2、论文源码地址

摘要:

Transformer 在各种计算机视觉任务中显示出巨大的潜力,因为它们使用自注意力机制对远程依赖进行建模的强大能力。然而,视觉变换器将图像视为一维视觉标记序列,在建模局部视觉结构和处理尺度方差时缺乏内在的归纳偏差 (IB)。或者,他们需要大规模的训练数据和更长的训练计划来隐式学习 IB。在本文中,我们提出了一种新的 Vision Transformer Advanced by Exploring intrinsic IB from convolutions,即 ViTAE。从技术上讲,ViTAE 有几个空间金字塔缩减模块,通过使用具有不同扩张率的多个卷积对输入图像进行下采样并将其嵌入到具有丰富的多尺度上下文的标记中。通过这种方式,它获得了一个内在的尺度不变性 IB,并且能够为各种尺度的对象学习鲁棒的特征表示。此外,在每个转换器层中,ViTAE 都有一个与多头自注意力模块并行的卷积块,其特征被融合并馈入前馈网络。因此,它具有内在的局部性 IB,并且能够协同学习局部特征和全局依赖性。在 ImageNet 和下游任务上的实验证明了 ViTAE 优于基线转换器和并发工作。源代码和预训练模型将在代码处提供。

简介:

变形金刚[79, 17, 40, 14, 46, 61]在NLP研究中显示出支配趋势,因为它们在通过自我注意机制建模长期依赖方面具有很强的能力[67,81,51]。变形器的这种成功和良好特性激发了许多将它们应用于各种计算机视觉任务的工作[19,100,97,80,7]。其中,ViT [19] 是开创性的纯变压器模型,它将图像嵌入到一系列可视令牌中,并使用堆叠的变压器块对它们之间的全局依赖关系进行建模。尽管它在图像分类方面取得了可喜的表现,但它需要大规模的训练数据和更长的训练计划。一个重要原因是ViT在建模局部视觉结构(例如,边缘和角落)和处理各种尺度的对象(如卷积)时缺乏内在的归纳偏差(IB)。或者,ViT 必须从大规模数据中隐式地学习这种 IB。

与视觉转换器不同,卷积神经网络 (CNN) 自然地配备了尺度不变性和局部性的内在 IB,并且仍然作为视觉任务中的普遍骨干 [26, 70 , 62, 8, 96]。 CNN 的成功激励我们探索视觉转换器中的内在 IB。我们首先分析 CNN 的上述两个 IB,即局部性和尺度不变性。计算相邻像素之间局部相关性的卷积擅长提取边缘和角点等局部特征。因此,CNN 可以在浅层 [94] 提供丰富的低级特征,然后通过大量顺序卷积 [32、68、71] 逐渐将这些特征聚合成高级特征。此外,CNN 具有层次结构,可以在不同层提取多尺度特征 [68、38、26]。此外,层内卷积还可以通过改变内核大小和膨胀率来学习不同尺度的特征[25、70、8、45、96]。因此,可以通过层内或层间特征融合获得尺度不变的特征表示。然而,CNN 不太适合模拟长程依赖性 2,而这是 transformer 的主要优势。一个有趣的问题出现了:我们能否利用 CNN 的良好特性来改进视觉转换器?最近,DeiT [76] 探索了将知识从 CNN 提取到 Transformer 以促进训练和提高性能的想法。但是,它需要一个现成的 CNN 模型作为老师,并且会消耗额外的训练成本。

与 DeiT 不同的是,我们通过重新设计本文中的网络结构,将内在 IB 显式引入视觉转换器。当前的视觉转换器总是获得具有单尺度上下文的标记 [19、93、80、86、47、69、77],并学习适应来自数据的不同尺度的对象。例如,T2T-ViT [93] 通过以软分割方式巧妙地生成令牌来改进 ViT。具体来说,它使用一系列 Tokens-to-Token 转换层来聚合单尺度相邻上下文信息,并逐步将图像结构化为 tokens。受 CNN 在处理尺度方差方面的成功启发,我们探索了变压器中的类似设计,即具有不同感受野的层内卷积 [70、91],以将多尺度上下文嵌入到标记中。这样的设计允许令牌携带对象在各种尺度上的有用特征,从而自然地具有内在的尺度不变性 IB,并明确地促进变换器更有效地从数据中学习尺度不变的特征。另一方面,低级局部特征是生成高级判别特征的基本要素。尽管 transformer 也可以从数据中学习浅层的这些特征,但它们在设计上并不像卷积那样熟练。最近,[89、43、21] 按顺序堆叠卷积层和注意力层,证明局部性是对全局依赖性的合理补偿。但是,这种串行结构在局部建模期间忽略了全局上下文(反之亦然)。为了避免这种困境,我们遵循“分而治之”的思想,建议并行地对局部性和远程依赖性进行建模,然后融合这些特征来解释两者。通过这种方式,我们使 transformers 能够更有效地学习每个块内的局部和远程特征。

从技术上讲,我们提出了一种新的 Vision Transformers Advanced by Exploring Intrinsic Inductive Bias (ViTAE),它是两种基本单元的组合,即还原细胞 (RC) 和正常细胞 (NC)。 RCs 用于对输入图像进行下采样并将其嵌入到具有丰富的多尺度上下文的 token 中,而 NCs 旨在联合建模 token 序列中的局部性和全局依赖性。此外,这两种类型的细胞共享一个简单的基本结构,即并行的注意模块和卷积层,然后是前馈网络(FFN)。值得注意的是,RC 有一个额外的金字塔缩减模块,具有不同扩张率的空洞卷积,以将多尺度上下文嵌入到标记中。按照 [93] 中的设置,我们堆叠三个缩减单元以将空间分辨率降低 1/16,并堆叠一系列 NC 以从数据中学习判别特征。 ViTAE 在数据效率和训练效率(见图 1)以及下游任务的分类准确性和泛化方面优于代表性视觉转换器。

我们的贡献有三方面。
• 首先,我们探索了变压器中两种类型的内在 IB,即尺度不变性和局部性,并证明了该思想在提高变压器特征学习能力方面的有效性。
• 其次,我们基于两个新的还原和正常单元设计了一个名为 ViTAE 的新变压器架构,以内在地结合上述两个 IB。拟议的 ViTAE 将多尺度上下文嵌入到标记中,并学习局部和远程特征有效。
• 第三,ViTAE在分类精度、数据效率、训练效率和下游任务的泛化方面优于代表性视觉变压器。ViTAE 在 ImageNet 上分别实现了 75.3% 和 82.0% 的顶级 1 精度,参数分别为 4.8M 和 23.6M。

3 方法论

3.1 重温视觉变压器

我们首先对视觉变压器进行简要回顾。为了使变压器适应视觉任务,ViT [19] 首先将图像 x ∈ RH×W×C 拆分为还原比为 p 的标记(即 xt ∈ R((H×W)/p2)×D),其中 H、W 和 C 表示高度、宽度和通道尺寸输入图像 D = Cp2 表示令牌维度。然后,在以元素方式添加位置嵌入之前,将额外的类标记连接到可视标记。生成的令牌将馈送到以下转换器层。每个变压器层由多头自注意力模块(MHSA)和前馈网络(FFN)两部分组成。

MHSA多头自我注意通过为每个头部使用不同的投影矩阵来扩展单头自我注意(SHSA)。具体来说,输入标记 xt 首先使用投影矩阵投影到查询 (Q)、键 (K) 和值 (V),即 Q,K,V =xtWQ,xtQK,xtQV,其中 WQ/K/V ∈ RD×D 分别表示查询、键和值的投影矩阵。然后,该 SHSA 模块重复 h 次以制定 MHSA 模块,其中 h 是磁头数。 h个头的输出特征沿着通道维度连接起来,形成MHSA模块的输出。

FFN FFN被放置在MHSA模块之上,并且相同且分别应用于每个令牌。它由两个线性变换组成,中间有一个激活函数。
此外,在 MHSA 和 FFN 之前和旁边分别添加了层归一化 [2] 和快捷方式。
在这里插入图片描述

3.2 ViTAE

ViTAE 的概述架构旨在将 CNN 中的固有 IB 引入视觉转换器。如图 2 所示,ViTAE 由两种类型的细胞组成,即 RC 和 NC。 RC 负责将多尺度上下文和局部信息嵌入到令牌中,而 NC 用于进一步对令牌中的局部性和远程依赖性进行建模。以图像 x ∈ RH ×W ×C 作为输入,使用三个 RC 分别将 x 逐渐下采样 4×、2× 和 2×。因此,RC 的输出标记的大小为 [H/16,W/16,D],其中 D 是标记维度(在我们的实验中为 64)。然后 RC 的输出标记被展平为 RHW/256×D,与类标记连接,并通过正弦波位置编码添加。接下来,令牌被送入以下 NC,这些 NC 保持令牌的长度。最后,使用来自最后一个 NC 的类标记的线性分类层获得预测概率。
在这里插入图片描述

3.3 缩减单元

我们设计了缩减单元,将多尺度上下文和局部信息嵌入到视觉标记中,而不是直接将图像分割和展平为基于线性图像块嵌入层的视觉标记,这引入了内在的尺度不变性和局部性 IB卷积。
从技术上讲,RC 有两个并行分支分别负责建模局部性和远程依赖性,然后是一个用于特征转换的 FFN。
我们将第 i 个 RC 的输入特征表示为 fi ∈ RHi ×Wi ×Di 。第一个 RC 的输入是图像 x。

在全局依赖分支中,fi 首先被送入金字塔缩减模块 (PRM) 以提取多尺度上下文,即
在这里插入图片描述

(2) 其中Convij(·)表示PRM中的第j个卷积层(PRMi(·))。它使用来自对应于第 i 个 RC 的预定义扩张率集 Si 的扩张率 sij。请注意,我们使用步幅卷积从预定义的缩减比率集 R 中按比率 ri 缩减特征的空间维度。conv 特征沿通道维度连接,即 f ms ∈ iR(Wi/p)×(Hi/p) ×(|Si|D),其中|S|表示 S 中扩张率的数量。

然后通过 MHSA 模块 iii 处理 fms 以建模远程依赖性,即
在这里插入图片描述

(3) 其中 Img2Seq(·) 是一个简单的重塑操作,用于将特征图展平为一维序列。

通过这种方式,fig 将多尺度上下文嵌入到每个标记中。此外,我们使用并行卷积模块 (PCM) 将局部上下文嵌入标记中,这些标记与 fig 融合如下:
在这里插入图片描述

(4) 这里,PCMi(·)表示PCM,它由三个堆叠的卷积层和一个Img2Seq(·)操作组成。值得注意的是,并行卷积分支通过使用步长卷积具有与 PRM 相同的空间下采样率。这样,令牌特征可以携带局部和多尺度上下文,这意味着 RC 通过设计获得局部 IB 和尺度不变 IB。融合的标记然后由 FFN 处理,重塑回特征图,并馈送到以下 RC 或 NC,即
在这里插入图片描述

(5) 其中 Seq2Img(·)是一个简单的重塑操作,用于将标记序列重塑回特征图。 F F Ni (·) 表示第 i 个 RC 中的 FFN。在我们的 ViTAE 中,三个 RC 按顺序堆叠以分别逐渐将输入图像的空间维度减少 4×、2× 和 2×。最后一个RC生成的feature maps大小为[H/16, W/16, D],然后被压扁成visual tokens,送入后面的NCs。

3.4 Normal cell

在这里插入图片描述

如图右下部分所示如图 2 所示,除了没有 PRM 外,NC 与还原单元RC具有相似的结构。由于16RCs后feature map的空间尺寸相对较小(1×),NCs中没有必要使用PRM。

给定来自第三个 RC 的 f3,我们首先将它与类标记 tcls 连接起来,然后将它添加到位置编码中以获得后续 NC 的输入标记 t。在这里,为了清楚起见,我们忽略了下标,因为所有 NC 都具有相同的架构,但可学习的权重不同。 tcls 在训练开始时随机初始化,并在推理期间固定。

与 RC 类似,令牌被送入 MHSA 模块,即 tg = MHSA(t)。
同时,它们被重塑为 2D 特征图并输入 PCM,即 tl = Img2Seq(PCM(Seq2Img(t)))。请注意,类标记在 PCM 中被丢弃,因为它与其他视觉标记没有空间连接。为了进一步减少 NC 中的参数,我们在 PCM 中使用组卷积。

MHSA 和 PCM 的特征然后通过逐元素求和融合,即 tlg = tg + tl。
最后,将 tlg 馈入 FFN 得到 NC 的输出特征,即 tnc = F F N (tlg ) + tlg 。
与 ViT [19] 类似,我们对最后一个 NC 生成的类标记应用层归一化,并将其馈送到分类头以获得最终分类结果。

3.5 模型细节

我们在实验中使用了两种ViTAE变体,以公平地比较具有sim-ilar模型大小的其他模型。它们的详细信息总结在第一个RC的表 1.In 中,默认的convo-lution核大小为7×7,跨度为4,膨胀率为S1 = [1, 2, 3, 4]。在以下两个RC中,卷积核大小分别为3×3,步幅为2,膨胀率分别为S2 = [1, 2, 3]和S3 = [1, 2]。由于令牌的空间维度减小,因此无需使用大内核和膨胀率。RC 和 NC 中的 PCM 包括三个卷积层,内核大小为 3 × 3。
在这里插入图片描述

4 训练

4.1 Implementation details

我们在标准 ImageNet [38] 数据集上训练和测试了提议的 ViTAE 模型,该数据集包含约 130 万张图像并涵盖 1k 类。除非明确说明,否则训练期间的图像大小设置为 224 × 224。我们使用 AdamW [48] 优化器与余弦学习速率调度器,并使用与 T2T [93] 完全相同的数据增强策略进行公平比较,涉及训练策略和模型大小。我们使用 512 的批量大小来训练所有模型,并将初始学习率设置为 5e-4。我们的模型结果可以在表 2 中找到,其中所有模型都在 8 个 V100 GPU 上训练了 300 个 epoch。这些模型建立在 PyTorch [57] 和 TIMM [82

4.2 Comparison with the state-of-the-art

我们在表 2 中将我们的 ViTAE 与具有相似模型大小的 CNN 模型和视觉转换器进行了比较。报告了 ImageNet 验证集上的 Top-1/5 准确度和实际 Top-1 准确度。我们将这些方法分为 CNN 模型、具有学习 IB 的视觉转换器和具有引入的固有 IB 的视觉转换器。与 CNN 模型相比,我们的 ViTAE-T 达到了 75.3% 的 Top-1 准确率,优于参数更多的 ResNet-18。 ViTAE 模型的真实 Top-1 精度为 82.9%,与参数比我们多四倍的 ResNet-50 相当。同样,我们的 ViTAE-S 使用 ResNet-101 和 ResNet-152 一半的参数实现了 82.0% 的 Top-1 精度,显示了通过设计从具有相应内在 IB 的特定结构学习局部和远程特征的优越性。
将 ViTAE-T 与 MobileNetV1 [31] 和 MobileNetV2 [65] 进行比较时也可以观察到类似的现象,其中 ViTAE 使用更少的参数获得更好的性能。与根据 NAS [73] 搜索的较大模型相比,我们的 ViTAE-S 在使用 384 × 384 图像作为输入时实现了相似的性能,这进一步显示了具有固有 IB 的视觉转换器的潜力。此外,在转换器中通过学习 IB,ViT 是第一个用于视觉识别的纯 transformer 模型。 DeiT 与 ViT 具有相同的结构,但使用不同的数据增强和训练策略来促进 transformer 的学习。 DeiT⚗ 表示使用现成的 CNN 模型作为教师模型来训练 DeiT,它以知识蒸馏的方式隐式地将 CNN 的固有 IB 引入到 transformer,在 ImageNet 数据集上表现出比 vanilla ViT 更好的性能。令人兴奋的是,我们的 ViTAE-T 参数更少,甚至优于蒸馏模型 DeiT⚗,证明了通过设计在变压器中引入本征 IB 的功效。此外,与其他具有显式固有 IB 的变压器相比,我们的参数较少的 ViTAE 也实现了相当或更好的性能。例如,ViTAE-T 实现了与 LocalVit-T 相当的性能,但参数减少了 1M,证明了所提出的 RC 和 NC 在引入内在 IB 方面的优越性。

5 局限性与讨论

在本文中,我们探索了两种类型的 IB,并通过建议的还原和正常单元将它们合并到变压器中。通过这两个单元的协作,我们的 ViTAE 模型在 ImageNet 上以快速收敛和高数据效率实现了令人印象深刻的性能。然而,由于计算资源的限制,我们没有缩放 ViTAE 模型并在大型数据集上训练它,例如 ImageNet-21K [38] 和 JFT-300M [30]。虽然目前还不清楚,但从以下初步证据来看,我们对其规模属性持乐观态度。如图 2 所示,由于跳跃连接和并行结构,我们的 ViTAE 模型可以看作是互补变换层和卷积层的单元内集成。根据图 3 所示的注意力距离分析,集成特性使 transformer 层和卷积层能够专注于它们擅长的领域,即建模远程依赖性和局部性。因此,ViTAE 很有可能从大规模数据中学习到更好的特征表示。此外,我们在本文中只研究了两个典型的 IB。在未来的研究中可以探索更多种类的 IB,例如构成视点不变性 [64]。

6 总结

在本文中,我们重新设计了变压器模块,
提出了两个基本单元(还原单元和普通单元),
将两种类型的固有电感偏置(IB)集成到变压器中,即局部性和尺度不变性,
从而产生了一种简单而有效的视觉变压器架构ViTAE。

大量实验表明,ViTAE在分类精度、数据效率、训练效率和下游任务的泛化能力等多方面都优于代表性视觉变压器。

我们计划将ViTAE扩展到大型或巨大的模型大小,并在未来的研究中在大型数据集上进行训练。
此外,还将调查其他类型的IB。我们希望这项研究将为以下将内在IB引入视觉转换器以及了解内在和习得IB的影响的研究提供有价值的见解。


http://www.mrgr.cn/p/02808478

相关文章

Python高阶--闭包

闭包作用:可以用来在一个函数与一组私有变量之间创建关联关系,在给定函数被多次调用的过程中,这些私有变量能够保持其持久性(保存运行环境与变量的状态) 闭包的特征:1.必须要有函数的嵌套,而且外层函数必须返回内层函数。外层函数相当于给内层函数提供了一个包装起来的运…

实验五 Spark SQL编程初级实践

Spark SQL编程初级实践 Spark SQL基本操作 将下列JSON格式数据复制到Linux系统中,并保存命名为employee.json。 { "id":1 , "name":" Ella" , "age":36 } { "id":2, "name":"Bob","a…

数据结构和算法:贪心

贪心算法 贪心算法是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期获得全局最优解。 贪心算法和动态规划都常用于解决优化问题。它们之间存在一…

【数据结构】最小生成树(Prim算法、Kruskal算法)解析+完整代码

5.1 最小生成树 定义 对一个带权连通无向图 G ( V , E ) G(V,E) G(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。 设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T称…

使用大卫的k8s监控面板(k8s+prometheus+grafana)

问题 书接上回,对EKS(AWS云k8s)启用AMP(AWS云Prometheus)监控AMG(AWS云 grafana),上次我们只是配通了EKSAMPAMG的监控路径。这次使用一位大卫老师的grafana的面板,具体地址如下: ht…

【idea】idea 中 git 分支多个提交合并一个提交到新的分支

一、方法原理讲解 我们在 dev 分支对不同的代码文件做了多次提交。现在我们想要把这些提交都合并到 test 分支。首先我们要明白四个 git 操作, commit:命令用于将你的代码变更保存到本地代码仓库中,它创建了一个新的提交(commit…

干货整理:好用的文件加密软件有哪些

说到文件加密,想必大家都很熟悉,文件加密已经普遍应用,文件加密是一种重要的安全措施,可以确保数据的机密性、完整性和可用性,降低因数据泄露或丢失带来的风险。 下面小编给大家分享几款常用的加密软件,大…

Spark和Hadoop的安装

实验内容和要求 1.安装Hadoop和Spark 进入Linux系统,完成Hadoop伪分布式模式的安装。完成Hadoop的安装以后,再安装Spark(Local模式)。 2.HDFS常用操作 使用hadoop用户名登录进入Linux系统,启动…

【Flink入门修炼】2-3 Flink Checkpoint 原理机制

如果让你来做一个有状态流式应用的故障恢复,你会如何来做呢? 单机和多机会遇到什么不同的问题? Flink Checkpoint 是做什么用的?原理是什么? 一、什么是 Checkpoint? Checkpoint 是对当前运行状态的完整记…

IDM下载器_Internet Download Manager 6.42.7

网盘下载 IDM下载器是一款针对互联网所打造的下载管理器。IDM下载器能将下载速度提高5倍,恢复因丢失的连接,网络问题,计算机关闭或意外断电而重新启动中断或中断的下载。IDM下载器还可支持所有流行的浏览器,以使用独特的“高级浏…

论文解读:(VPT)Visual Prompt Tuning

文章汇总 要解决的问题 大型模型应用于下游任务本身就存在挑战。最明显的(通常也是最有效的)适应策略是对预先训练好的模型进行全面的端到端微调。 动机 只微调参数的一个子集 解决的办法 只在输入空间中引入少量特定于任务的可学习参数,而在下游训练期间冻结…

03-JAVA设计模式-策略模式

策略模式 什么是策略模式 策略模式(Strategy Pattern)是行为设计模式之一,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,…

Matlab 使用subplot绘制多个子图,一元拟合

实现效果: clc; clear;filename sri.xlsx; % 确认文件路径data readtable(filename); datavalue data{:,2:end}; datavalue datavalue;fig figure(Position, [0, 0, 1500, 900]); indexString ["(a)","(b)","(c)","(d)&qu…

go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控

有关包的安装 我们要实现go语言对第三方包的操作需要我们下载第三方包go.etcd.io,下载命令: go get go.etcd.io/etcd/client/v3 ectd的put与get操作 相关函数说明与示例 我们想实现对etcd进行简单的操作的步骤还是比较简单的,在我上一篇文…

Spring Boot 如何实现缓存预热

Spring Boot 实现缓存预热 1、使用启动监听事件实现缓存预热。2、使用 PostConstruct 注解实现缓存预热。3、使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。4、通过实现 InitializingBean 接口,并重写 afterPropertiesSet 方法实现缓存预热。 1、使用…

Linux学习之路 -- 进程篇 -- 自定义shell的编写

前面介绍了进程程序替换的相关知识&#xff0c;接下来&#xff0c;我将介绍如何基于前面的知识&#xff0c;编写一个简单的shell&#xff0c;另外本文的所展示的shell可能仅供参考。 目录 <1>获取用户的输入和打印命令行提示符 <2>切割字符串 <3>执行这个…

分析和比较深度学习框架 PyTorch 和 Tensorflow

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 深度学习作为人工智能的一个重要分支&#xff0c;在过去十年中取得了显著的进展。PyTorch 和 TensorFlow 是目前最受欢迎、最强大的两个深度学习框架&#xff0c;它们各自拥有独特的特点和优势。 1. Py…

Vue+Echarts 实现中国地图和飞线效果

目录 实现效果准备 实现效果 在线预览&#xff1a;https://mouday.github.io/vue-demo/packages/china-map/dist/index.html 准备 高版本的echarts&#xff0c;不包含地图数据&#xff0c;需要自己下载到项目中 1、地图数据下载 https://datav.aliyun.com/portal/school/at…

U9网页提示Base-64字符数组或字符串的长度无效

GoogleChrome打开U9网页突然出现错误 Base-64 字符数组或字符串的长度无效。 说明:Base-64 字符数组或字符串的长度无效。Page URL: /U9/mvc/login/index?ReturnUrl=%2fU9%2fmvc%2fmain%2findex 堆栈信息在 System.Convert.FromBase64_Decode(Char* startInputPtr, Int32 inp…

Kafka源码分析(四) - Server端-请求处理框架

系列文章目录 Kafka源码分析-目录 一. 总体结构 先给一张概览图&#xff1a; 服务端请求处理过程涉及到两个模块&#xff1a;kafka.network和kafka.server。 1.1 kafka.network 该包是kafka底层模块&#xff0c;提供了服务端NIO通信能力基础。 有4个核心类&#xff1a;…