当前位置: 首页 > news >正文

Vision Transformer (ViT) 基本原理

Vision Transformer (ViT) 基本原理

flyfish

Vision Transformer (ViT) 是一种基于 Transformer 架构的计算机视觉模型


一、ViT 的基本原理

ViT 的核心思想是将一张图像视为一组序列,将其嵌入到 Transformer 的输入中,通过自注意力机制捕获全局上下文信息,从而进行分类或其他视觉任务。

  • 传统卷积神经网络 (CNN): 使用卷积核逐层提取局部特征,通常关注图像的局部模式。
  • ViT 的创新点: 不使用卷积操作,而是将图像划分为小块 (patches),通过 Transformer 模型直接处理全局特征。

二、ViT 的核心架构

1. 输入处理

1.1 图像分块 (Patch Partitioning)
将输入图像 x ∈ R H × W × C x \in \mathbb{R}^{H \times W \times C} xRH×W×C H H H: 高, W W W: 宽, C C C: 通道数)分割为 N N N 个固定大小的图像块 (patch)。
每个 patch 的大小为 P × P P \times P P×P,则总的 patch 数量为:

N = H P × W P N = \frac{H}{P} \times \frac{W}{P} N=PH×PW

每个 patch 被展平成向量,形状为 R P 2 ⋅ C \mathbb{R}^{P^2 \cdot C} RP2C

1.2 Patch 嵌入 (Patch Embedding)
通过一个线性投影将每个 patch 转换为 D D D-维的向量:

z 0 = [ z 0 1 , z 0 2 , … , z 0 N ] 其中  z 0 i ∈ R D z_0 = [z_0^1, z_0^2, \dots, z_0^N] \quad \text{其中 } z_0^i \in \mathbb{R}^D z0=[z01,z02,,z0N]其中 z0iRD

公式:

z 0 i = W e ⋅ Flatten ( x i ) + b e z_0^i = W_e \cdot \text{Flatten}(x_i) + b_e z0i=WeFlatten(xi)+be

其中, W e W_e We 是嵌入权重, b e b_e be 是偏置。

1.3 加入位置编码 (Positional Encoding)
因为 Transformer 缺乏对序列顺序的感知,需要加入位置编码:

z 0 = z 0 + E p o s z_0 = z_0 + E_{pos} z0=z0+Epos

E p o s ∈ R N × D E_{pos} \in \mathbb{R}^{N \times D} EposRN×D 是位置编码矩阵。


2. Transformer 编码器 (Transformer Encoder)

Transformer 编码器由多层组成,每层包含两个主要模块:

2.1 多头自注意力机制 (Multi-Head Self-Attention, MHSA)

自注意力机制的核心思想是捕捉输入序列中每个元素与其他元素之间的关系。

计算步骤

  1. 对输入 z l − 1 ∈ R N × D z_{l-1} \in \mathbb{R}^{N \times D} zl1RN×D 进行线性变换得到 Q , K , V Q, K, V Q,K,V
    Q = z l − 1 W Q , K = z l − 1 W K , V = z l − 1 W V Q = z_{l-1}W_Q, \quad K = z_{l-1}W_K, \quad V = z_{l-1}W_V Q=zl1WQ,K=zl1WK,V=zl1WV

  2. 计算注意力权重:
    Attention ( Q , K , V ) = softmax ( Q K ⊤ D k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{D_k}}\right)V Attention(Q,K,V)=softmax(Dk QK)V

    其中, D k D_k Dk Q Q Q K K K 的维度,用于缩放防止梯度爆炸。

  3. 多头注意力的输出为:
    MHSA ( z l − 1 ) = [ head 1 , … , head h ] W O \text{MHSA}(z_{l-1}) = [\text{head}_1, \dots, \text{head}_h]W_O MHSA(zl1)=[head1,,headh]WO

    W Q , W K , W V , W O W_Q, W_K, W_V, W_O WQ,WK,WV,WO 是学习参数, h h h 是注意力头数。

2.2 前向全连接层 (Feed-Forward Network, FFN)

每个位置的特征通过一个两层全连接网络进行变换:

FFN ( x ) = ReLU ( x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{ReLU}(xW_1 + b_1)W_2 + b_2 FFN(x)=ReLU(xW1+b1)W2+b2

2.3 残差连接与归一化

每个模块后有残差连接和 LayerNorm:

z l ′ = LayerNorm ( z l − 1 + MHSA ( z l − 1 ) ) z_l' = \text{LayerNorm}(z_{l-1} + \text{MHSA}(z_{l-1})) zl=LayerNorm(zl1+MHSA(zl1))
z l = LayerNorm ( z l ′ + FFN ( z l ′ ) ) z_l = \text{LayerNorm}(z_l' + \text{FFN}(z_l')) zl=LayerNorm(zl+FFN(zl))


3. 分类头 (Classification Head)

通过一个 learnable 的分类标记 z cls z_{\text{cls}} zcls 获取全局特征,最后用全连接层输出分类结果:

y = softmax ( W h e a d ⋅ z cls + b h e a d ) y = \text{softmax}(W_{head} \cdot z_{\text{cls}} + b_{head}) y=softmax(Wheadzcls+bhead)


三、与传统 Transformer 的主要区别

  1. 输入类型

    • 传统 Transformer: 输入为一维序列(如词向量)。
    • ViT: 输入为二维图像分块。
  2. 位置编码

    • 传统 Transformer: 通常使用正弦或可学习的位置编码。
    • ViT: 通常直接添加 learnable 的二维位置编码。
  3. 任务目标

    • 传统 Transformer: 多用于 NLP 任务(如翻译、文本分类)。
    • ViT: 多用于视觉任务(如图像分类、目标检测)。

四、ViT 中的注意力机制如何运作

ViT 的注意力机制核心是 自注意力 (Self-Attention),通过计算每个 patch 之间的相关性,捕获全局信息。

1. 自注意力权重的计算

α i j = exp ⁡ ( q i ⋅ k j D k ) ∑ j = 1 N exp ⁡ ( q i ⋅ k j D k ) \alpha_{ij} = \frac{\exp\left(\frac{q_i \cdot k_j}{\sqrt{D_k}}\right)}{\sum_{j=1}^N \exp\left(\frac{q_i \cdot k_j}{\sqrt{D_k}}\right)} αij=j=1Nexp(Dk qikj)exp(Dk qikj)

其中:

  • α i j \alpha_{ij} αij 表示 patch i i i j j j 的注意力权重。
  • q i q_i qi k j k_j kj 分别是 query 和 key 向量。
2. 输出特征的加权求和

Attention ( Q , K , V ) = ∑ j = 1 N α i j v j \text{Attention}(Q, K, V) = \sum_{j=1}^N \alpha_{ij} v_j Attention(Q,K,V)=j=1Nαijvj


五、示例计算流程

假设输入图像大小为 224 × 224 × 3 224 \times 224 \times 3 224×224×3,每个 patch 大小为 16 × 16 16 \times 16 16×16,则:

  • 总 patch 数 N = 224 16 × 224 16 = 196 N = \frac{224}{16} \times \frac{224}{16} = 196 N=16224×16224=196
  • 每个 patch 被展平为向量,形状为 16 × 16 × 3 = 768 16 \times 16 \times 3 = 768 16×16×3=768
  • 经过线性投影后,转换为 D D D-维(如 D = 768 D=768 D=768)。

经过多层 Transformer 编码器后,分类标记 z cls z_{\text{cls}} zcls 被用于分类。

ViT 是计算机视觉领域的重要进步,通过将 Transformer 应用于图像任务,突破了传统 CNN 的局限,在大规模数据集上表现出色。

Vision Transformer (ViT) 整体流程

图像处理流程:
图像切分 Patch → Patch 序列化 → Patch + Position Embedding → Transformer Encoder → MLP Head → 分类结果

  1. 输入预处理:将图像划分为固定大小的 Patch,转化为 Token 序列,加入 [CLS] Token 和位置编码,形成符合 Transformer 的输入格式。
  2. Transformer Encoder:通过自注意力机制捕获全局特征,堆叠多个编码器以提取深层次特征。
  3. 分类头:利用 [CLS] Token 表示全局特征,通过 MLP 进行分类。

详细些就是
在这里插入图片描述

首先,要对图像进行切分操作,将完整的图像切割成一个个的小部分,也就是所谓的 “Patch”。
接着,把这些切分好的 “Patch” 按照一定顺序进行序列化处理,使其能够以有序的形式来参与后续的流程。
然后,为序列化后的 “Patch” 添加上位置嵌入信息(Position Embedding),通过这样的方式让模型能够知晓每个 “Patch” 在图像中的位置情况,便于后续准确地处理。
之后,把带有位置嵌入的 “Patch” 送入到 Transformer Encoder 当中,Transformer Encoder 会运用其自身的机制对输入的内容进行特征提取等相关处理,进一步挖掘和分析其中蕴含的特征信息。
再之后,经过 Transformer Encoder 处理后的结果会传递到多层感知机头部(MLP Head),由多层感知机对这些特征做进一步的整合、变换等操作。
最终,经过前面一系列的处理后,多层感知机头部输出相应的分类结果,以此来判断图像属于哪一类别的内容。


1. 图像切分 Patch

给定一张 RGB 图像,尺寸为 ( 224 , 224 , 3 ) (224, 224, 3) (224,224,3),假设 Patch 的大小为 16 × 16 16 \times 16 16×16

  • Patch 数量
    N = 22 4 2 1 6 2 = 196 N = \frac{224^2}{16^2} = 196 N=1622242=196

  • 每个 Patch 的尺寸
    每个 Patch 为 ( 16 , 16 , 3 ) (16, 16, 3) (16,16,3),展开后为一维向量,维度大小为:
    16 × 16 × 3 = 768 16 \times 16 \times 3 = 768 16×16×3=768

  • 线性嵌入矩阵
    使用一个线性投影矩阵将每个 Patch 映射到 D D D-维嵌入空间,这里 D = 768 D = 768 D=768。嵌入后的 Patch 表示为 ( 196 , 768 ) (196, 768) (196,768)

处理到这里,已经将原始的视觉问题转化为 NLP 问题:输入序列由一系列一维的 Token 表示。


2. [CLS] Token

ViT 借鉴了 BERT 中的 [CLS] 特殊 Token,用于表示整个图像的全局信息:

  • [CLS] Token 的位置信息始终固定为 0,但通过注意力机制,它能够与所有的 Patch Token 交互,从而获取全局特征。
  • 在 [CLS] Token 的基础上,仅需根据其输出的嵌入来进行最终分类任务。

加入 [CLS] Token 后,输入序列长度由 196 196 196 变为 197 197 197,输入维度变为:
( 197 , 768 ) (197, 768) (197,768)

实验对比:ViT 对比了两种获取全局特征的方式:[CLS] Token 和 Global Average Pooling (GAP)。实验表明二者效果相当,但为了与原始 Transformer 保持一致,ViT 选择了 [CLS] Token。


3. 位置编码 (Positional Embedding)

Transformer 缺乏对序列位置信息的直接感知,因此需要加入位置编码:

  • 对每个 Patch 编号(1~196),通过映射表生成一个 768 维的位置向量作为位置编码。
  • 位置编码与 Patch 的嵌入直接相加,得到最终送入 Transformer 的向量,维度仍为 ( 197 , 768 ) (197, 768) (197,768)

实验对比
ViT 探索了多种位置编码方式,包括:

  1. 一维位置编码 (1D Positional Embedding)
  2. 二维位置编码 (2D Positional Embedding)
  3. 相对位置编码 (Relative Positional Embedding)

结果表明三者均能很好地学习位置信息,这可能是因为 ViT 处理的是 Patch-Level 而非 Pixel-Level 的特征,Patch 数量较少(196 个),学习位置关系较为简单。


4. Transformer 编码器 (Transformer Encoder)

经过上述数据预处理,得到输入矩阵:
Input:  ( 197 , 768 ) \text{Input: } (197, 768) Input: (197,768)

Transformer Encoder 的组成:

  • 多头自注意力机制 (Multi-Head Self-Attention, MHSA)

    1. 输入序列 ( 197 , 768 ) (197, 768) (197,768) 通过线性变换生成 Q , K , V Q, K, V Q,K,V 三组矩阵,维度分别为 ( 197 , 768 ) (197, 768) (197,768)
    2. 假设有 H = 12 H=12 H=12 个注意力头,每个头的维度为 768 12 = 64 \frac{768}{12} = 64 12768=64。通过线性投影,降维得到 ( 197 , 64 ) (197, 64) (197,64) 的表示。
    3. 每个头独立计算注意力,输出 H H H ( 197 , 64 ) (197, 64) (197,64) 矩阵,最后拼接成 ( 197 , 768 ) (197, 768) (197,768)
  • 前向全连接网络 (MLP)
    通常包含两层全连接层,伴随激活函数:
    ( 197 , 768 ) → 升维 ( 197 , 3072 ) → 降维 ( 197 , 768 ) (197, 768) \xrightarrow{\text{升维}} (197, 3072) \xrightarrow{\text{降维}} (197, 768) (197,768)升维 (197,3072)降维 (197,768)

  • 残差连接和归一化
    每个模块后通过残差连接和 LayerNorm,使输入输出维度一致,便于堆叠多个 Transformer Block。

经过一个 Transformer Block 后,输入维度从 ( 197 , 768 ) (197, 768) (197,768) 转换为相同的 ( 197 , 768 ) (197, 768) (197,768),可以堆叠多个 Block(例如 ViT-B 中堆叠 12 层)。


5. 分类头 (MLP Head)

最终通过 Transformer 编码器得到的 [CLS] Token 表示 z c l s z_{cls} zcls,维度为 ( 1 , 768 ) (1, 768) (1,768)
通过全连接层生成最终的分类结果:
Output: softmax ( W ⋅ z c l s + b ) \text{Output: } \text{softmax}(W \cdot z_{cls} + b) Output: softmax(Wzcls+b)


相关文章:

Vision Transformer (ViT) 基本原理

Vision Transformer (ViT) 基本原理 flyfish Vision Transformer (ViT) 是一种基于 Transformer 架构的计算机视觉模型 一、ViT 的基本原理 ViT 的核心思想是将一张图像视为一组序列,将其嵌入到 Transformer 的输入中,通过自注意力机制捕获全局上下文…...

【青牛科技】拥有两个独立的、高增益、内部相位补偿的双运算放大器,可适用于单电源或双电源工作——D4558

概述: D4558内部包括有两个独立的、高增益、内部相位补偿的双运算放大器,可适用于单电源或双电源工作。该电路具有电压增益高、噪声低等特点。主要应用于音频信号放大,有源滤波器等场合。 D4558采用DIP8、SOP8的封装形式 主要特点&#xff…...

LCD与lvgl

LCD与lvgl 目录 LCD与lvgl 回顾 LCD 的驱动层讲解 1、LCD 的常见接口 2、我们的 LCD 的参数 3、LCD 的设备树说明 4、LCD 的设备树说明 5、如何移植 LCD 的驱动(重点) LCD 的应用层开发 1:LCD 应用开发->界面开发的方法 2:LVGL 模拟器安装 3:LVGL 工程创建和…...

大语言模型(2)--GPT-1

GPT-1是由OpenAI在2018年推出的第一代生成式预训练模型(《Improving Language Understanding by Generative Pre-Training》),它采用了无监督预训练和有监督微调相结合的方法,以增强模型的通用任务求解能力。在此之前,…...

openstack内部rpc消息通信源码分析

我们知道openstack内部消息队列基于AMQP协议,默认使用的rabbitmq 消息队列。谈到rabbitmq,大家或许并不陌生,但或许会对oslo message有些陌生。openstack内部并不是直接使用rabbitmq,而是使用了oslo.message 。oslo.message 后端的…...

单端和差分信号的接线法

内容来源:【单端信号 差分信号与数据采集卡的【RSE】【 NRES】【 DIFF】 模式的连接】 此篇文章仅作笔记分享。 单端输入 单端信号指的是输入信号由一个参考端和一个信号端构成,参考端一般是地端,信号就是通过计算信号端口和地端的差值所得…...

服务器被ping的风险,如何开启和禁止ping?

允许服务器被ping(即响应ICMP回显请求)有其风险和好处。允许ping的主要好处是它可以帮助网络管理员快速检查服务器的连通性。然而,这也可能带来一些安全风险,例如: 暴露信息:响应ping请求可以让攻击者知道…...

pushgateway HA高可用方案

未经本人同意不得转载,若引用请附上原文链接。 项目使用flink来处理kafka中的无界流数据,采用的是flink on yarn的模式部署flink任务。最近做flink任务的监控过程中,踩了一些坑。下面是过程,只想看最终方案的直接拉到最后。 先说…...

在 Ubuntu Server 22.04 上安装 Docker 的详细步骤

本文档详细记录了在 Ubuntu Server 22.04 上安装 Docker 的完整过程,包括解决过程中遇到的问题。希望能对读者有所帮助。 安装过程,重点需要看官方文档。https://docs.docker.com/engine/install/ubuntu/ 步骤 1:卸载冲突的软件包 在安装 D…...

锻造船用发动机动力系统,铸强船舶“心脏”

船舶是海洋、湖泊及河流中重要的水上交通工具,不仅能够促进海上经济的发展,还能够保卫国家的制海权。船舶动力装置,也就是船舶的核心动力源——船用发动机动力系统对船舶的重要作用不言自明,关系到船舶的性能质量,能够…...

string类函数的手动实现

在上一篇文章中,我们讲解了一些string类的函数,但是对于我们要熟练掌握c是远远不够的,今天,我将手动实现一下这些函数~ 注意:本篇文章中会大量应用复用,这是一种很巧妙的方法 和以往一样,还是…...

前端工程化面试题(二)

前端模块化标准 CJS、ESM 和 UMD 的区别 CJS(CommonJS)、ESM(ESModule)和UMD(Universal Module Definition)是前端模块化标准的三种主要形式,它们各自有不同的特点和使用场景: CJS&…...

优化 LabVIEW 系统内存使用

在 LabVIEW 中,内存使用管理是确保高效系统性能的关键因素,尤其是在进行复杂的数据采集、信号处理和控制任务时。LabVIEW 程序的内存消耗可能会随着项目的规模和复杂度增加,导致性能下降,甚至出现内存溢出或程序崩溃。通过合理优化…...

pyqt6事件概要

例子: 利用qtdesigner建立闹钟 python代码 # 导入所需要的文件 from PyQt6.QtGui import QIcon, QPixmap from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QListWidgetItem from PyQt6 import uic from PyQt6.QtCore import Qt, QTime imp…...

鸿蒙分享(一):添加模块,修改app名称图标

码仓库:https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 新建公共模块common 在entry的oh-package.json5添加dependencies,引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&…...

记忆泡沫垫市场:解锁舒适睡眠的黄金钥匙与增长潜力的深度剖析

在当今快节奏、高压力的生活中,优质睡眠已成为现代人追求健康生活的重要组成部分。记忆泡沫垫,作为床垫和枕头领域的一次革命性创新,凭借其独特的材质特性和对人体工学的完美贴合,正逐步成为改善睡眠质量的首选解决方案。本文将从…...

AI+电影特效产品化:开启电影人物年轻化新时代

随着人工智能技术的不断进步,它正在改变着我们生活的方方面面,包括娱乐产业。在电影制作领域,AI技术的应用尤其引人注目,尤其是在实现演员年轻化或老化效果方面。本文将介绍一款名为MyTimeMach...

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖:安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整个…...

【MySQL 进阶之路】表级锁、行级锁详解

1. 表级锁和行级锁的概念及区别 表级锁(Table Lock) 表锁是一种较为粗粒度的锁,锁定的是整个表。当某个事务加锁表时,其他事务对该表的任何读写操作都会被阻塞,直到锁被释放。因此,表锁具有较高的冲突概率…...

FPGA系列,文章目录

前言 FPGA(Field-Programmable Gate Array,现场可编程门阵列)是一种集成电路,其内部结构可以通过软件重新配置来实现不同的逻辑功能。与传统的ASIC(Application-Specific Integrated Circuit,专用集成电路…...

离谱的梯形滤波器——增加过渡点

增加过渡点 频率采样法(Frequency Sampling Method)是一种设计FIR滤波器的方法,通过在频域中指定希望的频率响应,然后利用逆离散傅里叶变换(IDFT)来获得滤波器的脉冲响应。然而,这种方法容易导…...

容积卡尔曼滤波(CKF)仿真抛物线运动

容积卡尔曼滤波(CKF)仿真抛物线运动 容积卡尔曼滤波(Cubature Kalman Filter, CKF)的MATLAB实现。CKF是一种用于非线性系统状态估计的算法,它通过在状态空间中采样点(容积点)来近似非线性函数的…...

FlightGear+MATLAB+飞行手柄实现实时飞控视景系统

文章目录 一、软件配置二、FlightGearMATLAB联合仿真第一步 复制文件第二步 新建文件夹第三步 打开demo第四步 demo说明第五步 打开Simulink第六步 连接FlightGear第七步 设置FlightGear第八步 生成FlightGear连接文件FlightGear的设置Network的设置File的设置生成.bat文件 第九…...

Oracle 11g Data Guard 环境中的 GAP 处理办法

概述 在Data Guard 环境中,当主库的某些日志没有成功传送到备库时,就会发生归档裂缝(Archive Gap)。目前,Oracle 提供了两种日志 GAP 的检测和处理机制:自动 GAP 处理(Automatic Gap Resolutio…...

自建服务器,数据安全有保障

在远程桌面工具的选择上,向日葵和TeamViewer功能强大,但都存在收费昂贵、依赖第三方服务器、数据隐私难以完全掌控等问题。相比之下,RustDesk 凭借开源免费、自建服务的特性脱颖而出!用户可以在自己的服务器上部署RustDesk服务端&…...

华为HarmonyOS 快速构建各种文本识别应用 -- 通用文字识别

适用场景 通用文字识别,是通过拍照、扫描等光学输入方式,将各种票据、卡证、表格、报刊、书籍等印刷品文字转化为图像信息,再利用文字识别技术将图像信息转化为计算机等设备可以使用的字符信息的技术。 可以对文档翻拍、街景翻拍等图片进行…...

shell作业

计算器 #!/bin/bash num1$1 num2$3 op$2 case $op in"")echo $((num1 num2));;"-")echo $((num1 - num2));;"*")echo $((num1 * num2));;"/")if [ $num2 -ne 0 ]; thenecho $((num1 / num2))elseecho "除数不能为0"fi;;*)…...

css部分

前面我们学习了HTML,但是HTML仅仅只是做数据的显示,页面的样式比较简陋,用户体验度不高,所以需要通过CSS来完成对页面的修饰,CSS就是页面的装饰者,给页面化妆,让它更好看。 1 层叠样式表&#…...

nginx 配置 跨域、压缩、文件下载 、静态文件、防盗链

1.跨域配置 在server模块下 访问如:http://127.0.0.1:8080/static/a.txt #跨域server {listen 8080;server_name localhost;#允许跨域请求的域, *代表所有add_header Access-Control-Allow-Origin *;#允许带上cookie请求add_header Access-Contro…...

SQL教程(1):什么是SQL?有什么用?

如果你是刚接触用户研究的新手,可能会听说过一个词叫做 SQL(Structured Query Language,结构化查询语言),但你可能还不太清楚它是什么,如何使用它,或者为什么它会对你的用户研究有帮助。别担心&…...

c++笔记2

14、c的对象 对象和结构的区别; 结构:包含各种类型的变量; 对象:包含各种函数、和变量; 设计对象的时候引用class关键字创建类,和结构形状差不多; 将变量称之为属性,函数称之为方…...

Xlsxwriter生成Excel文件时TypeError异常处理

在使用 XlsxWriter 生成 Excel 文件时,如果遇到 TypeError,通常是因为尝试写入的值或格式与 XlsxWriter 的限制或要求不兼容。 1、问题背景 在使用 Xlsxwriter 库生成 Excel 文件时,出现 TypeError: “expected string or buffer” 异常。此…...

应用层协议/传输层协议(UDP)

目录 应用层 如何自定义应用层协议? 序列化方式 1.基于行文本的方式来传输 2.基于xml的方式 3.基于json的方式 4.yml的形式 5.protobuffer(pb)形式 传输层 端口号 协议 UDP 校验和 CRC TCP TCP/IP五层协议 应用层 -- 传输层 -- 网络层 -- 数据链路层…...

【Linux】应用层协议—HTTP

一、HTTP协议介绍 请求-响应模型:HTTP (Hyper Text Transfer Protocol) 协议是基于请求和响应的。客户端(如Web浏览器)发送一个HTTP请求到服务器,服务器处理请求后返回一个HTTP响应。 无状态,无连接协议:H…...

使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)

一. 前言 在众多 ECharts 图表类型中,开发者始终绕不开的有各种各样的地图开发,关于地图开发,可能比其他图表相对繁琐一些,其实说简单也简单,说复杂也复杂,其中不乏有层级地图、3D 地图等,感觉…...

双目相机的标定,视差图,深度图,点云生成思路与实现。

该文档记录从双目相机标定到点云生成的所有过程,同时会附上代码。 代码直接能跑。https://github.com/stu-yzZ/stereoCamera 目录 大致思路如下: 一、相机标定 1、相机参数介绍 2、单目相机标定 3、双目相机标定 二、图片畸变矫正 三、极线矫正…...

解决 minio上传文件Service: S3, Status Code: 403

错误信息 [software.amazon.awssdk.services.s3.model.S3Exception: (Service: S3, Status Code: 403, Request ID: 180E9BC04F11312E, Extended Request ID: 81aefed089495c5faf6270c59bea93c9783926f74ef647fe6b17908f0976b557)]分析过程 4XX一般是客户端错误。403表示禁止…...

SpringBoot实战——个人博客项目

目录 一、项目简介 ?二、项目整体架构 数据库模块 后端模块 前端模块 ?三、项目具体展示 ?四、项目的具体实现 1、一些准备工作 ??数据库、数据表的创建 ??设置数据库和MyBatis的配置 ??将前端项目引入到当前项目中 2、登录注册模块 ??实体类的创建 ?…...

OpenCV-平滑图像

二维卷积(图像滤波) 与一维信号一样,图像也可以通过各种低通滤波器(LPF)、高通滤波器(HPF)等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...

nodejs官方文档学习-笔记-1

一、异步工作 process.nextTick(): 回调会在当前操作完成后立即执行,但在事件循环进入下一个阶段之前。它是最先执行的。 Promise.then(): 回调会在 microtask 队列中执行,通常是在当前操作完成后,但在事件循环进入…...

YOLOv7

YOLOv7 是 YOLO 系列的一个重要版本,由 Chien-Yao Wang 和 Alexey Bochkovskiy 等研究人员和开发者提出,继续改进了 YOLOv4 和 YOLOv5 的设计,主要在模型性能、训练效率以及推理速度上进行优化。YOLOv7 进一步优化了 YOLO 系列在速度和精度之…...

汉语唤醒词的模糊判断(Python)

汉语唤醒词的模糊判断【Python】 说明安装库代码Demo其他 说明 这是一个简单的汉语模糊唤醒词的判断器,汉语发音中前后舌以及声母韵母的区别,如果进行精准判断,很容易误判。需要一个模糊判断的逻辑! 安装库 pip install pypinyin代码Demo …...

C语言实例_26之根据输入计算星期几

1. 问题 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。 2. 实现思路 思路一:嵌套if-else语句实现 首先接收用户输入的第一个字母,使用if-else语句进行判断。如果输入的是M&#xff0…...

包管理器npm,cnpm,yarn和pnpm

npm (Node Package Manager) 核心技术与工作原理 依赖解析: 广度优先搜索(BFS):npm 使用 BFS 算法来解析依赖树,尽量扁平化 node_modules 目录以减少重复的依赖项。冲突处理:如果两个包需要同一个依赖的不…...

docker-compose部署skywalking 8.1.0

一、下载镜像 #注意 skywalking-oap-server和skywalking java agent版本强关联,版本需要保持一致性 docker pull elasticsearch:7.9.0 docker pull apache/skywalking-oap-server:8.1.0-es7 docker pull apache/skywalking-ui:8.1.0二、部署文件docker-compose.yam…...

Android -- [SelfView] 自定义多行歌词滚动显示器

Android – [SelfView] 自定义多行歌词滚动显示器 流畅、丝滑的滚动歌词控件* 1. 背景透明;* 2. 外部可控制进度变化;* 3. 支持屏幕拖动调节进度(回调给外部);效果 歌词文件(.lrc) 一. 使用…...

记事本建java及java命名规范

1.桌面开发:c# 2. 记事本建java: 以class的名称(类名)为名,名称.java 编译jdk:javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容:cat 名称.java java 的命名规范 大驼峰(每个单词首…...

Elasticsearch scroll 之滚动查询

Elasticsearch scroll 之滚动查询 Elasticsearch 的 Scroll API 是一种用于处理大规模数据集的机制,特别是在需要从索引中检索大量数据时。通常情况下,Elasticsearch 的搜索请求会有一个结果集大小的限制 (fromsize 的检索数量默认是 10,000 条记录)&am…...

cartographer建图与定位应用

文章目录 前言一、安装cartographer1.安装环境2.源码编译2.1 下载2.2 编译 二、gazebo仿真2d建图0.准备仿真环境1.编写lua文件2.编写启动文件3.建图保存 三、cartographer定位 move_base导航3.1 编写启动文件3.2 启动launch 总结 前言 本文介绍cartographer在ubuntu18.04下的…...

CEEMDAN-CPO-VMD二次分解(CEEMDAN+冠豪猪优化算法CPO优化VMD)

CEEMDAN-CPO-VMD二次分解(CEEMDAN冠豪猪优化算法CPO优化VMD) 目录 CEEMDAN-CPO-VMD二次分解(CEEMDAN冠豪猪优化算法CPO优化VMD)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 首先运用CEEMDAN对数据进行一次分解&#xff…...