【深度学习】SMILEtrack: SiMIlarity LEarning for Multiple Object Tracking,论文

news2024/11/20 8:47:27

论文:https://arxiv.org/abs/2211.08824
代码:https://github.com/WWangYuHsiang/SMILEtrack

文章目录

  • Abstract
  • Introduction
  • Related Work
    • Tracking-by-Detection
      • Detection method
      • Data association method
    • Tracking-by-Attention
  • Methodology
    • 架构概述
    • 外观相似性学习模块 (SLM)
      • 图像切片注意力(ISA)块
      • Image Slicing
      • The Q-K-V attention block
    • Similarity Matching Cascade (SMC) for Target Tracking
  • Experimental Results
    • Dataset
    • MOT Evaluation Metrics
    • Implementation Details
    • Evaluation Results
    • Ablation study
  • Conclusion

Abstract

多目标跟踪(MOT)在计算机视觉领域得到广泛研究,具有许多应用。基于检测的跟踪(TBD)是一种流行的多目标跟踪范式。TBD包括第一步的目标检测以及后续的数据关联、轨迹生成和更新。我们提出了一种受Siamese网络启发的相似性学习模块(SLM),用于提取重要的目标外观特征,并采用一种有效地结合目标运动和外观特征的方法。

这种设计加强了用于数据关联的目标运动和外观特征建模。我们为我们的SMILEtrack跟踪器的数据关联设计了一个相似性匹配级联(SMC)。SMILEtrack在MOTChallenge和MOT17测试集上分别达到了81.06 MOTA和80.5 IDF1的指标。

Introduction

多目标跟踪(MOT)是计算机视觉中的热门话题,在视频理解中起着至关重要的作用。MOT的目标是估计每个目标的轨迹,并尝试将它们与视频序列中的每一帧关联起来。随着MOT的成功,它可以在社会中广泛应用,例如车辆计算、计算机交互 [25] [12]、智能视频分析和自动驾驶。近年来,基于Tracking-By-Detection (TBD)范式方法的主导和高效的MOT策略 [1] [27] [26] 取得了显著进展。该方法根据检测结果进行跟踪,将问题分解为两个步骤:检测和关联。在检测步骤中,我们需要在单个视频帧中定位感兴趣的对象,在关联步骤中将每个对象与现有轨迹关联或创建新的轨迹。然而,由于模糊的目标、遮挡和复杂的场景,MOT仍面临挑战。

为了完成跟踪系统,解决方案模型可以分为分离检测和嵌入模型(SDE)和联合检测和嵌入模型(JDE)。我们的方法属于SDE;其架构如图1所示。SDE至少需要两个功能组件:一个检测器和一个重新识别模型。

首先,检测器通过边界框在单个帧中定位所有对象。然后,重新识别模型将从每个边界框中提取对象的特征以生成嵌入。最后,将每个边界框与现有轨迹中的一个关联或创建新的轨迹。然而,SDE方法无法实现实时推理速度,因为使用两个单独的模型来检测对象和提取嵌入时需要多次计算。检测器和重新识别模型之间的特征不能共享,SDE方法需要在推理时将重新识别模型应用于每个边界框以提取嵌入。面对这个问题,一个可行的解决方案是集成检测器和重新识别模型。JDE类别 [26] [32] 将检测器和嵌入模型合并到一个单次深度网络中。它可以通过一次推理同时输出检测结果和检测到的边界框的相应外观嵌入。

尽管JDE的成功使MOT任务取得了很高的准确性结果,但我们认为JDE仍然存在一些问题。例如,不同组件之间的特征冲突。我们认为,用于目标检测任务和目标重新识别任务的特征是完全不同的。目标检测任务需要高级特征来识别对象所属的类别,但目标重新识别任务的特征需要更多低级特征来区分同一类别中的不同实例。因此,JDE中的共享特征模型可能降低每个任务的性能。然而,正如我们上面提到的JDE的缺点,SDE可以克服这些缺点,并在MOT领域具有极高的潜力。

最近,基于注意力机制的Transformer [24]被引入到计算机视觉领域,并取得了出色的结果。在多目标跟踪(MOT)问题中,大多数基于Transformer的方法采用CNN + Transformer的框架。这意味着模型首先通过CNN架构提取输入图像特征,然后将这些特征图作为输入传递给Transformer。与基于检测的跟踪方法不同,基于Transformer的方法通过将检测和数据关联部分合并在一起来实现跟踪结果。它可以直接通过单个模型输出轨迹的身份和位置,而无需使用任何额外的轨迹匹配技巧。尽管基于Transformer的方法在特征关注方面具有出色的结果,但在将整个图像输入到Transformer架构时,推理速度仍然存在一定限制。

为了生成高质量的检测和物体外观,我们选择了SDE作为TBD模型,以解决JDE中的特征冲突问题。然而,我们认为大多数特征描述符无法清楚地区分不同对象之间的外观特征。

为了解决这个问题,我们提出了SMILEtrack,它结合了一个检测器和一个类似孪生网络的相似性学习模块(SLM)。受到视觉Transformer [6]的启发,我们创建了一个图像切片注意力块(ISA),它在SLM中使用了注意力机制和图像切片机制。此外,我们创建了一个相似性匹配级联(SMC),用于匹配视频中每帧之间的对象。我们跟踪系统的大致流程如下:首先,我们通过一个称为PRB的检测器预测目标边界框的位置。在获得物体边界框之后,我们通过SMC将边界框与轨迹关联起来。

我们的工作的贡献总结如下:

我们引入了一个名为SMILEtrack的分离检测和嵌入模型,并使用了类似孪生网络的相似性学习模块(SLM),用于学习每个对象之间的相似性。

对于SLM中的特征提取部分,我们构建了一个图像切片注意力块(ISA),它使用了切片方法和Transformer的注意力机制来学习物体的特征。

为了完成轨迹匹配部分,我们构建了一个相似性匹配级联(SMC),用于关联每个帧中的边界框。

在这里插入图片描述

Related Work

Tracking-by-Detection

基于TBD的算法在MOT问题中取得了相当大的成功,并成为MOT框架中最受欢迎的方法。TBD方法的主要任务是关联视频中每个帧之间的检测结果,以完成MOT系统。整个工作可以大致分为两部分。

Detection method

Faster R-CNN [18]是一种两阶段检测器,它使用VGG-16作为主干网络,通过区域建议网络(RPN)来检测边界框。SSD [11]使用了锚点机制来替代RPN,在每个特征图上设置不同大小的锚点以提高检测质量。YOLO系列[15] [16] [17] [2]是一种一阶段方法,它使用特征金字塔网络(FPN)来解决目标检测中的多尺度问题,并在速度和准确性方面表现出色。虽然基于锚点的检测器可以达到出色的性能,但仍然存在一些由锚点引起的问题。例如,基于锚点的检测器很难根据具体情况调整一些锚点的超参数,并且在训练过程中计算锚点的交并比(IOU)需要很多时间和内存。为了克服这些问题,无锚点检测器是另一种选择。CornerNet [9]是一种无锚点方法,它利用热图和角点池化来预测目标的左上角和右下角,然后匹配这两个点来生成物体的边界框。与CornerNet相比,CenterNet [34]通过中心池化和级联角点池化直接预测物体的中心点。YOLOX将YOLO系列从基于锚点的检测器转变为无锚点的检测器,并使用解耦头部来提高检测的准确性。

Data association method

在多目标跟踪(MOT)系统中,需要克服许多挑战,如物体遮挡、拥挤场景和动态模糊。

因此,数据关联方法需要仔细处理。SORT [1]首先使用卡尔曼滤波器根据当前帧的物体位置预测物体的未来位置,然后通过计算检测结果和已有目标的预测边界框之间的IOU距离生成分配成本矩阵。最后,使用匈牙利算法匹配分配成本矩阵。虽然SORT实现了高速推理时间,但由于它不考虑物体外观信息,无法处理长时间遮挡问题或快速移动的物体。

为了解决遮挡问题,Deep SORT [27]应用预训练的CNN模型提取边界框外观特征,然后使用外观特征计算轨迹和检测结果之间的相似度。最后使用匈牙利算法完成分配。

这种方式可以有效减少ID切换次数,但是Deep SORT中的检测模型和特征提取模型是分开的,导致推理速度远非实时。针对这个问题,JDE [26]将检测器和嵌入模型结合在一个一次性网络中,它可以实时运行,与两阶段方法相比准确度也较高。FairMOT [32]展示了锚点引起的不公平问题,它采用了在CenterNet基础上构建的无锚点方法,并在多个数据集(如MOT17 [14])中显著提高了性能。然而,我们认为JDE模型存在一些问题,例如不同组件之间的特征冲突。

与此同时,一些MOT跟踪方法 [21] [22]丢弃了物体外观特征,仅通过应用高性能检测器和运动信息完成跟踪系统。尽管这些方法在MOTChallenge基准测试中可以达到最先进的性能和高推理速度,但我们认为这部分是由于MOTChallenge基准数据集中运动模式的简单性所导致。

此外,不考虑物体外观特征可能导致物体跟踪的准确性在更拥挤的场景中缺乏鲁棒性。

Tracking-by-Attention

借助Transformer在物体检测方面的成功,Trackformer [13]将MOT视为一个集合预测问题,它基于DETR,并添加了对象查询和自回归跟踪查询来进行物体跟踪。

TransTrack [23]基于可变形DETR构建,有两个解码器,一个用于当前帧的检测,另一个用于先前帧的检测。它通过匹配两个解码器之间的检测框来解决跟踪问题。TransCenter [29]是一种基于点的跟踪方法,提出了一个密集的查询特征图,利用变换器对输入图像进行多尺度的MOT跟踪。

Methodology

在本节中,我们介绍了SMILEtrack模型的详细信息,包括相似性学习模块(SLM)和用于每帧框关联的相似性匹配级联(SMC)。

架构概述

SMILEtrack的整体架构如图2所示。我们的框架可以分为以下几个步骤:(1) 目标位置检测:为了定位目标对象的位置,我们采用PRB作为检测器。(2) 数据关联:通过关联相邻帧中的每个对象来解决MOT问题。在由PRB生成的检测结果之后,我们计算每个帧之间的运动亲和矩阵和外观亲和矩阵,然后使用这两个矩阵组合成的成本矩阵,通过匈牙利算法解决线性分配问题。

在这里插入图片描述

外观相似性学习模块 (SLM)

为了实现稳健的跟踪质量,目标的外观信息是不可或缺的。一些跟踪方法已经考虑了目标的外观信息。例如,DeepSORT应用一个简单的CNN构建的深度外观描述符来提取目标的外观特征。虽然外观描述符可以提取有用的外观特征,但我们发现它无法清楚地区分不同对象之间的外观特征。为了提取更具辨别性的外观特征,我们提出了一个类似孪生网络架构的相似性学习模块SLM。SLM的详细信息如图3所示。

在这里插入图片描述

对于SLM的输入,我们同时将两个不同的图像输入到SLM中。它们都将通过§ 3.2.1中的ISA特征提取器,该提取器在两个图像之间共享参数。ISA的架构稍后将进行更详细的介绍。在提取输入图像的特征之后,我们使用一个全连接层来整合这些特征。为了学习一个能够区分各种对象的稳健外观特征,我们应用余弦相似度距离来计算两个图像之间的相似度。

相同对象之间的相似度得分应尽可能高;否则,不同对象之间的相似度得分应接近零。

图像切片注意力(ISA)块

为了生成可靠的外观特征,优秀的特征提取器是必不可少的。虽然Transformer在特征增强方面表现出色,但我们认为将完整的编码器-解码器架构添加到跟踪系统中对模型计算和参数大小来说过于繁重。受到VIT的启发,我们构建了ISA,它应用图像切片技术和注意机制进行特征提取。ISA的详细架构如图4所示。

在这里插入图片描述

Image Slicing

在这里插入图片描述

The Q-K-V attention block

标准的Transformer擅长处理序列之间的长期复杂依赖关系,例如自然语言处理。其中最重要的部分是Transformer中的注意力块。Transformer通过将查询(query)打包成矩阵Q,键(keys)和值(values)打包成矩阵K和V来计算注意力函数。注意力块的计算可以表示为:

Attention(Q, K, V) = softmax(QK^T / sqrt(d_k))V

其中,(d_k) 是每个查询和键的维度,通过对该计算进行缩放可以确保梯度更稳定。

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

Similarity Matching Cascade (SMC) for Target Tracking

物体关联部分对于基于检测的跟踪范式方法非常重要。选择不同的匹配策略将导致完全不同的结果。ByteTrack是一种简单而有效的关联方法。

它保留了每个检测框并将其分为高置信度和低置信度两部分,然后通过IOU距离进行关联。虽然ByteTrack在MOT中达到了最先进的性能,但我们认为这部分是因为MOTChallenge基准数据集中运动模式的简单性。如果只使用关联部分的IOU距离信息,它仍然存在一些问题,例如当目标靠近时会出现id切换问题。为了解决这个问题,我们设计了一种变体关联方法,将ByteTrack和我们的SLM优势相结合。我们方法的匹配流程如图5所示,关联方法的伪代码如补充材料所示。

首先,我们确定当前帧中的所有检测框deti,并按照阈值thres将它们分为Dhigh集合和Dlow集合。对于thres值的设置,我们根据deti中检测d的得分从低到高重新排列,然后计算deti中前一半d的平均得分,并将平均得分设置为thres。在我们得到阈值thres之后,我们将得分高于thres的检测框放入Dhigh,将得分在thres和0.1之间的检测框放入Dlow。我们将得分低于0.1的检测框视为背景或噪声。在分离了检测框之后,我们将丢失的物体列表LL与跟踪列表TL合并,并使用卡尔曼滤波器预测TL中每个物体在当前帧的位置。关联部分主要分为两个阶段。

在这里插入图片描述

(第一阶段)在第一个关联阶段,我们首先关注Dhigh集合。我们计算Dhigh和TL的运动矩阵Mm和外观相似性矩阵Ma。对于运动矩阵Mm,我们计算TL和Dhigh之间的IOU距离。外观相似性矩阵Ma通过SLM计算。然后我们通过我们提出的Gate函数将矩阵Mm和Ma融合成代价矩阵Chigh:

在这里插入图片描述

(第二阶段)在第二个匹配阶段,我们匹配Dlow和TLRemain。Dlow和TLRemain的运动矩阵Mm的计算方式与第一个匹配阶段相同。

对于外观相似性矩阵Ma,我们建立了一个多模板SLM来学习低得分检测和轨迹之间的相似性。在处理低得分检测时,直接使用上一帧中的轨迹特征来计算相似性可能会得到不可靠的得分,因为低得分检测对象的特征与由一些遮挡引起的轨迹不同。

为了解决这个问题,我们应用了一个特征库机制,用于保存不同帧中轨迹的各种特征。第i个轨迹的特征库Fi与低得分第j个检测之间的相似度得分计算如下:

在这里插入图片描述

在得到矩阵Mm和Ma之后,我们将它们融合成代价矩阵Clow,方法与第一个匹配阶段相同,并使用匈牙利算法完成线性分配。Dlow中未匹配的检测和T LRRemain中未匹配的轨迹被放入DRRemain和T LRRemain。

完成物体关联阶段后,我们设置阈值H来初始化新的轨迹。DRemain中得分高于H的未匹配检测可以初始化一个新的轨迹,并将T LRRemain中的未匹配轨迹移动到丢失物体列表LL中。我们将DRRemain中的未匹配检测视为背景。请注意,只有当LL中的轨迹存在超过30帧时,我们才删除LL中的轨迹。

Experimental Results

Dataset

我们在MOTChallenge[14]基准测试集上进行实验。具体而言,我们按照“私有检测”协议对MOT17[14]的测试集进行评估。MOT17是MOTChallenge中最受欢迎的数据集。

它包含了14个视频序列(7个用于训练,另外7个用于测试),其中既有移动摄像头,也有静态摄像头。

其他常见的MOT数据集包括ETH[19]、CalTech[5]、MOT16[14]、CityPerson[31]、CrowdHuman[20]、ETHZ[7]、CUHK-SYSU[28]和PRW[33]。

ETH、MOT16和CityPerson数据集仅提供用于训练检测模型的边界框注释;因此,在训练re-ID和MOT模型的情况下,还需要额外的数据集。CalTech、PRW和CUHKSYSU数据集提供了用于训练re-ID模型的边界框位置和身份注释。

我们将SMILEtrack训练在MOT17训练集、CrowdHuman、ETHZ和Cityperson的组合上。针对消融研究,我们使用训练集的前半部分进行模型训练,使用后半部分进行验证。从MOT17视频序列中裁剪行人图像用于训练我们的SLM re-ID模型。

MOT Evaluation Metrics

标准的MOT评估指标包括多目标跟踪准确度(MOTA)、多目标跟踪精度(MOTP)、身份F1得分(IDF1)、主要跟踪(MT)、主要丢失(ML)、假阳性率(FP)、假阴性率(FN)、ID准确率(IDP)和ID切换次数(IDs)。其中,MOTA和IDF1是最常用的两个指标。MOTA和IDF1的公式如下所示:

在这里插入图片描述

MOTA是由FP、FN和IDs的组合来反映检测性能。相比之下,IDF1更注重身份匹配能力和数据关联性能。

MOTA综合考虑了假阳性(FP)、假阴性(FN)和ID切换次数(IDs),以反映出检测的整体表现。

而IDF1则更加关注身份匹配能力和数据关联的性能,它通过计算ID准确率(IDP)并与ID切换次数(IDs)和真阳性数(FPs)进行综合来评估。

Implementation Details

我们使用 COCO 数据集 [10] 对 PRB [4] 进行训练以进行权重初始化;然后在 MOT16 和 MOT17 数据集上对模型进行微调,以提高人体检测性能。在训练过程中,我们采用了多种数据增强方法,包括 Mosaic [2] 和 Mixup [30]。

在 MOT17 数据集的评估中,我们将 PRB 在 MOT17 训练集、CrowdHuman、ETHZ 和 Cityperson 的组合上进行了 100 个 epoch 的训练。输入图像的尺寸为1440 × 800。我们选择了 SGD 优化器,并将初始学习率设为 10^-3,使用余弦退火调度。

在训练 SLM 时,我们使用了从 MOT17 训练集中裁剪的自有数据集进行训练。由于从 MOT17 中裁剪出的每个行人大小不同,我们将其调整为固定尺寸 224 × 80。我们选择了 SGD 优化器,学习率初始设为 6.5 × 10^-3,使用余弦退火调度。我们使用 MSE [3] 损失函数进行 150 个 epoch 的训练。

对于 SMC 中我们提出的 Gate 函数,我们将阈值 ε 设置为 0.7 以筛选成本矩阵。在线性分配阶段,我们会拒绝那些检测和轨迹之间成本矩阵高于 0.2 的匹配。

对于初始的新对象,我们将阈值 H 设置为 0.7 以筛选检测结果。在用于每个对象的多模板 SLM 中,我们设置了能够存储 50 帧外观的特征库。此外,我们将特征库分为两个类别,即高分模板和低分模板。对于那些具有高置信度分数的检测结果,我们将其外观特征存储在高分模板中;否则,我们将低置信度分数检测结果的外观特征放入低分模板中。

Evaluation Results

表1显示了使用MOTChallenge的“private detector”协议,在MOT17测试集上,SMILEtrack与最先进的跟踪器进行的评估结果。所有结果均使用官方MOTChallenge评估网站生成。SMILEtrack取得了出色的结果,MOTA为80.3,IDF1为77.3。具体而言,我们使用消融研究中的最佳结果作为MOT17评估的模型设置。我们将SLM相似性特征维度设置为256以追踪目标。我们使用IOU和外观信息计算两个SMC匹配阶段的相似性矩阵。Gate函数用于融合IOU和外观信息,多模板SLM用于解决低检测分数的问题。

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

Ablation study

Conclusion

本文提出了SMILEtrack,一种类似孪生网络结构的架构,能够有效地学习用于单摄像头多目标跟踪的物体外观。我们开发了一种相似性匹配级联(SMC)来进行每帧边界框的关联。实验证明,我们的SMILEtrack在MOT17上取得了较高的MOTA、IDF1和IDs性能得分。

未来的工作。由于SMILEtrack是一种分离检测和嵌入(SDE)方法,其运行速度较慢,比不上联合检测和嵌入(JDE)方法。因此,我们将在未来研究中探索能够改善MOT时间与准确性之间平衡的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽配企业为什么需要MES管理系统解决方案

众所周知,汽配组装是汽车制造的关键环节,而汽配行业变革以精益为终极目标。制造业要想脱颖而出,就需要采用MES生产管理系统,以实现制造、物流、质量的精益化管理。在快速的流水线节拍生产下,汽配MES管理系统不仅提高了…

备忘录模式——撤销功能的实现

1、简介 1.1、概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。当前很多软件都提供了撤销(Undo)操作&#xf…

Mybatis引出的一系列问题-Mybatis缓存机制的探究

Mybatis 使用到了两种缓存&#xff1a;本地缓存&#xff08;local cache&#xff09;和二级缓存&#xff08;second level cache&#xff09;。 一级缓存默认是开启的&#xff0c;而且不能关闭&#xff0c;MyBatis的一些关键特性&#xff08;例如通过<association>和<…

亚马逊采集淘宝(实现跨平台电商商品同步)

跨平台电商已成为当前电商行业的发展趋势&#xff0c;亚马逊作为全球的电商平台之一&#xff0c;为了更好地服务消费者&#xff0c;近期开始采集淘宝商品&#xff0c;并实现同步。 1. 亚马逊采集淘宝商品的背景 近年来&#xff0c;随着全球电商市场的不断扩大&#xff0c;跨平…

aspose-words、itextpdf完美解决java将word、excel、ppt、图片转换为pdf文件

我是傲骄鹿先生&#xff0c;沉淀、学习、分享、成长。 如果你觉得文章内容还可以的话&#xff0c;希望不吝您的「一键三连」&#xff0c;文章里面有不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法 面对日常开发过程中&#xff0c;将各种文件转换为pdf文件的…

MQ(一)-MQ理论与消息中间件简介

MQ理论 队列&#xff0c;是一种FIFO 先进先出的数据结构。消息&#xff1a;在不同应用程序之间传递的数据。将消息以队列的形式存储起来&#xff0c;并且在不同的应用程序之间进行传递&#xff0c;这就成了MessageQueue。MQ通常三大作用&#xff1a; 异步、解耦、限流 Spring…

【k8s】二进制部署k8s

二进制部署k8s 1.操作系统初始化配置2.部署etcd集群3.部署docker引擎4.部署Master组件4.部署 Worker Node 组件 二进制搭建 Kubernetes v1.20 k8s集群master01&#xff1a;192.168.80.10 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xf…

前端实现打印1 - 使用 iframe 实现 并 分页打印

目录 打印代码对话框预览打印预览 打印代码 <!-- 打印 --> <template><el-dialogtitle"打印":visible.sync"dialogVisible"width"50%"top"7vh"append-to-bodyclose"handleClose"><div ref"print…

京东API分享:获取京东商品评论接口

接口名称&#xff1a;item_review-获得JD商品评论 接口背景介绍&#xff1a; 京东是一家中国知名的综合性电商平台&#xff0c;成立于1998年。作为中国最大的B2C在线零售商之一&#xff0c;京东提供了包括电子产品、家居用品、服装配饰、食品饮料等在内的广泛商品选择。为了…

防抖函数,定时的清除

什么是防抖函数 在某一个时间段内&#xff0c;一个函数频繁快速的调用&#xff0c;只执行最后一次的调用。 防抖函数实际应用场景 我们在执行一个数据搜索功能时&#xff0c;通过监听input框的值&#xff0c;值变化触发搜索&#xff0c; 如果我们在输入框输入"zhangsa…

使用 Simulink 进行 STM32 编程

目录 介绍 所需材料 步骤 1&#xff1a;在MATLAB中设置STM32-MAT软件路径步骤 2&#xff1a;在STM32CubeMX中创建一个项目步骤 3&#xff1a;配置时钟和 GPIO 引脚步骤 4&#xff1a;项目经理并生成代码步骤 5&#xff1a;在 Simulink 中创建模型步骤 6&#xff1a;在模型中插…

前端如何实现一个网站的桌面快捷方式

题记&#xff1a;我们工作中常常需要在我们的网站首页实现一个桌面快捷方式&#xff0c;那么我们怎么做呢&#xff1f; 图片展示&#xff1a; 代码实现&#xff1a; 第一步&#xff1a;获取路径与标题名&#xff1b; sName: document.title, sUrl: window.location.href 第二步…

Java版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台qt

&#xfeff;Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售…

c++11 标准模板(STL)(std::basic_ofstream)(一)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ifstream : public std::basic_istream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istrea…

【Selenimu+AutoIT】非input标签上传文件(带参数)

工具下载 非input标签上传文件&#xff0c;就需要借助第三方工具&#xff0c;如AutoIT。 AutoIT下载 安装步骤略 使用 1.打开Auto Window Info 找到这个打开 拖住红框里面的标到需要定位的地方记录下来 2.打开SciTE Script Editor 打开后&#xff0c;修改为UTF-8&am…

程序员有必要参加软考吗?

作为程序员&#xff0c;如果一直从事着前线的编程工作&#xff0c;是否会对身体造成负担&#xff0c;难以持续到35岁呢&#xff1f;毕竟在项目赶期时&#xff0c;工作强度很高&#xff0c;而技术也在不断变化&#xff0c;因此很多程序员在30岁前就开始转型。我曾见过很多焦虑自…

观察者模式——对象间的联动

1、简介 1.1、概述 在软件系统中&#xff0c;有些对象之间也存在类似交通信号灯和汽车之间的关系。一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变&#xff0c;它们之间将产生联动&#xff0c;正所谓“触一而牵百发”。为了更好地描述对象之间存在的这种一…

【C++】初阶 --- 引用(超级详细版!!!)

文章目录 &#x1f36a;一、引用的概念&#x1f36a;二、引用的特性&#x1f37f;1、引用在定义时必须初始化&#x1f37f;2、一个变量可以有多个引用&#x1f37f;3、引用一旦引用一个实体&#xff0c;再不能引用其他实体 &#x1f36a;三、常引用(被const 修饰的引用)&#x…

idea打开传统eclipse项目

打开传统web项目 1.打开后选择项目文件 2.选择项目结构 3.设置jdk版本 4.导入当前项目模块 5.选择eclipse 6. 设置保存目录 7.右键模块&#xff0c;添加spring和web文件 8. 设置web目录之类的&#xff0c;并且创建打包工具 9.如果有本地lib&#xff0c;添加为库 最后点击应用&…

【linux】Linux桌面应用程序快捷方式

在linux系统里&#xff0c;很多应用程序虽然有对应的版本&#xff0c;但是下载了之后发现打开方式并不友好&#xff0c;比如&#xff0c;今天下载了DataGrip&#xff0c;打开文件夹才发现它里面有这些&#xff1a; 红框内的脚本是其正确的打开方式。每次你都要执行&#xff1a…