目标追踪StrongSORT——基于DeepSORT重大升级提高多目标跟踪的准确性和鲁棒性

1、概述

1.1 DeepSORT

DeepSORT算法是在SORT基础上发展起来的一种多目标跟踪算法。SORT算法结合了目标检测器和跟踪器,其中跟踪器的核心是卡尔曼滤波和匈牙利算法。卡尔曼滤波用于预测目标在下一帧的位置和状态,而匈牙利算法则用于将预测状态与实际检测结果进行最佳匹配。这种方法在目标没有被遮挡或丢失时表现良好,但如果目标因为某些原因(如遮挡)在一帧中未被检测到,卡尔曼滤波的预测可能会失败,导致跟踪失败。

DeepSORT算法为了解决这个问题,引入了深度学习中的重识别技术。它不仅关注目标的运动信息,还利用目标的外观特征来增强跟踪的准确性。DeepSORT通过深度学习模型提取目标的外观特征,并将这些特征表示为低维向量。在每帧的检测和跟踪过程中,DeepSORT都会提取当前帧中目标的外观特征,并与之前存储的特征进行比较,以此来判断目标是否为同一物体。

这种方法的优势在于,即使在目标暂时从视野中消失或被遮挡的情况下,DeepSORT也能够通过外观特征的匹配来维持跟踪的连续性。外观特征的引入使得DeepSORT在处理遮挡、相似目标的分辨以及目标再出现时的身份恢复等方面表现得更加鲁棒。

1.2 StrongSORT

StrongSORT它在DeepSORT的基础上进行了一系列的改进,以提高跟踪的准确性和性能。改时以下的几个地方:

  1. BoT(Bag of Tricks): 改进了外观特征提取器,它使用深度学习技术来提取目标的视觉特征,这些特征对于区分和识别不同的目标至关重要。
  2. EMA(Exponential Moving Average): 通过引入惯性项来平滑特征更新,EMA有助于减少噪声和异常值的影响,使得跟踪更加稳定。
  3. NSA(Neural Network-based Appearance): 这是一种用于非线性运动的卡尔曼滤波器,它通过神经网络来预测目标的状态,以适应更复杂的运动模式。
  4. MC(Motion Compensation): 包括运动信息的成本矩阵,这有助于在匹配过程中更好地考虑目标的运动信息,提高匹配的准确性。
  5. ECC(External Camera Calibration): 摄像机运动更正,它允许算法校正摄像机的外部参数,从而提高跟踪的准确性。
  6. woC(Without Cascading): 不采用级联算法,这可能意味着算法避免了在不同阶段使用不同复杂度的检测器,从而提高了处理速度。

StrongSORT++是StrongSORT的一个变体,它进一步引入了:

  • AFLink(Association Graph Linking): 这是一种仅使用运动信息的全局链接方法,它在离线处理阶段用于改进跟踪结果。

  • GSI(Gaussian Process-based Interpolation): 通过高斯过程对检测误差进行内插,这是一种后处理技术,用于进一步提高跟踪的精度。

StrongSORT通过在特征提取、运动信息处理和成本矩阵计算等方面的改进,提高了多目标跟踪的性能。而StrongSORT++则通过引入AFLink和GSI技术,进一步优化了跟踪的准确性和鲁棒性。这些改进使得StrongSORT能够在复杂的场景中更有效地处理遮挡、目标丢失和重新出现等问题,从而实现最先进的跟踪性能(SOTA)。

StrongSORT与其说从根本上改变了结构,不如说是改进了跟踪所需的特征提取、运动信息和成本矩阵的处理。StrongSORT++将AFLink(离线处理)和GSI插值(后处理)应用于改进的StrongSORT,是一个更加精确的模型。MOT17和MOT20的准确性比较,这表明了StrongSORT的优越性。

论文地址 :https://arxiv.org/abs/2202.13514
源码地址:https://github.com/dyhBUPT/StrongSORT.git

2. 研究背景

StrongSORT是基于DeepSORT算法的改进版本,旨在通过结合最新的技术元素来提升跟踪的准确性:

2.1. DeepSORT的起源与影响:

DeepSORT作为深度学习跟踪方法的先驱,为后续的研究奠定了基础。尽管后续出现了如FairMOT和ByteTrack等新方法,并在准确性上超越了DeepSORT,但这并不是因为DeepSORT方法本身存在缺陷,而是由于其提出的较早,技术尚未达到最新水平。因此,通过对DeepSORT进行改进,有潜力将其性能提升到新的水平。

2.2. SDE与JDE的对比:

DeepSORT属于单独检测和嵌入(SDE)模型,其检测器是独立于跟踪模型的。相比之下,联合检测和嵌入(JDE)模型如JDE(Joint Detection and Embedding)同时训练检测和跟踪任务,可能会导致模型冲突,限制了准确性。此外,JDE需要一个同时包含检测和跟踪信息的数据集进行训练,这限制了训练数据的多样性和范围。

2.3. 改进DeepSORT的动机:

尽管存在JDE这样的新方法,但它们在训练上的局限性和对复杂运动场景的处理不足表明,仍有很大的改进空间。StrongSORT的提出正是基于这样的动机,即在DeepSORT的SDE框架中充分利用外观特征来提升跟踪性能。

2.4. StrongSORT的定位:

提出StrongSORT的目的是为了证明在SDE方法中结合外观特征进行跟踪是有效的。通过改进DeepSORT,StrongSORT旨在解决ByteTrack等仅基于运动信息的模型在处理复杂运动时的局限性,同时避免JDE模型在训练上的挑战。

3.DeepSORT

在跟踪任务中,需要将当前帧(记为t)中检测到的物体与过去从0~t-1帧中跟踪到的物体的短期轨迹(tracklet)进行比较和匹配,确保为同一个物体分配相同的ID。这个过程涉及到创建一个成本矩阵,该矩阵基于物体的外观特征和运动信息来衡量当前检测到的物体与已有跟踪点之间的相似性和差异性,目的是找到成本最小的匹配组合。

3.1特征库

特征库用于存储tracklets的外观特征,以便评估新检测到的物体与当前帧中哪个跟踪点的外观最为相似。DeepSORT会保留最近100帧的外观特征,这些特征是通过一个简单的深度模型(如CNN)在MARS数据集上预训练得到的。这个深度模型能够提取物体的外观特征,有助于区分不同的个体。

3.2 卡尔曼滤波器

除了外观特征,运动信息也是跟踪过程中的一个重要因素。卡尔曼滤波器不仅关注物体的当前位置,还能够预测物体在下一帧中可能出现的位置。这种预测基于物体在前一帧的位置和运动状态,预测出的tracklet坐标与当前检测到的物体之间的距离被用作成本矩阵的一个元素。DeepSORT使用的是线性卡尔曼滤波器,并且假设所有物体的噪声特性是相同的。

3.3 匹配级联

在将检测结果与跟踪器进行关联时,DeepSORT使用匈牙利算法来处理位置信息和外观特征的成本矩阵,以找到最优的匹配方案。此外,DeepSORT采用了一种匹配级联的策略,优先考虑将最近的检测结果与当前活跃的轨迹进行匹配。这种策略有助于提高跟踪的实时性和准确性,尤其是在处理快速移动或频繁出现的物体时。

4. StrongSORT

4.1 BoT

StrongSORT采用了BoT作为更强大外观特征提取器。与DeepSORT中使用的简单CNN模型不同,BoT使用的是ResNeSt50作为骨干模型,并在DukeMTMCreID数据集上进行了预训练。这种特征提取器能够更有效地区分不同个体之间的特征,因为它利用了更复杂的网络结构和大量的预训练数据。

4.2 EMA

EMA是GIAOTracker中提出的一个特征库:DeepSORT特征库保留了100帧的特征,这使得它效率低下,对每一帧的检测噪声高度敏感。相比之下,EMA将过去的特征作为惯性项保留并更新,如下式所示:f是在第t帧检测到的物体的特征,并分配给小轨道 i,e是到第t-1帧为止的小轨道的特征。通过用α加权,特征被有效地更新,并减少了噪音。

4.3 NSA Karman

GIAOTracker中也提出了NSA卡尔曼:在DeepSORT中,它是一个简单的线性卡尔曼滤波器,但假设所有检测到的物体具有相同的观测噪声是不现实的。因此,NSA卡尔曼根据检测的置信度,以自适应的方式改变噪声。对于复杂的移动物体,检测器可能对物体的输出信心不足,所以卡尔曼滤波器加强了校正。

c k ck ck代表每个对象的信心水平。通过这种方式,可以对各种复杂的物体运动进行位置估计。

4.4 MC。

DeepSORT将位置信息作为一种成本,但实际上只实验了外观特征作为一种成本,其权重设置为零。与这样的DeepSORT不同,StrongSORT生成了一个λ=0.98的成本矩阵,如下式所示。KaTeX parse error: Expected 'EOF', got '&' at position 3: Aa&̲是外观特征的成本,Am&是运动(位置)信息的成本。

4.5 其他。

StrongSORT采用了ECC校正算法来处理相机视角的变化。这种算法考虑到了相机的外部参数,如焦距和畸变系数,从而能够更准确地校正图像中的视角变化,这对于在不同视角下保持跟踪的一致性和准确性至关重要。

在处理匹配成本矩阵时,StrongSORT并未采用DeepSORT中的匹配级联策略。相反,它将匹配问题视为一个简单的线性分配问题,并使用一种更直接的方法来解决。这种方法的优先级是考虑那些具有较近期观测数据的轨迹(tracklets)。这是因为如果跟踪模型本身性能良好,过分复杂的匹配策略反而可能限制跟踪的准确性。通过信任并优先使用优秀的跟踪模型,StrongSORT在匹配过程中避免了不必要的复杂性,从而提高了整体的跟踪准确性。

StrongSORT放弃了级联匹配策略(wOC)。这种改变简化了匹配过程,使得跟踪算法能够更加专注于利用高质量的外观特征和运动信息来进行有效的数据关联,而不是依赖于复杂的级联结构。

5.AFLink

在讨论的在线跟踪中,每一帧图像都会被实时检测并连接追踪单元,这是实时跟踪的过程。然而,在实际应用中,由于检测错误或遮挡等原因,跟踪有时会中断,导致短时间内产生的追踪信息虽然准确但不完整。为了解决这个问题,需要采用一种离线处理方法,也就是所谓的全局链接(Global Linking),它的目的将分散的追踪单元(tracklets)连接在一起,形成一个完整的追踪序列。

AFLink是一种新颖的全局链接方法,它是第一个不依赖外观特征的全局链接机制。在以往的全局链接方法中,例如GIAOTracker中提出的GIModel,通常会使用基于ResNet的深度CNN模型从每个tracklet的帧中提取外观特征,然后将这些特征输入到Transformer Encoder中进行关联性分析。这种方法虽然强大,但模型相对复杂,计算成本高昂,并且由于它依赖于外观特征,容易受到噪声等因素的影响,这也可能成为问题。

相比之下,AFLink在小追踪 T T T中使用的唯一信息是检测到的帧数 f f f和当时的位置 ( x , y ) (x,y) x,y;两个小追踪 T i Ti Ti T j Tj Tj的最后30帧的信息 T i = ( f k , x k , y k )( k = 1   30 ) Ti=(fk,xk,yk)(k=1~30) Ti=fk,xk,yk)(k=1 30)在卷积层中被压缩和特征提取, T i Ti Ti T j Tj Tj是否代表相同的信心水平输出是Ti和Tj是否代表同一个人的轨迹的信心水平。首先,时间块对三个特征 ( f 、 x 、 y ) (f、x、y) fxy中的每一个在七帧之间重复压缩时间序列方向。然后应用一个融合块来压缩这三个特征。综合结果被输入到分类器,分类器用Affine和ReLU将其转换为置信度。整体情况如下图所示。应该注意的是,为这两个小轨道提供了单独的区块。

时间块只在时间方向(7帧)对每个 f , x , y f,x,y f,x,y独立进行卷积。与此相反,融合块压缩了在时间方向上压缩的三维特征。实验中使用的AFLink模型如下图所示。

6.高斯平滑插值

GSI它在在线和离线跟踪过程完成后进行的后处理阶段中发挥重要作用。后处理的一个重要任务是对那些在跟踪过程中遗漏的检测进行插值,以提高轨迹的完整性和精度。

在SDE(Single Detection per Frame per Object)跟踪框架中,如果检测器在某帧中未能检测到某个物体,那么该物体在该帧中的轨迹就会丢失。为了弥补这些遗漏,可以通过插值方法来重建丢失的轨迹。线性插值是一种简单且广泛使用的方法,它通过在已知检测点之间直线连接来估计中间点的位置。然而,线性插值的精度有限,因为它没有考虑物体的运动信息,导致插值结果可能不够自然或不符合实际情况。

在下图中,蓝色线条展示了线性插值的结果,它简单地在检测到的轨迹之间进行直线插值,但这种方法没有考虑到物体的真实运动轨迹(Ground Truth,简称GT),因此可能无法准确地反映物体在场景中的移动。

为了解决这个问题,GSI(Gaussian Process-based Interpolation)插值方法被提出。GSI插值利用高斯过程对检测误差进行建模,并在此基础上进行插值。这种方法可以更准确地估计物体在丢失帧中的位置,因为它考虑了物体的运动信息和轨迹的连续性。
GSI的核心是一个高斯过程。高斯过程对多维正态分布进行建模,其均值m和协方差K作为a的函数给出,例如,当从 a a a预测 b b b时,对于一些观察到的数据 a , b , p ( b ∣ a ) = N ( m ( a ) , K ( a )) a,b,p(b|a)=N(m(a),K(a)) a,b,p(ba=Nma,Ka))。在这种情况下,我们假设在帧数 t t t和位置信息 ( x 、 y 、 w 、 h ) (x、y、w、h) xywh之间分别有条件的多维正态分布 p ( x ∣ t )、 p ( y ∣ t )、 p ( w ∣ t ) p(x|t)、p(y|t)、p(w|t) pxt)、pyt)、pwt) p ( h ∣ t ∗ ∗ ) p(h|t**) pht。然后,我们估计 ( x , y , w , h ) (x,y,w,h) x,y,w,h在检测失误的帧t。请注意,对每个轨迹 i i i应用一个高斯过程,在文中表示为pt。
在这里插入图片描述
RBF核用于核函数 k k k。分母 λ λ λ决定了轨迹的平滑性,在本文中被设定为10。
在这里插入图片描述

图中显示,帧数和位置坐标用正态分布建模,成功地插值了它们之间的检测误差。StrongSORT++是加入了这种AFLink和GSI插值的StrongSORT

7. 实验

7.1 数据集

在评估跟踪算法的性能时,通常会使用公认的基准数据集来进行实验。MOT17和MOT20是两个专门用于人员跟踪的基准数据集。MOT20相比MOT17更具挑战性,因为它包含了更密集的跟踪目标。在进行消融实验时,MOT17训练数据集中每个视频的前半部分用于训练模型,而后半部分则用于验证模型的性能。

7.2 模型设置

StrongSORT算法中使用的外观特征提取器BoT在DukeMTMC数据集上进行了预训练,而检测器YoloX-X则是在COCO数据集上预先训练的。在模型设置中,抑制重复检测的非极大值抑制(NMS)阈值设定为0.8,检测置信度阈值为0.6。AFLink能够在30帧内和75像素范围内将小轨道联系起来,如果输出置信度大于0.95,则认为关联是有效的;GSI内插法将最大可能的插值检测失误设定为20帧。

7.3 评估指标

跟踪准确性的评估通常涉及多个指标,从不同的角度来衡量跟踪的性能:

  • MOTA(Multiple Object Tracking Accuracy)是一个侧重于检测准确性的指标,因为它基于跟踪过程中的假阳性、假阴性和ID切换来计算。ID切换是指在跟踪过程中物体的关联错误。
  • IDF1是一个侧重于追踪过程中ID匹配的指标,例如,相同数量的ID将导致一个长而稳定的追踪。
  • HOTA(Homogeneous Precision, Recall, and F1-score)是一个很平衡的评价指标,它可以同时评估检测精度(DetA)和跟踪方法(AssA)。

7.4 消融实验

为了理解StrongSORT中每个组件的作用,进行了消融实验。通过从基线DeepSORT开始,逐步添加StrongSORT的各个机制,对比在线跟踪的性能变化。这种逐项添加的方式有助于理解每个改进对整体跟踪性能的具体影响,从而验证每个新引入技术的有效性。消融实验是理解算法改进和优化效果的重要步骤,它确保了算法的每个部分都是经过精心设计和测试的。

改进外观特征提取器(BoT)明显改善了IDF1,这表明了外观特征的重要性;增加ECC略微改善了IDF1和MOTA,而相机校正可以提取准确的运动信息。然后,NSA卡尔曼改进了HOTA,但MOTA和IDF1保持不变。当tracklet特征改为EMA时,不仅代表关联准确性的IDF1增加了,而且FPS也提高了,导致速度加快。包括运动信息的成本(Motion Cost)也证实了StrongSORT准确性的提高。最后,StrongSORT在没有匹配级联的情况下执行正常的线性赋值问题,在IDF1中显示出明显的改善,表明级联是没有必要的。

7.5 AFLink和GSI。

这里使用StrongSORT和现有的SoTA模型来宣称AFLink和GSI的优势。上面的StrongSORT消融有v1~v6的顺序,这里用的是其中的v1/v3/v6,CenterTrack、TransTrack和FairMOT是现有的方法,AFLink和GSI处理分别加入到六个模型中。使用的模型如下。

AFLink提高了两个模型的准确性。就GSI而言,与AFLink不同,它对更强的跟踪模型更有效。与线性插值(LI)的比较是针对GSI单独进行的,表明GSI在计算成本略有增加的情况下提高了性能。

如上所述,AFLink和GSI被发现可以提高各种高精度跟踪模型的准确性,而不仅仅是StrongSORT。

7.7 MOTChallenge。

最后是与许多SoTA的比较:用MOT17和MOT20进行验证;没有进行FPS的比较,因为很难比较JDE和SDE,因为在SDE模型中检测阶段的处理时间基本上被忽略了。

首先是MOT17,在所有方法中,StrongSORT++在HOTA/AssA/DetA方面取得了第一名,在MOYA/IDs方面取得了第二名,远远领先于第二名的精确度。

MOT20处理更拥挤的情况。其中,StrongSORT++在HOTA/IDF1/AssA中同样取得了第一名的成绩。特别是,它显示了非常低的ID数量。

这些结果是在没有对每个数据的参数进行任何调整的情况下实现的,这表明了该方法的多功能性。

8.训练与部署

源码地址:https://github.com/dyhBUPT/StrongSORT.git

8.1 环境安装:

conda create -n strongsort python=3.8 -y
conda activate strongsort
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.7 -c pytorch -c nvidia
pip install opencv-python
pip install scipy
pip install scikit-learn==0.19.2

数据集可以从这里下载:https://motchallenge.net/
百度网盘地址:https://pan.baidu.com/s/1EtBbo-12xhjsqW5x-dYX8A?pwd=sort

8.2 训练与测试

在MOT17-val上运行DeepSORT:

python strong_sort.py MOT17 val

在MOT17-val上运行StrongSORT:

python strong_sort.py MOT17 val --BoT --ECC --NSA --EMA --MC --woC

在MOT17-val上运行StrongSORT++:

python strong_sort.py MOT17 val --BoT --ECC --NSA --EMA --MC --woC --AFLink --GSI

在MOT17-test上运行StrongSORT++:

python strong_sort.py MOT17 test --BoT --ECC --NSA --EMA --MC --woC --AFLink --GSI

在MOT20-test上运行StrongSORT++:

python strong_sort.py MOT20 test --BoT --ECC --NSA --EMA --MC --woC --AFLink --GSI

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

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

相关文章

【Linux】Linux C 编程

在 Windows 下编程首先就是安装对应的 IDE ,然后在 IDE 里面进行代码编写和编译,但是在 Linux 下,这两个部分是分开的,比如我们可以使用 vim 编辑器编写代码,然后用 gcc 编译器编译代码。Ubuntu 下有一些可以进行编程的…

Azkaban集群模式部署详细教程

序言 Azkaban是一个用于工作流程调度和任务调度的开源工具,它可以帮助用户轻松地管理和监控复杂的工作流程。Azkaban的架构设计旨在提供高度可扩展性和可靠性,同时保持易用性和灵活性。 Azkaban的架构可以分为三个主要组件:Executor、Web Server和db数据…

Python-VBA编程500例-033(入门级)

角色定位(Role Positioning)在编程中的实际应用场景主要体现在以下几个方面: 1、权限管理:在开发企业级应用或复杂的系统时,角色定位用于定义和管理用户的权限。例如,一个系统可能有管理员、普通用户、访客等不同角色&#xff0c…

Linux网络管理类命令

ping -c:指定次数 -i n:指定发送频率 n 秒 -t:指定 TTL 值 -s:指定发送包的大小 ifconfig iproute netstat -anltp ss ssh 主机名 SCP wget nmap -A: 全面扫描 -p :端口 80 22-80 80,25,443 -sP &#xf…

利用native的方式实现跨线程调用

简介 在OpenHarmony应用开发实践中,经常会遇到一些耗时的任务,如I/O操作、域名解析以及复杂计算等。这些任务如果直接在主线程中执行,将会严重阻塞主线程,影响后续任务的正常流程,进而导致用户界面响应延迟甚至卡顿。…

【学习笔记】Elsevier的Latex模板文件(附网址)

注:这是一篇没有技术含量的水文,主要是看有人下载下来,居然当成资源需要积分才能下载。我觉得不行,故提供原始下载地址供查阅使用。 链接: 上述图片所示网址:链接直达

Redis(性能管理、主从复制、哨兵模式)概述及部署

目录 一、性能管理 1、查看Redis内存使用 2、内存碎片率 3、跟踪内存碎片率 4、内存使用率 5、内回收key 二、Redis集群有三种模式 三、Redis主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、搭建Redis主从复制 1.环境准备 2.安装Redis&#…

在团队管理过程中,怎样能够让员工更容易接受和执行反馈呢?

让员工更容易接受和执行反馈,关键在于建立一种开放、积极且互相尊重的沟通氛围。 确保反馈的针对性和具体性是关键。 员工需要清楚了解他们的表现如何,以及他们需要改进的地方在哪里。因此,反馈内容应具体明确,避免模糊或笼统的表…

Python零基础到精通

Python入门指南 欢迎进入 Python 领域。作为程序员,我们总是在寻找能提高效率、编写优雅的代码的工具,而 Python 正是其中之一。你即将探索一种强大而灵活的编程语言,它被广泛应用于各种领域,从网站开发到数据科学,再到…

基础总结篇:Activity生命周期

private int param 1; //Activity创建时被调用 Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, “onCreate called.”); setContentView(R.layout.lifecycle); Button btn (Button) findViewById(R.id.…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1)git加入鼠标右键 2)git clone源码 2、VSCode出场 1)创建pyth…

VC++ 错误 Compiler Error C2018 unknown character ‘hexnumber‘

如下图,不能识别的字符0xa1, 这是代码中出现了全角空格,如下图标识的一行,等号前面出现了全角空格;改为半角空格; 如果是未知字符0xa3,则是程序中有中文符号,如程序中的引号&#xf…

【C++算法竞赛 · 图论】图论基础

前言 图论基础 图的相关概念 图的定义 图的分类 按数量分类: 按边的类型分类: 边权 简单图 度 路径 连通 无向图 有向图 图的存储 方法概述 代码 复杂度 前言 图论(Graph theory),是 OI 中的一样很大…

小米造车,特斯拉销量不满人意,马斯克坐不住了:将于8月8日推出自动驾驶出租车

在Elon Musk声称路透社关于“放弃2.5万美元低成本电动汽车计划,而将所有精力集中于Robotaxi(自动驾驶出租车)”上的报道“撒谎”仅几小时后,特斯拉首席执行官在X社交平台上宣布,他将在8月8日的活动中揭示这款所谓的Rob…

Android APP加固利器:深入了解混淆算法与混淆配置

Android APP 加固是优化 APK 安全性的一种方法,常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下 Android APP 加固的具体实现方式。 混淆代码 使用 ipaguard工具可以对代码进行混淆,使得反编译出来的代码很难阅读和理解&#xff…

相对论中关于光速不变理解的补充

近几个月在物理直播间聊爱因斯坦相对论,发现好多人在理解爱因斯坦相对论关于基本假设,普遍认为光速是不变的,质能方程 中光速的光速不变的,在这里我对这个假设需要做一个补充,他是基于质能方程将光速C 在真是光速变化曲…

JavaEE 初阶篇-生产者与消费者模型(线程通信)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 生产者与消费者模型概述 2.0 在生产者与消费者模型中涉及的关键概念 2.1 缓冲区 2.2 生产者 2.3 消费者 2.4 同步机制 2.5 线程间通信 3.0 实现生产者与消费者模…

【Python】 小顶堆:困难 Leetcode 23. 合并 K 个升序链表 -- Python中heapq对于自定义数据类型的比较

描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 代码 代码1 由于可能存在相同…

构造函数和析构函数

目录 一:类的六个默认函数 二:构造函数 2.1概念 2.2特性 三:析构函数 3.1概念: 3.2特性 一:类的六个默认函数 如果一个类中什都没有,称为空类 空类中真的什么都没有吗?并不是,任何类在…

MySQL客户端安装并配置免密登录

最近在写脚本时需要向MySQL数据库中存储数据,且脚本运行的服务器与MySQL服务器不是同一台服务器,而且需要保证MySQL密码的安全性,不能在脚本中暴露,所以就需要在服务器上安装MySQL客户端,并配置免密登录。 一、虚拟机…