Co-DETR:DETRs与协同混合分配训练论文学习笔记
论文地址:https://arxiv.org/pdf/2211.12860.pdf
代码地址: GitHub - Sense-X/Co-DETR: [ICCV 2023] DETRs with Collaborative Hybrid Assignments Training
摘要
作者提出了一种新的协同混合任务训练方案,即Co-DETR,以从多种标签分配方式中学习更高效的基于detr的检测器。这种新的训练方案通过训练ATSS和Faster RCNN等一对多标签分配监督下的多个并行辅助头部,可以很容易地提高编码器在端到端检测器中的学习能力。此外,作者通过从这些辅助头部提取正坐标来进行额外的定制正查询,以提高解码器中正样本的训练效率。在推理中,这些辅助头被丢弃,因此,作者的方法不给原始检测器引入额外的参数和计算成本,同时不需要手工制作的非最大抑制(NMS)。
太长不看版:
本文也就是在DINO的基础上,对DINO Deformable-transformer的encoder输出的memory按每层特征图尺寸展开(加一个最后一层的下采样,共五层特征图),在这五层特征图上使用一对多标签分配监督训练即ATSS和faster-rcnn,除了特征图的来源不同外,其余的训练方式和ATSS以及faster-rcnn是一样的。之后会将ATSS和faster-rcnn输出的结果编码成query,作为辅助decoder的输入,这个decoder和主体的decoder相同,计算loss时这部分query不需要做二分匹配。论文中的结构图很好的展示了算法的流程。
如果还不是很了解DINO的可以看我的系列博文:
DINO代码学习笔记(一)_athrunsunny的博客-CSDN博客
DINO代码学习笔记(二)_athrunsunny的博客-CSDN博客
DINO代码学习笔记(三)-CSDN博客
DINO代码学习笔记(四)-CSDN博客
或者,DINO的原作者在知乎上也有对其文章的讲解:DINO
以及可以通过Deformable-DETR代码学习笔记_athrunsunny的博客-CSDN博客 加深对Deformable-transformer的理解
ATSS简介:
ATSS(Adaptive Training Sample Selection)是一种目标检测算法,用于在图像中准确地检测和定位目标物体。它是一种单阶段目标检测方法,旨在解决传统单阶段方法在处理密集目标和大尺度目标时的困难。
ATSS 的核心思想是根据目标与锚框之间的相似度(中心点距离)来选择训练样本。传统的单阶段目标检测方法使用固定的正负样本采样策略,但这种策略在处理密集目标和大尺度目标时可能会导致样本不均衡的问题。ATSS 通过引入自适应样本选择机制,根据目标与锚框之间的相似度动态地选择正负样本,从而提高了模型的性能。
具体来说,ATSS 首先在每一层feature map上通过计算目标与每个锚框之间的相似度,得到每个锚框的iou。然后,根据iou对锚框进行排序,并选择iou最高的一部分锚框作为正样本。接下来,ATSS 使用一种自适应的方式选择负样本,即根据正样本的分布情况来选择与正样本相似度较低的锚框作为负样本。这样可以有效地减少负样本的数量,并提高模型对困难样本的学习能力。
1. 介绍
在本文中,作者试图使基于detr的检测器优于传统检测器,同时保持其端到端优点。为了解决这一挑战,作者将重点放在一对一集合匹配的直观缺点上,即它探索的是不太积极的查询。这将导致严重的训练效率低下问题。作者从编码器产生的潜在表征和解码器的注意学习两个方面详细分析了这一点。作者首先比较了deform - detr和一对多标签分配方法之间潜在特征的可判别性得分,其中作者简单地将解码器替换为ATSS头部。利用每个空间坐标上的特征12范数表示可判别性得分。给定编码器的输出F∈RC×H×W,就可以得到可判别性评分图S∈R1×H×W。目标在相应区域的得分越高,越容易被检测到。如图2所示,作者通过对判别性分数应用不同的阈值来演示IoF-IoB曲线(IoF:前景相交,IoB:背景相交)(详情见第3.4节)。ATSS的IoF-IoB曲线越高,说明它更容易区分前景和背景。
作者在图3中进一步可视化可判别性评分图S。很明显,一对多标签分配方法充分激活了一些显著区域的特征,但在一对一集合匹配中却没有得到充分的探索。对于解码器训练的探索,作者还展示了基于deform - detr和Group-DETR的解码器中交叉注意分数的IoF-IoB曲线,该曲线在解码器中引入了更多的正向查询。图2中的插图显示,太少的积极查询也会影响注意学习,而在解码器中增加更多的积极查询可以稍微缓解这种情况。
这一重要的观察结果促使作者提出一种简单而有效的方法——协同混合任务训练方案(Co-DETR)。CoDETR的关键思想是使用通用的一对多标签分配来提高编码器和解码器的训练效率和有效性。更具体地说,作者将辅助头与变压器编码器的输出集成在一起。这些头部可以通过多用途的一对多标签分配来监督,如ATSS、FCOS和Faster RCNN。不同的标签分配丰富了对编码器输出的监督,这迫使它具有足够的判别性,以支持这些头部的训练收敛。为了进一步提高解码器的训练效率,作者在这些辅助头部中对正样本的坐标进行了精心编码,包括正锚点和正提议。它们作为多组正查询发送到原始解码器,以预测预先分配的类别和边界框。每个辅助头部的正坐标作为一个独立的组,与其他组隔离。多用途的一对多标签分配可以引入大量(正查询、真值)对来提高解码器的训练效率。注意,在推理过程中只使用原始解码器,因此,所提出的训练方案只在训练过程中引入额外的开销。
作者进行了大量的实验来评估所提出方法的效率和有效性。如图3所示,Co-DETR极大地缓解了一对一集合匹配中编码器的特征学习问题。作为即插即用的方法,很容易将其与不同的DETR变体组合,包括DAB-DETR , DeformableDETR和DINO-Deformable-DETR。
如图1所示,Co-DETR实现了更快的训练收敛,甚至更高的性能。具体来说,作者将基本的deform - detr在12 epoch训练中提高了5.8% AP,在36 epoch训练中提高了3.2% AP。使用Swin-L的最先进的DINO-Deformable-DETR在COCO val上的AP仍然可以从58.5%提高到59.5%。令人惊讶的是,结合vit -L主干,在COCO测试开发上实现了66.0%的AP,在LVIS val上实现了67.9%的AP,以更小的模型尺寸建立了新的最先进的检测器。
2. 相关工作
One-to-many label assignment
对于目标检测中的一对多标签分配,可以在训练阶段将多个候选框作为正样本分配到同一个ground-truth box中。在经典的基于锚点的检测器中,如Faster-RCNN和RetinaNet,样本选择由预定义的IoU阈值和锚点与标注框之间的匹配IoU来指导。无锚点FCOS利用中心先验,将每个边界框中心附近的空间位置赋值为正。在一对多标签分配中引入自适应机制,克服了固定标签分配的局限性。ATSS通过最接近的k个锚的统计动态IoU值进行自适应锚选择。PAA以概率方式自适应地将锚点分为阳性和阴性样本。在本文中,作者提出了一种协作混合分配方案,通过一对多标签分配的辅助头来改进编码器表示。
One-to-one set matching
开创性的基于变压器的检测器DETR将一对一集合匹配方案融入到目标检测中,实现完全的端到端目标检测。一对一集合匹配策略首先通过匈牙利匹配计算全局匹配成本,并为每个真值盒只分配一个匹配成本最小的正样本。DNDETR证明了由于一对一集合匹配的不稳定性导致的缓慢收敛,因此引入去噪训练来消除这一问题。DINO继承了DAB-DETR的高级查询公式,并结合了改进的对比去噪技术,以实现最先进的性能。Group-DETR构造组明智的一对多标签分配,利用多个正对象查询,类似于H-DETR中的混合匹配方案。在上述后续工作的基础上,本文提出了一对一集合匹配协同优化的新视角。
3.本文方法
根据标准的DETR协议,输入图像被送入主干和编码器以生成潜在特征。多个预定义对象查询在解码器中通过交叉注意与它们交互。作者引入Co-DETR,通过协同混合任务训练方案和自定义正查询生成来改善编码器的特征学习和解码器的注意学习。作者将详细描述这些模块,并给出它们为什么可以很好地工作的见解。
3.2. Collaborative Hybrid Assignments Training
为了减轻由于解码器中较少的正查询而导致的编码器输出的稀疏监督,我们结合了具有不同多标签分配范例的多功能辅助头,例如ATSS和Faster R-CNN。不同的标签分配丰富了对编码器输出的监督,这迫使它具有足够的判别性,以支持这些头部的训练收敛。具体来说,给定编码器的潜在特征F,我们首先通过多尺度适配器将其转换为特征金字塔{F1,···,FJ},其中J表示下采样步幅为的特征映射。与ViT-Det类似,特征金字塔是由单尺度编码器中的单个特征映射构建的,而我们使用双线性插值和3 × 3卷积进行上采样。例如,对于来自编码器的单尺度特征,我们依次应用下采样(3×3与stride 2卷积)或上采样操作来产生特征金字塔。对于多尺度编码器,我们只对多尺度编码器特征F中最粗的特征进行下采样,构建特征金字塔。定义了K个协作头,并以相应的标签分配方式Ak,对于第i个协作头,将{F1,···,FJ}发送给它,以获得预测值^Pi在第i个头部,Ai用于计算Pi中正样本和负样本的监督目标。记为G为GT,此过程可表示为:
其中{pos}和{neg}表示由Ai确定的(j, Fj中的正坐标或负坐标)的对集。j表示{F1,···,FJ}中的特征索引。B{pos}是空间正坐标的集合。P{pos} i和P{neg} i是相应坐标下的监督目标,包括类别和回归偏移量。具体地说,我们在表1中描述了每个变量的详细信息。
损失函数可定义为:
注意,对于负样本,回归损失被丢弃。K个辅助头部优化的训练目标为:
3.3. Customized Positive Queries Generation
在一对一集匹配范式中,每个GT框将只被分配给一个特定的查询作为监督目标。正查询太少会导致转换器解码器中的交叉注意学习效率低下,如图2所示。为了缓解这种情况,我们根据每个辅助头中的标签分配Ai精心生成足够的自定义正查询。具体来说,给定第i个辅助头部的正坐标集B{pos} i∈RMi×4,其中Mi为正样本个数,则额外定制的正查询Qi∈RMi×C可以通过以下方式生成:
其中PE(·)表示位置编码,根据索引对(j, Fj中的正坐标或负坐标)从E(·)中选择相应的特征。
因此,在训练期间,有K + 1组查询有助于单个一对一集匹配分支和K个具有一对多标签分配的分支。辅助的一对多标签分配分支与原始主分支中的L个解码器层共享相同的参数。辅助分支中的所有查询都被视为正查询,因此放弃匹配过程。具体来说,是第1解码器层的损失在第i辅助分支中可表示为:
Pi,l为第i辅助支路第l解码器层的输出预测值。最后,Co-DETR的训练目标为:
其中,~Ldecl表示原一对一集匹配分支中的损失,λ1和λ2为平衡损失的系数。
3.4. Why Co-DETR works
Co-DETR使基于detr的检测器有了明显的改进。接下来,我们尝试定性和定量地考察其有效性。我们基于Deformable-DETR与ResNet50主干使用36epoch设置进行了详细的分析。
Enrich the encoder’s supervisions
直观地说,太少的正查询会导致稀疏的监督,因为对于每个GT只有一个查询是由回归损失监督的。一对多标签分配方式下的正样本得到更多的定位监督,有助于增强潜在特征学习。为了进一步探索稀疏监督如何阻碍模型训练,作者详细研究了编码器产生的潜在特征。引入了IoF-IoB曲线来量化编码器输出的可判别性分数。具体来说,给定编码器的潜在特征F,受图3中特征可视化的启发,作者计算IoF(前景相交)和IoB(背景相交)。给定j层编码器的特征Fj∈RC×Hj×Wj,首先计算l2范数bFj∈R1×Hj×Wj,并将其大小调整为图像大小H ×W。判别性评分D(F)由各等级得分平均计算得出:
其中省略了调整大小操作。我们在图3中可视化了ATSS、deform - detr和co - deform - detr的判别分数。与Deformable-DETR相比,ATSS和Co-Deformable-DETR都具有更强的关键目标区域识别能力,而Deformable-DETR几乎不受背景干扰。因此,我们将前景和背景的指标分别定义为1(D(F) > S)∈RH×W和1(D(F) < S)∈RH×W。S是预定义的分数阈值,如果x为真,则1(x)为1,否则为0。对于前景Mf g∈RH×W的掩码,如果(h, w)点在前景内,则元素Mf g h为1,否则为0。前景交点面积(IoF)如果g可以计算为:
具体来说,我们以类似的方式计算背景区域的交点面积(IoB),并在图2中通过改变S绘制出IoF和IoB曲线。显然,在相同的IoB值下,ATSS和co - deform - detr比deform - detr和Group-DETR获得更高的IoF值,这表明编码器表示从一对多标签分配中受益。
Improve the cross-attention learning by reducing the instability of Hungarian matching
匈牙利匹配是一对一集合匹配的核心方案。交叉注意是帮助正查询编码丰富对象信息的重要操作。要做到这一点,需要充分的训练。作者观察到匈牙利匹配引入了不可控的不稳定性,因为在训练过程中,分配给同一图像中特定正查询的真值是变化的。接下来,作者在图5中给出了不稳定性的比较,作者发现他们的方法有助于更稳定的匹配过程。此外,为了量化交叉注意力的优化程度,还计算了注意力得分的IoF-IoB曲线。与特征可判别性分数计算类似,作者对注意力分数设置不同的阈值,得到多个IoF-IoB对。Deformable-DETR、Group-DETR和CoDeformable-DETR之间的比较如图2所示。作者发现,具有更多正查询的detr的IoF-IoB曲线一般都在deform - detr之上,这与他们的动机是一致的。
3.5. Comparison with other methods
Differences between our method and other counterparts
Group-DETR、H-DETR和SQR[2]通过与重复组和重复的ground-truth box进行一对一匹配来实现一对多赋值。Co-DETR明确地为每个基础真值分配多个空间坐标作为正数。因此,将这些密集的监督信号直接应用到潜在特征映射中,使其具有更强的判别能力。相比之下,Group-DETR、HDETR和SQR缺乏这种机制。虽然在这些对应物中引入了更多的正查询,但匈牙利匹配实现的一对多分配仍然存在一对一匹配的不稳定性问题。作者的方法受益于现成的一对多分配的稳定性,并继承了它们在正查询和真值框之间的特定匹配方式。Group-DETR和H-DETR无法揭示一对一匹配与传统一对多分配之间的互补性。据作者所知,作者是第一个用传统的一对多分配和一对一匹配对检测器进行定量和定性分析的人。这有助于更好地理解它们的差异和互补性,这样就可以通过利用现成的一对多任务设计来自然地提高DETR的学习能力,而不需要额外的专门的一对多设计经验。
No negative queries are introduced in the decoder
重复的对象查询不可避免地会给解码器带来大量的负面查询,并显著增加GPU内存。但是,作者的方法只处理解码器中的正坐标,因此消耗的内存较少,如表7所示。
4. 实验
实现细节
将Co-DETR合并到当前的类似detr的管道中,并保持训练设置与基线一致。K = 2时,采用ATSS和Faster-RCNN作为辅助头,K = 1时只保留ATSS。关于辅助头的更多细节可以在补充材料中找到。作者选择可学习对象查询的数量为300,默认设置{λ1, λ2}为{1.0,2.0}。对于Co-DINODeformable-DETR++,作者使用了带有大规模抖动的copypaste。
4.2. Main Results
在本节中,在表2和表3中实证分析了Co-DETR对不同DETR变量的有效性和泛化能力。所有结果均使用mmdetection重现。首先将协作混合任务训练应用于具有C5特征的单尺度detr。令人惊讶的是,Conditional-detr和DAB-DETR在较长的训练计划下比基线分别获得2.4%和2.3%的AP增益。对于具有多尺度特征的Deformable-DETR,检测性能从37.1%显著提高到42.9%。当训练时间增加到36次时,整体的改进(+3.2% AP)仍然有效。此外,我们在[16]之后对改进的Deformable-DETR(记为Deformable-DETR++)进行了实验,观察到+2.4%的AP增益。采用本方法的最先进的DINO-Deformable-DETR可达到51.2%的AP,比竞争基准高+1.8%。
基于两个最先进的基线,我们进一步将骨干容量从ResNet50扩展到swin-L。如表3所示,Co-DETR达到56.9% AP,并大大超过了deformation - detr ++基线(+1.7% AP)。使用swin-L的DINO-Deformable-DETR的性能仍然可以从58.5%的AP提高到59.5% AP。
4.3. Comparisons with the state-of-the-art
作者将K = 2的方法应用于deformable-detr++和DINO。此外,我们的Co-DINO-Deformable-DETR采用了quality focal loss和NMS。在表4中报告了COCO值的比较。与其他竞争对手相比,我们的方法收敛速度快得多。例如,Co-DINO-DeformableDETR在使用ResNet-50骨干网时仅使用12次epoch即可轻松实现52.1%的AP。我们使用SwinL的方法可以在1x调度器上获得58.9%的AP,甚至超过了其他最先进的3x调度器框架。更重要的是,我们的最佳模型Co-DINO-DeformableDETR++在36 epoch训练下,使用ResNet-50实现了54.8%的AP,使用swin-L实现了60.7%的AP,明显优于所有具有相同主干的现有检测器。
为了进一步探索该方法的可扩展性,作者将骨干容量扩展到3.04亿个参数。这种大规模主干ViT-L使用自监督学习方法(EVA-02)进行预训练。我们首先在Objects365上使用ViT-L预训练Co-DINO-Deformable-DETR 26个epoch,然后在COCO数据集上进行12个epoch的微调。在微调阶段,输入分辨率在480×2400和1536×2400之间随机选择。详细设置请参见补充资料。我们的结果是用测试时间增量来评估的。表5给出了最新的比较COCO测试开发基准。在更小的模型尺寸(304M个参数)下,Co-DETR在COCO测试开发上创造了66.0% AP的新记录,比之前的最佳模型InternImage-G高出+0.5% AP。
作者还证明了Co-DETR在长尾LVIS检测数据集上的最佳效果。特别地,我们在COCO上使用相同的Co-DINO-Deformable-DETR++模型,但选择FedLoss作为分类损失,以弥补数据分布不平衡的影响。在这里,我们只应用边界框监督,并报告目标检测结果。表6给出了比较结果。Co-DETR Swin-L以56.9%和62.3% AP LVIS val和minival超过ViT-Det与MAE-pretrained ViT-H和GLIPv2的方法骨干AP分别上涨3.5%和2.5%。作者进一步在此数据集上微调Objects365预训练的Co-DETR。在不增加测试时间的情况下,作者的方法在LVIS val和minival上分别达到67.9%和71.9%的最佳检测性能。与具有测试时间增强的30亿个参数的InternImage-G相比,作者将模型大小减小到1/10的同时,在LVIS val和minival上获得了+4.7%和+6.1%的AP增益。
4.4. Ablation Studies
除非另有说明,所有消融实验都是在带ResNet-50骨干网的deform - detr上进行的。默认情况下,作者选择辅助头的数量K到1,并将总批大小设置为32。更多的消融和分析可以在补充材料中找到。
Criteria for choosing auxiliary heads
作者在表7和表8中进一步研究了选择辅助头像的标准。表8中的结果显示,任何具有一对多标签分配的辅助头部都可以持续提高基线,并且ATSS可以达到最佳性能。我们发现,当选择K小于3时,随着K的增加,准确率继续提高。值得注意的是,当K = 6时,性能会出现下降,我们推测这是由于辅助头之间的严重冲突造成的。如果辅助头部之间的特征学习不一致,则随着K持续变大改进将被破坏。并在后续和补充资料中分析了多头的优化一致性。综上所述,我们可以选择任意头部作为辅助头部,为了在K≤2时达到最佳性能,我们通常选择ATSS和Faster-RCNN作为辅助头部。我们不会使用太多不同的heads,例如6个不同的heads,以避免优化冲突。
Conflicts analysis
当将相同的空间坐标分配给不同的前景框或在不同的辅助头部中作为背景时,会产生冲突,从而混淆检测器的训练。我们首先定义头部Hi与头部Hj之间的距离,以及Hi的平均距离来衡量优化冲突为:
其中KL, D, I, C分别为KL散度、数据集、输入图像和class activation maps(CAM)。如图6所示,当K > 1时,我们计算辅助头之间的平均距离,当K = 1时,计算DETR head与单个辅助头之间的距离。我们发现,当K = 1时,每个辅助头的距离度量是不显著的,这一观察结果与我们在表8中的结果一致:当K = 1时,DETR head可以与任何头协同改进。当K增加到2时,距离指标略有增加,我们的方法达到了最佳性能,如表7所示。当K从3到6增加时,距离激增,说明这些辅助头之间存在严重的优化冲突导致性能下降。然而,6个不同头部的ATSS基线达到49.5% AP,用6个不同头部替代ATSS可降低到48.9% AP。因此,我们推测过多的不同的辅助头像,例如超过3个不同的头像,会加剧冲突。综上所述,优化冲突受各种辅助头的数量以及这些头之间的关系的影响。
Should the added heads be different?
在作者的分析中,两个ATSS头(49.2% AP)的协同训练仍然改善了一个ATSS头(48.7% AP)的模型,因为ATSS是DETR头的补充。此外,还引入了多种互补的辅助头而不是与原始head相同,如Faster-RCNN,可以带来更好的增益(49.5% AP)。请注意,这与上述结论并不矛盾;相反,由于冲突不显著,我们可以在较少的不同heads(K≤2)下获得最佳性能,但当使用许多不同heads(K > 3)时,将面临严重的冲突。
The effect of each component.
作者进行了成分消融,以彻底分析表9中每个成分的影响。由于密集的空间监督使编码器特征更具鉴别力,因此结合辅助head产生显著的增益。或者,引入自定义的正查询也对最终结果有显著贡献,同时提高了一对一集合匹配的训练效率。这两种技术都可以加速收敛并提高性能。总之,作者观察到整体改进源于编码器更具鉴别性的特征和解码器更有效的注意力学习。
Comparisons to the longer training schedule
如表10所示,作者发现随着性能饱和,长时间的训练不能使deform - detr受益。相反,Co-DETR大大加快了收敛速度,提高了峰值性能。
Performance of auxiliary branches
令人惊讶的是,作者观察到Co-DETR也为表11中的辅助头带来了一致的收益。这意味着我们的训练范式有助于更多的判别编码器表示,这提高了解码器和辅助头的性能。
Difference in distribution of original and customized positive queries
作者在图7a中可视化了原始正查询和自定义正查询的位置。每张图像只显示一个对象(绿色框)。匈牙利匹配在解码器中分配的正查询用红色标记。我们分别用蓝色和橙色标记从Faster-RCNN和ATSS中提取的正查询。这些自定义查询分布在实例的中心区域,为检测器提供足够的监督信号。
Does distribution difference lead to instability?
作者在图7b中计算原始查询和自定义查询之间的平均距离。原始负查询和自定义正查询之间的平均距离明显大于原始和自定义肯定查询之间的距离。由于原始查询和自定义查询之间的分布差距很小,因此在训练期间不会遇到不稳定性。
代码的训练配置用的是projects\configs\co_deformable_detr\co_deformable_detr_r50_1x_coco.py默认使用k=2,即ATSS+Faster-rcnn头。
相关文章:

Co-DETR:DETRs与协同混合分配训练论文学习笔记
论文地址:https://arxiv.org/pdf/2211.12860.pdf 代码地址: GitHub - Sense-X/Co-DETR: [ICCV 2023] DETRs with Collaborative Hybrid Assignments Training 摘要 作者提出了一种新的协同混合任务训练方案,即Co-DETR,以从多种标…...

ELk部署,保姆级教学超详细!!!
Elk(Elasticsearch, Logstash, Kibana)是一套日志收集、存储和展示方案,是由Elastic公司开发的开源软件组合。 Elasticsearch:是一个分布式的搜索和分析引擎。它能够处理大量的数据,并提供快速、准确的搜索结果&#x…...

计算机毕业设计springboot+vue高校田径运动会报名管理系统61s38
高校田径运动会管理采用java技术,基于springboot框架,mysql数据库进行开发,实现了首页、个人中心、运动员管理、裁判员管理、场地信息管理、项目类型管理、比赛项目管理、比赛报名管理、比赛成绩管理、通知公告管理、留言板管理、交流论坛、系…...

java学习part21枚举
117-面向对象(高级)-枚举类的两种定义方式及练习_哔哩哔哩_bilibili 1.概念 2.enum关键字 枚举早期是用class内放n个public static final类变量供调用。 后来有了enum关键字,enum里的枚举变量都是public static final,但是必须都省略不写 正确方法 &…...
MongoDB的部署
MongoDB部署 基于Linux平台 前置要求 在Centos7 64位系统中安装64位的MongoDB的安装包,通过访问MongoDB官网https://www.mongodb.com/download-center/community进入MongoDB下载页面。Version:指定MongoDB版本,MongoDB的版本分为稳定版和开发…...

解析和存储优化的批量爬虫采集策略
如果你正在进行批量爬虫采集工作,并且想要优化解析和存储过程,提高采集效率和稳定性,那么本文将为你介绍一些实用的策略和技巧。解析和存储是批量爬虫采集中不可忽视的重要环节,其效率和质量对整个采集系统的性能至关重要。在下面…...

【git】使用ssh
前言 git之前一直使用https,因为很方便随时随地都可以用。最近把代码托管到GitHub,使用https就使用不了。后面听同事说GitHub使用ssh是没问题的,就想着尝试一下。 git ssh配置 设置用户名和邮箱 git config --global use.name username g…...

Linux 文件锁
1 为什么用文件锁 文件是一种共享资源,多个进程对同一文件进行操作的时候,必然涉及到竞争状态,因此引入了文件锁实现对共享资源的访问进行保护的机制,通过对文件上锁, 来避免访问共享资源产生竞争状态。 2 文件锁用法 (1)参考文档: man 2 …...

原理Redis-SkipList
SkipList ZipList和QuickList的共同特点是节省内存。在遍历元素时,只能从头到尾或从尾到头,所以在查找头尾元素性能还是不错的,但是中间元素查询的性能就会差。 **SkipList(跳表)**首先是链表,但与传统链表…...
Express内置的中间件
自Express 4.16.0 版本开始,Express 内置了3个常用的中间件,极大的提高了 Express 项目的开发效率和体验: 1.express.static 快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等 (无兼容性) 2.express.json 解析JSON 格式的请…...

Webstorm 插件文件目录颜色分析——白蓝绿红黄灰
Webstorm 插件文件目录【白色、蓝色、绿色、红色、黄色、灰色】对应当前文件发生什么了,即文件夹当前状态。 WebStrom配置好git或SVN后文件颜色代表的含义: 白色:本地无修改内容 蓝色:文件内容有修改,暂未提交到git…...

蓝桥杯day01——根据给定数字划分数组
题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 pivot 。请你将 nums 重新排列,使得以下条件均成立: 所有小于 pivot 的元素都出现在所有大于 pivot 的元素 之前 。所有等于 pivot 的元素都出现在小于和大于 pivot 的元素 中间 。小于 piv…...

oracle数据库巡检常见脚本-系列二
简介 作为数据库管理员(DBA),定期进行数据库的日常巡检是非常重要的。以下是一些原因: 保证系统的稳定性:通过定期巡检,DBA可以发现并及时解决可能导致系统不稳定的问题,如性能瓶颈、资源利用率…...

JavaScript 表达式
JavaScript 表达式 目录 JavaScript 表达式 一、赋值表达式 二、算术表达式 三、布尔表达式 四、字符串表达式 表达式是一个语句的集合,计算结果是个单一值。 在JavaScript中,常见的表达式有4种: (1)赋值表达式…...

Python之Pygame游戏编程详解
一、介绍 1.1 定义 Pygame是一种流行的Python游戏开发库,它提供了许多功能,使开发人员可以轻松创建2D游戏。它具有良好的跨平台支持,可以在多个操作系统上运行,例如Windows,MacOS和Linux。在本文中,我们将…...

虚拟摇杆easytouch joystick的方向与角色移动方向不一致
更改 勾选 inverse axis 进行校正...

C++二分查找:统计点对的数目
本题其它解法 C双指针算法:统计点对的数目 本周推荐阅读 C二分算法:得到子序列的最少操作次数 本文涉及的基础知识点 二分查找算法合集 题目 给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成…...
播放器开发(二):了解FFmpeg与SDL常用对象和函数
学习课题:逐步构建开发播放器【QT5 FFmpeg6 SDL2】 前言 这一篇内容就是简单的了解一遍一些常用的函数名称和作用,混个眼熟。 能看源码的就去看源码!!! 能看源码的就去看源码!!! …...

【数据库】基于排序算法的去重,集合与包的并,差,交,连接操作实现原理,执行代价以及优化
基于两趟排序的其它操作 专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏…...

Redis 主从架构,Redis 分区,Redis哈希槽的概念,为什么要做Redis分区
文章目录 Redis 主从架构redis replication 的核心机制redis 主从复制的核心原理过程原理Redis集群的主从复制模型是怎样的?生产环境中的 redis 是怎么部署的?机器是什么配置?你往内存里写的是什么数据?说说Redis哈希槽的概念&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...