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

多模态论文笔记——NaViT

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文NaViT(Native Resolution ViT),将来自不同图像的多个patches打包成一个单一序列——称为Patch n’ Pack——从而实现可变分辨率并保持长宽比。在训练过程中采用序列封装的方式处理任意分辨率和纵横比的输入,除了具备灵活性的模型应用外,还展示了通过大规模监督和contrastive image-text pretraining来提高训练效率。

在这里插入图片描述

文章目录

    • 论文
    • 摘要
    • 1. 引言
    • 2. 方法
      • 2.1 架构变化
      • 2.2 训练变化
      • 2.3 NaViT的效率
    • 3. 实验
      • 3.1 提高训练效率和性能
      • 3.2 可变分辨率的好处
      • 3.3 可变标记丢弃的好处
      • 3.4 位置嵌入
      • 3.5 NaViT性能的其他方面
      • 3.6 其他下游任务
    • 4. 相关工作
    • 5. 结论和未来工作
  • 热门专栏
    • 机器学习
    • 深度学习

论文

论文名:Patch n’ Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution
论文链接:https://arxiv.org/pdf/2307.06304

摘要

  1. 现有问题与研究背景:将图像调整为固定分辨率,再用计算机视觉模型(如训练视觉生成模型)处理的普遍做法存在缺陷,但尚未被有效解决。视觉Transformer(ViT)能进行灵活的序列建模,可处理不同长度输入序列
  2. NaViT模型:作者利用ViT特性开发了NaViT(原生分辨率ViT),训练时采用序列打包技术(Patch n’ Pack),可处理任意分辨率和宽高比的输入图像
  3. 模型优势
    • 训练效率:在大规模监督和对比图像文本预训练中,NaViT训练效率显著提升。
    • 任务迁移:能高效迁移到图像和视频分类、目标检测、语义分割等标准任务。
    • 性能表现:在鲁棒性和公平性基准测试中结果更优;推理时可通过输入分辨率灵活性权衡成本和性能。
  4. 研究意义:NaViT突破了传统卷积神经网络标准输入和建模管道的限制为视觉Transformer发展开辟新方向

ViT 参考历史文章:多模态论文笔记——ViT、ViLT

1. 引言

视觉Transformer(ViT)简单、灵活且可扩展的特性,使其几乎普遍地取代了基于卷积的神经网络。该模型的基础是一个简单操作:将图像分割成小块(patch),每个patch被线性投影成一个标记(token)。通常情况下,输入图像会被调整为固定的正方形宽高比,然后分割成固定数量的patch最近的一些研究探索了这一范式的替代方案:

  • FlexiViT(Beyer等人,2023)架构:通过支持多种块尺寸随机采样技术实现序列长度与计算成本的调整
  • Pix2Struct(Lee等人,2022):引入了另一种补丁方法,该方法保留了图像的宽高比,这在图表和文档理解等任务中特别有用。

作者在本文提出NaViT采用Patch n’ Pack技术,把不同图像的多个patch打包到一个序列,能在保留宽高比的同时支持可变分辨率,灵感来自自然语言处理中的示例打包技术。

作者证明:

  1. 在训练时随机采样分辨率可显著降低训练成本
  2. NaViT在广泛的分辨率范围内都能实现高性能,在推理时可实现平滑的成本 - 性能权衡,并且可以以较低成本适配新任务。
  3. 示例打包实现的固定批次形状带来了新的研究思路,如保持宽高比的分辨率采样、可变的标记丢弃率和自适应计算。

NaViT性能对比如下:
在这里插入图片描述

  • 性能比较:在固定计算预算下,NaViT性能始终优于ViT,用四分之一计算量的NaViT能达到最佳ViT的表现(见图1左)。
  • 性能优势原因:NaViT性能更优主要是因为训练示例数量大幅增加。示例打包、可变分辨率输入和可变标记丢弃,使NaViT - L/16训练时处理图像数量是ViT的五倍(见表2)。
  • 微调效率:NaViT在微调过程中也展现出效率提升(见图1中)。
  • 推理优势:预训练和微调时接触多种分辨率,让NaViT在不同分辨率评估时性能出色,在推理成本上优势显著(见图1右)。

NaViT的训练和适应效率,以及灵活的推理能力,为视觉Transformer开辟了一条充满前景的道路。Patch n’ Pack技术使计算机视觉系统能够超越当前数据和建模流程所带来的限制,让那些此前受固定批次形状约束而无法实现的想法成为可能,为创新和发展开启了新的可能性

2. 方法

图像尺寸问题

  1. 深度神经网络训练与图像尺寸的关系:深度神经网络训练和运行依赖批量输入,为了在当前硬件上高效处理,需固定批量形状,这使得计算机视觉应用中图像大小也被固定。
  2. 现有图像尺寸处理方法的问题:受卷积神经网络架构限制,常采用图像调整大小填充为固定尺寸的方法,但这两种方法存在缺陷,调整大小会损害性能,填充则效率低下。
  3. 图像宽高比分析结果:对ImageNet、LVIS和WebLI等代表性数据集的图像宽高比分析(如下图3)显示,多数图像并非正方形。
    在这里插入图片描述

本文解决方案

  • 语言建模常见做法:在语言建模里,通过示例打包把多个不同示例的标记组合到一个序列,以此绕过固定序列长度限制,能显著加速语言模型训练(Krell等人,2021 )。
  • 视觉建模处理方案:通过将图像视为小块(patches)序列,作者发现ViT 也可以从相同的范式中受益,这种技术被称为Patch n’ Pack。借助 Patch n’ Pack 技术,ViT 能够直接在图像的 “原生” 分辨率下进行训练,该训练方法被命名为 NaViT。

2.1 架构变化

在这里插入图片描述

图2:示例打包技术支持可变分辨率保持宽高比的图像输入,能减少训练时间、提升性能并增加灵活性。此处展示了为支持Patch n’ Pack技术,在数据预处理建模方面需要进行的修改。网络中的逐位置操作,如多层感知器(MLPs)、残差连接和层归一化等,无需改变。

NaViT基于原始的视觉Transformer(ViT)构建,但原则上可以使用任何对补丁序列进行操作的ViT变体。为了实现Patch n’ Pack技术,作者进行了以下架构修改:

  • 掩码自注意力和掩码池化:为了防止不同示例之间相互关注,作者引入了额外的自注意力掩码。类似地,在编码器之上进行掩码池化,目的是对每个示例内的标记表示进行池化,从而在序列中为每个示例生成单个向量表示。图2展示了如何通过掩码控制注意力的感受野。
  • 分解式和分数式位置嵌入:为了处理任意分辨率和宽高比,需要重新审视位置嵌入。对于分辨率为 R × R R×R R×R的正方形图像,具有patch尺寸 P P P的普通ViT的位置编码为可学习的1D位置嵌入,长度为 ( R / P ) 2 (R/P)^2 (R/P)2。在更高分辨率 R R R进行训练或评估时,需要对这些嵌入进行线性插值

Pix2struct(Lee等人,2022年)引入了可学习的二维绝对位置嵌入。通过这种方式,可以学习尺寸为[maxLen, maxLen) 的位置嵌入,并使用每个补丁的(x, y) 坐标进行索引。这使得宽高比可变,分辨率最高可达R = P · maxLen。然而,在训练过程中必须看到(x, y) 坐标的每一种组合。

为了支持可变宽高比并能轻松外推到未见过的分辨率,作者引入了分解式位置嵌入,将其分解为 x x x y y y坐标的单独嵌入 ϕ x \phi_x ϕx ϕ y \phi_y ϕy。然后将它们相加(在3.4节中探索了其他组合策略)。考虑了两种模式:

  • 绝对嵌入,其中 ϕ ( p ) : [ 0 , m a x L e n ] → R D \phi(p):[0, maxLen] \to \mathbb{R}^{D} ϕ(p):[0,maxLen]RD是绝对patch索引的函数;
  • 分数嵌入,其中 ϕ ( r ) : [ 0 , 1 ] → R D \phi(r):[0, 1] \to \mathbb{R}^{D} ϕ(r):[0,1]RD r = P / s i d e − l e n g t h r = P / side - length r=P/sidelength的函数,即沿着图像的相对距离。

后者提供了与图像大小无关的位置嵌入参数,但会部分模糊原始宽高比,而原始宽高比仅隐含在patch数量中。作者考虑简单的可学习嵌入 ϕ \phi ϕ、正弦嵌入以及NeRF(Tancik等人,2020)中使用的可学习傅里叶位置嵌入。

2.2 训练变化

Patch n’ Pack使得在NaViT的训练过程中可以使用一些新技术。

  • 连续标记丢弃:标记丢弃(在训练期间随机省略输入图像块)已被用于加速训练。然而,通常情况下,所有样本丢弃的标记比例相同;而打包技术实现了连续标记丢弃,即每张图像的标记丢弃率可以不同。这既能通过丢弃标记实现更快的处理速度,又能保留部分完整图像,从而减少训练与推理之间的差异。此外,借助打包技术,丢弃分布可以在整个训练过程中按照预先设定的计划发生变化。3.3节将探究不同的计划安排以及灵活标记丢弃的益处。
  • 分辨率采样:NaViT可以使用每个图像的原始分辨率进行训练。或者,也可以在保持宽高比的同时对总像素数进行重采样。NaViT更加灵活,它允许通过从图像大小分布中采样来进行混合分辨率训练,同时保留每个图像的原始宽高比。这既提高了处理速度,又能接触到更大的图像,与同等的ViT相比(在模型大小和训练时长方面),性能有了显著提升。3.2节探索了不同的采样策略,以及预训练和微调中的可变分辨率训练。

    普通ViT中,更高的处理速度(在较小图像上训练)和更高的性能(在较大图像上训练,以便在评估时实现高分辨率)之间存在矛盾。通常情况下,模型在较低分辨率下进行预训练,在较高分辨率下进行微调(Touvron等人,2019)

2.3 NaViT的效率

这里讨论Patch n’ Pack对NaViT计算效率的一些影响。
在这里插入图片描述

图4:假设每张图像有256个标记,由于打包而产生的额外注意力负担;这种负担会随着模型规模的增大而减小。

  • 自注意力成本:当将多个图像打包成长序列时,注意力的 O ( n 2 ) O(n^2) O(n2)成本是一个自然的问题。尽管许多工作旨在消除这种二次缩放(Tay等人,2022,2020),但作者在此证明,随着Transformer隐藏维度的增加,注意力在总成本(包括MLP的计算成本)中所占的比例越来越小。图4展示了这一趋势,表明与打包示例相关的开销相应减少。除了速度方面的考虑,自注意力的内存成本对于极长序列也是一个挑战。然而,这个问题也可以通过采用内存高效的方法(Rabe和Staats,2021;Dao等人,2022)来解决。
  • 打包和序列级填充包含多个示例的最终序列长度必须固定。作者使用附录A.3中讨论的贪心打包方法;通常情况下,不存在恰好能组合成固定长度的示例,因此必须使用填充标记。例如,可以动态地选择序列中最后一个示例的分辨率或标记丢弃率,以恰好填充剩余的标记;作者发现通常填充标记的比例不到2%,因此这种简单的方法就足够了。
  • 填充示例和对比损失:对于打包后的序列基于每个标记的损失很容易实现。然而,许多计算机视觉模型是通过示例级损失进行训练的,这种损失通常应用于池化表示。首先,这需要对典型的池化层进行修改,以适应打包操作。其次,必须从每个序列中提取多个池化表示。固定的批量形状要求我们做出这样的假设:从B个序列的批量中,我们最多提取 B × E m a x B×E_{max} B×Emax个池化表示(即每个序列最多 E m a x E_{max} Emax个示例)。如果一个序列包含超过 E m a x E_{max} Emax张图像,多余的图像将被丢弃,这会浪费模型编码器的计算资源。如果一个序列的示例少于 E m a x E_{max} Emax个,那么损失计算将处理大量虚假的填充表示。

后者(如果一个序列的示例少于 E m a x E_{max} Emax个)在对比学习中是一个问题,因为损失计算在时间和内存上的复杂度为 O ( n 2 ) O(n^2) O(n2)。为了避免这个问题,作者使用了分块对比损失(Mustafa等人,2023),它通过在本地设备子集上进行计算,并有效地累积全局softmax归一化所需的统计信息,避免了收集所有数据点进行softmax计算的需求。这使得可以使用较高的 E m a x E_{max} Emax值(从而有效利用模型编码器),而不会受到损失计算的瓶颈限制。

3. 实验

  • NaViT架构:基于普通ViT,融入2.1节支持打包的修改,还纳入查询 - 键归一化、省略偏差及注意力池化等改进。
  • 预训练设置:在JFT - 4B上分类训练,在WebLI上进行对比语言 - 图像训练;预训练时通常对JFT数据集应用Inception裁剪,而NaViT模型预训练不做此操作并保留图像宽高比。
  • 实现框架:使用JAX和FLAX库,基于Scenic构建。

3.1 提高训练效率和性能

  • 性能对比:图1展示不同NaViT模型在JFT预训练性能,并与计算量匹配的ViT基线模型对比。在不同计算量和参数规模下,NaViT在相同计算预算时性能优于ViT,如性能最佳的ViT性能,NaViT可用四分之一计算量达到,最小计算量的NaViT比对应ViT成本效益高五倍。附录A.1有实验设置详情。
  • 性能提升因素:NaViT因保留宽高比、多分辨率评估受益,主要得益于在计算预算内显著增加处理的训练示例数量,通过可变分辨率示例采样与标记丢弃结合,得到可变大小图像,高效打包成类似原始模型的序列长度,后续将对这些因素进行消融实验。

3.2 可变分辨率的好处

  • NaViT “有效分辨率”:因保留原生宽高比,NaViT的“分辨率”指与给定分辨率正方形图像面积相同的图像,即“有效分辨率”,推理成本与同面积正方形图像上的普通ViT相同。

  • 可变分辨率预训练

    • 低分辨率图像处理FLOPs少,固定分辨率训练存在处理速度与处理高分辨率图像细节能力的权衡。
    • NaViT可混合低、高分辨率图像,发挥两者优势。
    • 图5对比两种NaViT变体在不同分辨率下的训练情况(同FLOPs),一种是固定分辨率 R = R m a x R = R_{max} R=Rmax ,另一种是可变分辨率 R ∼ U ( 64 , R m a x ) R \sim U(64, R_{max}) RU(64,Rmax),结果显示可变分辨率模型性能优于单一分辨率训练模型,在固定分辨率最佳情况(训练与评估分辨率相同)下,可变分辨率模型性能相当或更优。
  • 可变分辨率微调:

    • 过往方法:先前研究在预训练后期或微调时提高分辨率,虽提升质量但成本增加。
    • 实验操作:对NaViT和ViT在不同固定分辨率下微调,同时对NaViT进行可变分辨率微调。
    • 实验结果:在ImageNet - 1k数据集微调预训练模型,预训练性能提升在各分辨率下转移良好,且有两个关键发现:一是可变分辨率微调的NaViT(“NaViT 64:512”)与单一分辨率微调的NaViT性能相当且优于单一分辨率的ViT,无需选定单个下游微调分辨率;二是低分辨率(64)微调的NaViT在高分辨率评估时性能良好,实现经济适配,证实相关研究成果。
  • 分辨率采样策略:

    • 采样方式:示例打包使多种分辨率采样策略可行,可选择对目标边长(平均高/宽, R R R)或目标面积(序列长度 R 2 R^2 R2)采样,均匀分布采样边长偏向低序列长度,采样面积偏向高边长。
    • 具体操作:从支持范围[-1, 1]的分布 D D D为每个图像采样 u u u,线性缩放 u u u到[64, 384]采样边长,或到 [ 6 4 2 , 38 4 2 ] [64^2, 384^2] [642,3842]采样面积。考虑四种分布 D D D:均匀分布 U ( − 1 , 1 ) U(-1, 1) U(1,1)、截断标准正态分布 N t ( 0 , 1 ) N_t(0, 1) Nt(0,1)、偏向低分辨率的 N t ( − 0.5 , 1 ) N_t(-0.5, 1) Nt(0.5,1)和偏向高分辨率的 N t ( 0.5 , 1 ) N_t(0.5, 1) Nt(0.5,1)
    • 结果结论:图7表明最佳分辨率重采样策略优于默认分辨率,直接采样边长优于采样面积,偏向较低值的截断正态分布最佳,二者都通过优先采样小序列提高处理速度。

3.3 可变标记丢弃的好处

在这里插入图片描述

  1. 标记丢弃策略
    • 实验了连续采样的标记丢弃率和与分辨率相关的标记丢弃率(具体解释见附录A.4)。
    • 图9a显示,从Beta分布采样的可变丢弃率比恒定丢弃率性能更好。
    • 图9b表明,对于训练分辨率 R ∼ U ( 64 , 384 ) R \sim U(64, 384) RU(64,384) 且丢弃率在 [ 0.5 − δ , 0.5 + δ ] ∝ R [0.5 - \delta, 0.5 + \delta] \propto R [0.5δ,0.5+δ]R 范围内缩放的模型,与分辨率相关的标记丢弃率相比Beta分布能进一步提升性能。
  2. 调度标记丢弃率
    • 打包操作便于在训练中改变标记丢弃率。
    • 通过调整丢弃率可平衡处理图像数量与单张图像信息利用,在不改变总训练成本下最大化最终准确率。
    • 依据已处理图像数量改变丢弃率(细节见附录A.5),图8显示在NaViT - B/16的JFT预训练中,降低标记丢弃率能提升性能。

3.4 位置嵌入

在这里插入图片描述

图10:分解式位置嵌入提升了对新分辨率和宽高比的泛化能力。(a) 各分辨率下的最佳准确率(浅色)和平均准确率(深色)。(b) 相对于分辨率256归一化后的准确率。

  1. 评估对象与关注点:对2.1节引入的分解式嵌入及其设计选择进行评估,既关注绝对性能,也关注模型对训练分辨率范围外分辨率的外推能力。
  2. 实验设置
    • 在JFT上对NaViT - B/16模型训练200,000步,训练分辨率为 R ∼ U ( 160 , 352 ) R \sim U(160, 352) RU(160,352)
    • 将其与在固定分辨率256下训练相同数量图像的ViT - B/16模型对比,后者在新分辨率评估时采用标准位置嵌入插值方法。
  3. 实验结果(图10)
    • 分解式方法性能优于基线ViT模型和Pix2struct中的学习型2D嵌入。
    • Pix2struct中的学习型2D嵌入在泛化到更高分辨率时存在困难,可能因需大量未见过的 ( x , y ) (x, y) (x,y) 对。
    • 分解式嵌入以相加方式组合效果最佳。

3.5 NaViT性能的其他方面

  1. 分布外泛化
    • 评估方式:用JFT预训练的NaViT模型直接在下游数据集评估,包括ImageNet及其鲁棒性变体数据集,与计算量匹配的ViT基线模型对比。
    • 结果:图11显示NaViT在各数据集表现出色,在ImageNet - A上远超ViT,但在ObjectNet上优势缩小,可能因保持宽高比的中心裁剪对两数据集作用不同,不裁剪时差异更显著(附录图20)。
  2. 校准
    • 评估内容:对ImageNet1K微调的模型,量化计算不确定性质量,计算改变每示例补丁数量时顶级预测的预期校准误差。
    • 结果:当每图像补丁数量在[128, 1024]变化时,校准误差在(0.045, 0.047)稳定,无需事后校准(附录E详细)。
  3. 推理权衡
    • 评估内容:鉴于模型灵活性,探讨在给定计算预算下最大化总体准确率的方法,通过Cloud TPUv3芯片延迟量化。在线推理需确定为每个示例分配固定数量标记的算法。
    • 结果:图1显示NaViT比ViT权衡更好,收益递减明显,少量补丁也有竞争力。附录C研究级联方法提供帕累托最优模型和更多权衡机会。
  4. 公平性信号标注
    • 研究目的:探究NaViT能否克服公平性信号标注中因标注不准影响组校准等指标的问题。
    • 实验方法:在FairFace和CelebA数据集训练标注员作为线性探针,用NaViT或ViT冻结特征,比较准确率。
    • 实验结果
      • NaViT提供更高质量表示,处理正方形图像时提高公平性信号标注准确率,Wilcoxon符号秩检验验证显著( p = 3 × 1 0 − 4 p = 3×10^{-4} p=3×104 )。
      • 应用Inception风格裁剪后调整图像面积,NaViT保持原始宽高比提高准确率,95%置信水平下显著( p = 0.02 p = 0.02 p=0.02 )。附录G有完整图表。

3.6 其他下游任务

  1. 语义分割
    • 实验设置:在ADE20k数据集对NaViT进行语义分割微调,遵循Segmenter线性解码器协议,以ViT - L/16为基线,两模型在JFT - 4B预训练且计算预算可比。微调时,ViT输入随机正方形裁剪( R m a x × R m a x R_{max}×R_{max} Rmax×Rmax),NaViT输入随机调整大小(保持宽高比,总像素数 R m a x 2 R_{max}^2 Rmax2),评估在原始分辨率进行。
    • 实验结果:图13显示,相同最大微调分辨率 R m a x R_{max} Rmax时,NaViT性能优于ViT,如 R 384 R_{384} R384的NaViT速度比 R 512 R_{512} R512的ViT快两倍且性能更优。NaViT优势在于训练分辨率灵活,可处理不同形状图像。
  2. 目标检测
    • 实验设置:使用计算量匹配的NaViT和ViT作为OWL - ViT - L/14目标检测器骨干,遵循其训练和评估协议。
    • 实验结果:表1表明,基于NaViT的检测器在常见和未见的LVIS “罕见” 类别上表现更优。虽预训练时间短导致绝对性能低,但相对差异显示NaViT为细粒度视觉任务提供强大表示。
  3. 视频分类
    • 实验设置:因Transformer处理视频有挑战,NaViT可不同分辨率和时间长度训练以缓解。通过提取三个时空补丁 “tubelets” 对JFT训练的NaViT进行Kinetics400分类微调,扩展位置嵌入含时间维度,用 “中心帧嵌入” 初始化嵌入内核。
    • 实验结果:NaViT - L在约少6倍训练轮数下,与ViViT - L(80.4%)性能相当,且无需多裁剪评估。使用的Kinetics400数据集数据量少于先前工作。

4. 相关工作

  1. 灵活的视觉Transformer
    • FlexiViT开发新颖内核调整大小方法,借支持多种补丁大小的模型实现可变“分辨率”,并研究其与蒸馏和神经架构搜索的关系。
    • Pix2struct通过新位置嵌入模式支持可变宽高比,在非自然图像任务中展现显著效率和性能提升。
  2. 多尺度视觉Transformer
    • 在分割、检测等定位任务中,使用多空间尺度特征图常见,不少工作开发类似视觉Transformer,但也有人对简单定位任务使用该方法的必要性存争议。
    • NaViT未构建层次化多尺度表示,认为结合自身独特灵活性与该模型家族优势有研究潜力。
  3. 混合分辨率加速训练
    • 多数考虑分辨率的图像建模工作聚焦用固定低分辨率加速预训练,如FixRes在预训练后期提高分辨率,后续很多工作沿用,但该方法不可逆,调高分辨率后无法降分辨率减少计算量。
    • 多网格训练通过在训练早期用“粗糙”时空分辨率大批量数据,后期用“精细”分辨率加速视频建模,需分层网格采样调度和学习率缩放。相比之下,Patch n’ Pack整合混合分辨率更轻松,无需复杂调度或训练管道。
  4. 标记丢弃提高效率
    • 早期研究探索随机标记丢弃,后续研究表明结构化或基于“重要性”的策略有优势。
    • Patch n’ Pack避开固定小批量形状限制,而此前相关研究受此制约。

5. 结论和未来工作

作者通过本文证明,Patch n’ Pack,即简单地将序列打包应用于视觉Transformer,能够显著提高训练效率。由此产生的NaViT模型在推理时可以应用于多种分辨率,并且可以低成本地适配新任务。Patch n’ Pack开启了许多之前因需要固定批次形状而受阻的研究方向,包括自适应计算以及提高训练和推理效率的新算法。

热门专栏

机器学习

机器学习笔记合集

深度学习

深度学习笔记合集

相关文章:

多模态论文笔记——NaViT

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文NaViT(Native Resolution ViT),将来自不同图像的多个patches打包成一个单一序列——称为Patch n’ Pack—…...

AI大模型开发原理篇-5:循环神经网络RNN

神经概率语言模型NPLM也存在一些明显的不足之处:模型结构简单,窗口大小固定,缺乏长距离依赖捕捉,训练效率低,词汇表固定等。为了解决这些问题,研究人员提出了一些更先进的神经网络语言模型,如循环神经网络、…...

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统,openipc 是采用buildroot系统编译而成,因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢?因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来,从而…...

C++ Primer 自定义数据结构

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...

Kanass快速安装配置教程(入门级)

Kanass是一款国产开源免费的项目管理工具,工具简洁易用、开源免费,本文将介绍如何快速安装配置kanass,以快速上手。 1、快速安装 1.1 Linux 安装 点击官网 -> 演示与下载 ->下载,下载Linux安装包,…...

【自然语言处理(NLP)】基于Transformer架构的预训练语言模型:BERT 训练之数据集处理、训练代码实现

文章目录 介绍BERT 训练之数据集处理BERT 原理及模型代码实现数据集处理导包加载数据生成下一句预测任务的数据从段落中获取nsp数据生成遮蔽语言模型任务的数据从token中获取mlm数据将文本转换为预训练数据集创建Dataset加载WikiText-2数据集 BERT 训练代码实现导包加载数据构建…...

深度解析:网站快速收录与网站安全性的关系

本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/58.html 网站快速收录与网站安全性之间存在着密切的关系。以下是对这一关系的深度解析: 一、网站安全性对收录的影响 搜索引擎惩罚: 如果一个网站存在安全隐患&am…...

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中,网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力,成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本,该脚本集成了 ARP 扫描、端口扫描以及 TCP…...

MySQL索引详解

MySQL索引详解 什么是索引索引的原理索引的分类索引的数据结构二叉树平衡二叉树B树B树 聚集索引与非聚集索引概念利用聚集索引查找数据利用非聚集索引查找数据覆盖索引与回表操作 如何正确使用索引 什么是索引 索引是存储引擎中一种数据结构,或者说数据的组织方式&…...

【NEXT】网络编程——上传文件(不限于jpg/png/pdf/txt/doc等),或请求参数值是file类型时,调用在线服务接口

最近在使用华为AI平台ModelArts训练自己的图像识别模型,并部署了在线服务接口。供给客户端(如:鸿蒙APP/元服务)调用。 import核心能力: import { http } from kit.NetworkKit; import { fileIo } from kit.CoreFileK…...

【Qt】界面优化

界面优化 设置全局样式样式文件使⽤ Qt Designer 编辑样式选择器设置子控件样式伪类选择器样式属性盒模型设置按钮样式设置复选框样式输入框样式列表样式菜单栏样式 在 Qt 中对界面的优化和 CSS 类似。语法结构如下: 选择器 {属性名: 属性值; }例如: QP…...

机器学习算法在网络安全中的实践

机器学习算法在网络安全中的实践 本文将深入探讨机器学习算法在网络安全领域的应用实践,包括基本概念、常见算法及其应用案例,从而帮助程序员更好地理解和应用这一领域的技术。"> 序言 网络安全一直是信息技术领域的重要议题,随着互联…...

课题介绍:基于惯性与单目视觉信息融合的室内微小型飞行器智能自主导航研究

室内微小型飞行器在国防、物流和监测等领域中应用广泛,但在复杂的非合作环境中实时避障和导航仍面临诸多挑战。由于微小型飞行器的载荷和能源限制,迫切需要开发高效的智能自主导航系统。本项目旨在研究基于惯性导航与单目视觉信息融合的技术,…...

Observability:实现 OpenTelemetry 原生可观察性的商业价值

作者:来自 Elastic David Hope 利用开放标准和简化的数据收集转变组织的可观察性策略。 现代组织面临着前所未有的可观察性挑战。随着系统变得越来越复杂和分散,传统的监控方法难以跟上步伐。由于数据量每两年翻一番,系统跨越多个云和技术&am…...

nginx 报错404

404:服务器无法正常解析页面,大多是配置问题(路径配置错误)、或访问页面不存在 如果你也是用nginx来转接服务的话,那你有可能碰到过这种情况,当你启动服务后,在本地打开页面,发现404,然后你找遍…...

2.2.1 人眼色觉与色度图

文章目录 人眼色觉色度图 人眼色觉 视网膜上的视杆细胞、视锥细胞在人眼色觉中起到重要作用。视杆细胞主要用在弱光暗环境下,其数量远远多于视锥细胞。视锥细胞负责明亮环境的视觉,有L,M,S三种类型的细胞,分别对长、中、短波长敏感&#xff0…...

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争:拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下,网络已然成为人类社会运转的关键基础设施,深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…...

c语言(关键字)

前言&#xff1a; 感谢b站鹏哥c语言 内容&#xff1a; 栈区&#xff08;存放局部变量&#xff09; 堆区 静态区&#xff08;存放静态变量&#xff09; rigister关键字 寄存器&#xff0c;cpu优先从寄存器里边读取数据 #include <stdio.h>//typedef&#xff0c;类型…...

眼见着折叠手机面临崩溃,三星计划增强抗摔能力挽救它

据悉折叠手机开创者三星披露了一份专利&#xff0c;通过在折叠手机屏幕上增加一个抗冲击和遮光层的方式来增强折叠手机的抗摔能力&#xff0c;希望通过这种方式进一步增强折叠手机的可靠性和耐用性&#xff0c;来促进折叠手机的发展。 据悉三星和研发可折叠玻璃的企业的做法是在…...

Excel to form ?一键导入微软表单

一句话痛点 “你的Excel越强大&#xff0c;手动复制到Forms就越痛苦。” 合并单元格崩溃成乱码、下拉菜单变纯文本、条件逻辑消失无踪——这些不是技术问题&#xff0c;而是低效工作模式的死刑判决书。 直击解决方案&#xff1a;3分钟&#xff0c;3步&#xff0c;300%效率 1…...

使用Ollama本地化部署DeepSeek

1、Ollama 简介 Ollama 是一个开源的本地化大模型部署工具&#xff0c;旨在简化大型语言模型&#xff08;LLM&#xff09;的安装、运行和管理。它支持多种模型架构&#xff0c;并提供与 OpenAI 兼容的 API 接口&#xff0c;适合开发者和企业快速搭建私有化 AI 服务。 Ollama …...

【xdoj-离散线上练习】T251(C++)

解题反思&#xff1a; 开始敲代码前想清楚整个思路比什么都重要嘤嘤嘤&#xff01;看到输入m, n和矩阵&#xff0c;注意不能想当然地认为就是高m&#xff0c;宽n的矩阵&#xff0c;细看含义 比如本题给出了树的邻接矩阵&#xff0c;就是n*n的&#xff0c;代码实现中没有用到m这…...

【数据结构】_链表经典算法OJ(力扣/牛客第二弹)

目录 1. 题目1&#xff1a;返回倒数第k个节点 1.1 题目链接及描述 1.2 解题思路 1.3 程序 2. 题目2&#xff1a;链表的回文结构 2.1 题目链接及描述 2.2 解题思路 2.3 程序 1. 题目1&#xff1a;返回倒数第k个节点 1.1 题目链接及描述 题目链接&#xff1a; 面试题 …...

线性代数复习笔记

1. 课程学习 1.1 3Blue1Brown 线性代数 2. 基本术语 eigenvector&#xff08;特征向量&#xff09;&#xff1a;线性变换中方向保持不变的向量 可以视作3D旋转矩阵形成的旋转的轴...

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC&#xff1b;如果没有找到hex文件&#xff08;在objects文件夹下&#xff09;&#xff0c;在keil中options for target-output- 勾选 create hex file。 如果要修改编程 &#xff1a;重新编译-下载/编程-单片机重…...

用一个例子详细说明python单例模式

单例模式是一种设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。这在需要控制资源&#xff08;如数据库连接、文件系统等&#xff09;的访问时非常有用。 下面是一个使用Python实现单例模式的例子&#xff1a; class Singleton:…...

QT知识点复习

1.qt核心机制 对象树、信号和槽、事件机制 2.对象树的作用 优化了内存回收机制。子对象实例化的时候&#xff0c;被父对象放对象树上&#xff0c;父对象释放内存&#xff0c;子对象也释放内存 3.信号和槽的作用 实现多个组件之间的通讯 4.信号和槽的几种连接方式 1.UI界面提…...

医学图像分割任务的测试代码

测试集进行测试 import os import torch import numpy as np from torch.utils.data import DataLoader from sklearn.metrics import (precision_score,recall_score,f1_score,roc_curve,auc,confusion_matrix, ) import matplotlib.pyplot as plt from utils import NiiData…...

linux下ollama更换模型路径

Linux下更换Ollama模型下载路径指南   在使用Ollama进行AI模型管理时&#xff0c;有时需要根据实际需求更改模型文件的存储路径。本文将详细介绍如何在Linux系统中更改Ollama模型的下载路径。 一、关闭Ollama服务   在更改模型路径之前&#xff0c;需要先停止Ollama服务。…...

手机上运行AI大模型(Deepseek等)

最近deepseek的大火&#xff0c;让大家掀起新一波的本地部署运行大模型的热潮&#xff0c;特别是deepseek有蒸馏的小参数量版本&#xff0c;电脑上就相当方便了&#xff0c;直接ollamaopen-webui这种类似的组合就可以轻松地实现&#xff0c;只要硬件&#xff0c;如显存&#xf…...

第一性原理:游戏开发成本的思考

利润 营收-成本 营收定价x销量x分成比例 销量 曝光量x 点击率x &#xff08;购买率- 退款率&#xff09; 分成比例 100%- 平台抽成- 税- 引擎费- 发行抽成 成本开发成本运营成本 开发成本 人工外包办公地点租金水电设备折旧 人工成本设计成本开发成本迭代修改成本后续内容…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.11 视图与副本:内存优化的双刃剑

2.11 视图与副本&#xff1a;内存优化的双刃剑 目录 #mermaid-svg-OpelXRXip4Xj1A2e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OpelXRXip4Xj1A2e .error-icon{fill:#552222;}#mermaid-svg-OpelXRXip4Xj1A2e .…...

React 封装高阶组件 做路由权限控制

React 高阶组件是什么 官方解释∶ 高阶组件&#xff08;HOC&#xff09;是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分&#xff0c;它是一种基于 React 的组合特性而形成的设计模式。 高阶组件&#xff08;HOC&#xff09;就是一个函数&…...

Python sider-ai-api库 — 访问Claude、llama、ChatGPT、gemini、o1等大模型API

目前国内少有调用ChatGPT、Claude、Gemini等国外大模型API的库。 Python库sider_ai_api 提供了一个完整的解决方案。通过调用 sider.ai 的API&#xff0c;开发者可以实现对这些大模型的访问。 众所周知&#xff0c;sider是一个Chrome&#xff0c;以及Edge的浏览器插件&#xf…...

深入解析 Linux 内核内存管理核心:mm/memory.c

在 Linux 内核的众多组件中,内存管理模块是系统性能和稳定性的关键。mm/memory.c 文件作为内存管理的核心实现,承载着页面故障处理、页面表管理、内存区域映射与取消映射等重要功能。本文将深入探讨 mm/memory.c 的设计思想、关键机制以及其在内核中的作用,帮助读者更好地理…...

git基础使用--3---git安装和基本使用

git基础使用–3–git-安装和基本使用 1. git工具安装 使用git如果不考虑开发工具我们一般需要关注三个点 1.1 git 本地化仓库管理的基础 打开https://git-scm.com/downloads地址下载安装 安装完成后&#xff0c;配置环境变量 配置完打开cmd&#xff0c;输入git --versio…...

Python 网络爬虫实战:从基础到高级爬取技术

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 网络爬虫&#xff08;Web Scraping&#xff09;是一种自动化技术&#xff0c;利用程序从网页中提取数据&#xff0c;广泛…...

【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点

学习PyQt的必要性 PyQt是开发跨平台GUI应用的强大工具&#xff0c;适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求&#xff0c;学习PyQt都具有重要意义。 1. 跨平台GUI开发 跨平台支持&#xff1a;PyQt基于Qt框架&#xff0c;支持Windows、macOS、Linux…...

Web - CSS3基础语法与盒模型

概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性&#xff0c;如段落和行相关属性、字体文本属性。最后阐述了盒子模型&#xff0c;如元素隐藏、行内与块元素转换、…...

【开源免费】基于Vue和SpringBoot的公寓报修管理系统(附论文)

本文项目编号 T 186 &#xff0c;文末自助获取源码 \color{red}{T186&#xff0c;文末自助获取源码} T186&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

成绩案例demo

本案例较为简单&#xff0c;用到的知识有 v-model、v-if、v-else、指令修饰符.prevent .number .trim等、computed计算属性、toFixed方法、reduce数组方法。 涉及的功能需求有&#xff1a;渲染、添加、删除、修改、统计总分&#xff0c;求平均分等。 需求效果如下&#xff1a…...

【tiktok 国际版抖抖♬♬ __ac_signature算法】逆向分析

一开始的参数是没有X-Bogus和 __ac_signature的 先是加密请求参数得到乱码。最终得到X-Bogus 然后请求参数添加了X-Bogus之后再去生成__ac_signature __ac_signature的生成需要用到X-Bogus...

【Linux】动静态库

一、库 静态库 .a[Linux]、.lib[windows] 动态库 .so[Linux]、.dll[windows] 二、静态库使用 如果我们要做一个静态库的话&#xff0c;首先我们需要把我们源文件(.c/.cpp)隐藏起来&#xff0c;头文件(.h)必须暴露出来&#xff0c; 1.我们先要把我们所有的.c文件编译成.o文件…...

《手札·开源篇》从开源到商业化:中小企业的低成本数字化转型路径 ——以Odoo为数据中台低成本实现售前售中一体化

某机电设备有限公司数字化转型案例&#xff1a;以Odoo为数据中台实现售前售中一体化 一、企业背景某机电设备有限公司在机电设备领域历经多年发展&#xff0c;业务广泛&#xff0c;涵盖工业自动化设备、电力设备等产品的销售与服务。随着业务版图不断拓展&#xff0c;企业面临…...

携程Android开发面试题及参考答案

在项目中,给别人发的动态点赞功能是如何实现的? 数据库设计:首先要在数据库中为动态表添加一个点赞字段,用于记录点赞数量,同时可能需要一个点赞关系表,记录用户与动态之间的点赞关联,包括点赞时间等信息。界面交互:在 Android 界面上,为点赞按钮设置点击事件监听器。…...

Python-列表

3.1 列表是什么 在Python中&#xff0c;列表是一种非常重要的数据结构&#xff0c;用于存储一系列有序的元素。列表中的每个元素都有一个索引&#xff0c;索引从0开始。列表可以包含任何类型的元素&#xff0c;包括其他列表。 # 创建一个列表my_list [1, 2, 3, four, 5.0]…...

【LeetCode 刷题】回溯算法-子集问题

此博客为《代码随想录》二叉树章节的学习笔记&#xff0c;主要内容为回溯算法子集问题相关的题目解析。 文章目录 78.子集90.子集II 78.子集 题目链接 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res, path [], []def dfs(start: int) ->…...

31.Word:科技论文的译文审交稿【31】

目录 NO1.2.3​ NO4.5.6 NO7.8样式应用和修改&多级列表​ NO9奇偶页页眉 NO10自动编号&交叉引用 NO11.12 NO1.2.3 另存为/F12&#xff1a;考生文件夹只保留译文内容、格式设置、修订批注&#xff0c;删除其他&#xff1a;删除表格的左列→删除第一行将表格转化成…...

Java序列化详解

1 什么是序列化、反序列化 在Java编程实践中&#xff0c;当我们需要持久化Java对象&#xff0c;比如把Java对象保存到文件里&#xff0c;或是在网络中传输Java对象时&#xff0c;序列化机制就发挥着关键作用。 序列化&#xff1a;指的是把数据结构或对象转变为可存储、可传输的…...

尝试ai生成figma设计

当听到用ai 自动生成figma设计时&#xff0c;不免好奇这个是如何实现的。在查阅了不少资料后&#xff0c;有了一些想法。参考了&#xff1a;在figma上使用脚本自动生成色谱 这篇文章提供的主要思路是&#xff1a;可以通过脚本的方式构建figma设计。如果我们使用ai 生成figma脚本…...