YOLOv6: 面向工业应用的单阶段目标检测框架

news2024/11/29 11:45:01

论文地址:https://arxiv.org/pdf/2209.02976

代码地址:https://github.com/meituan/YOLOv6

多年来,YOLO 系列一直是高效目标检测的行业标准。 YOLO 社区蓬勃发展,丰富了其在众多硬件平台和丰富场景中的使用。在这份技术报告力求将其极限推向新的高度,以坚定不移的行业应用心态向前迈进。
考虑到真实环境中对速度和准确性的不同要求,作者广泛研究了来自工业界或学术界的最新目标检测进展。具体来说,从最近的网络设计、训练策略、测试技术、量化和优化方法中大量吸收了一些想法。最重要的是,整合思想和实践,构建了一套不同规模的部署网络,以适应多样化的用例。
YOLO 作者的慷慨许可下,作者将其命名为 YOLOv6。作者也热烈欢迎用户和贡献者进一步增强。YOLOv6-NNVIDIA Tesla T4 GPU 上以 1234 FPS 的吞吐量在 COCO 数据集上达到 35.9% 的 AP。 YOLOv6-S 以 495 FPS 的速度达到 43.5% 的 AP,优于同规模的其他主流检测器(YOLOv5-SYOLOX-SPPYOLOE-S)。
YOLOv6-S 量化版本甚至带来了 869 FPS 的最新 43.3% AP。此外,与具有相似推理速度的其他检测器相比,YOLOv6-M/L 还实现了更好的准确度性能(即 49.5%/52.3%)。


1、简介

YOLO 系列因其在速度和准确性之间的出色平衡而成为工业应用中最流行的检测框架。 YOLO 系列的开创性作品是YOLOv1-3,随着后期的实质性改进,开创了单阶段检测器的新路。 YOLOv4 将检测框架重组为几个独立的部分(backboneneckhead),并验证了当时的 bag-of-freebiesbag-of-specials,设计了一个适合在单 GPU 上训练的框架。目前,YOLOv5YOLOXPPYOLOEYOLOv7 都是高效检测器部署的竞争候选者。不同大小的模型通常通过缩放技术获得。

在本报告中,作者凭经验观察了几个促使更新 YOLO 框架的重要因素:

  1. RepVGG 的重参化是一种高级技术,尚未在检测中得到很好的利用。作者还注意到 RepVGG Block 的简单模型缩放变得不切实际,为此作者认为小型和大型网络之间的网络设计的优雅一致性是不必要的。普通的单路径架构对于小型网络是更好的选择,但对于较大的模型,参数的指数增长和单路径架构的计算成本使其不可行;

  2. 基于重参化的检测器的量化也需要细致处理,否则由于其在训练和推理过程中的异构配置,将难以处理性能下降。

  3. 以前的工作往往不太关注部署,其延迟通常在 V100 等高成本机器上进行比较。在实际服务环境方面存在硬件差距。通常,像 Tesla T4 这样的低功耗 GPU 成本更低,并且提供相当好的推理性能。

  4. 考虑到架构差异,标签分配和损失函数设计等高级特定领域策略需要进一步验证;

  5. 对于部署,可以容忍训练策略的调整,提高准确度性能但不增加推理成本,例如知识蒸馏。

考虑到上述观察,带来了 YOLOv6 的诞生,它在准确性和速度方面实现了迄今为止最好的权衡。在图 1 中展示了 YOLOv6 与其他类似规模的同行的比较。为了在不大幅降低性能的情况下提高推理速度,研究了包括训练后量化 (PTQ) 和量化感知训练 (QAT) 在内的尖端量化方法,并将它们纳入 YOLOv6 以实现部署就绪网络的目标。

YOLOv6 的主要方面总结如下:

  • 针对不同场景中的工业应用重新设计了一系列不同规模的网络。不同规模的架构各不相同,以实现最佳的速度和准确性权衡,其中小型模型具有简单的单路径主干,大型模型建立在高效的多分支块上。

  • YOLOv6 注入了一种self-distillation策略,在分类任务和回归任务上都执行。同时,动态调整来自教师和标签的知识,以帮助学生模型在所有训练阶段更有效地学习知识。

  • 广泛验证标签分配、损失函数和数据增强技术的先进检测技术,并有选择地采用它们以进一步提高性能。

  • RepOptimizer 和通道蒸馏的帮助下改进了检测的量化方案,这带来了具有 43.3% 的 COCO AP 和 869 FPS 的吞吐量的快速准确的检测器,批量大小为 32。

2、YOLOv6方法全解

YOLOv6 的改造设计包括以下组件,网络设计、标签分配、损失函数、数据增强、行业便利改进以及量化和部署:

网络设计:

  • Backbone:与其他主流架构相比, RepVGG 主干在相似的推理速度下在小型网络中具有更强的特征表示能力,但由于参数和计算成本的爆炸式增长,它很难扩展以获得更大的模型。在这方面,将 RepBlock 作为小型网络的构建块。对于大型模型,修改了一个更高效的 CSP Block,名为 CSPStackRep 块。

  • Neck:YOLOv6 的 Neck 采用 YOLOv4YOLOv5 之后的 PAN。使用 RepBlocksCSPStackRep Blocks 增强 Neck 以获得 Rep-PAN

  • Head:简化了 Decoupled Head,使其更高效,称为Efficient Decoupled Head

标签分配:

通过大量实验评估了 YOLOv6 上标签分配策略的最新进展,结果表明 TAL 更有效且对训练更友好。

损失函数:

主流的Anchor-Free检测器的损失函数包括分类损失、框回归损失和目标损失。对于每个损失,用所有可用的技术系统地对其进行试验,最后选择 VariFocal Loss 分类损失,SIoU/GIoU 损失作为回归损失。

行业便利的改进:

引入了额外的常见实践和技巧来提高性能,包括self-distillation和更多的训练时期。对于self-distillation,分类和框回归分别由教师模型监督。多亏了 DFL使得框回归的蒸馏成为可能。此外,来自Soft Label和Hard Label的信息比例通过余弦衰减动态下降,这有助于学生在训练过程中的不同阶段选择性地获取知识。此外,作者遇到了性能受损的问题,而在评估时没有添加额外的灰色边框,为此提供了一些补救措施。

量化和部署:

为了解决量化基于重参化模型的性能下降问题,使用 RepOptimizer 训练 YOLOv6 以获得对 PTQ 友好的权重。进一步采用 QAT 和通道蒸馏和图优化来追求极致性能。量化 YOLOv6-S 达到了最新的技术水平,AP 为 42.3%,吞吐量为 869 FPS(batch size=32)。

2.1、网络设计

单阶段目标检测器一般由以下部分组成:BackboneNeckHeadBackbone主要决定特征表示能力,同时,它的设计对推理效率有至关重要的影响,因为它承载了很大一部分计算成本。Neck用于将低层次的物理特征与高层次的语义特征进行聚合,然后构建各个层次的金字塔特征图。Head由几个卷积层组成,它根据Neck融合的多级特征预测最终检测结果。从结构的角度来看,它可以分为Anchor-BaseAnchor-Free,或者更确切地说是参数耦合Head和参数解耦Head

YOLOv6 中,基于硬件友好的网络设计原则,提出了两个可缩放的可重参数BackboneNeck以适应不同大小的模型,以及一个具有混合通道策略的高效解耦HeadYOLOv6 的整体架构如图 2 所示。

1、Backbone

如上所述,Backbone网络的设计对检测模型的有效性和效率有很大的影响。以前,已经表明多分支网络通常可以比单路径网络实现更好的分类性能,但它通常伴随着并行度的降低并导致推理延迟的增加。相反,像 VGG 这样的普通单路径网络具有高并行性和更少内存占用的优势,从而带来更高的推理效率。最近在 RepVGG 中,提出了一种结构重参化方法,将训练时多分支拓扑与推理时普通架构解耦,以实现更好的速度-准确度权衡。

受上述工作的启发,设计了一个高效的可重参化Backbone,表示为 EfficientRep。对于小型模型,Backbone的主要组成部分是训练阶段的 RepBlock,如图 3(a)所示。并且每个 RepBlock 在推理阶段被转换为具有 ReLU 激活函数的 3×3 卷积层(表示为 RepConv)的堆栈,如图 3(b)所示。通常,3×3 卷积在主流 GPUCPU 上进行了高度优化,并且具有更高的计算密度。因此,EfficientRep Backbone 充分利用了硬件的计算能力,在显着降低推理延迟的同时增强了表示能力。

然而,作者注意到随着模型容量的进一步扩大,单路径普通网络中的计算成本和参数数量呈指数增长。为了在计算负担和准确性之间取得更好的平衡,修改了一个 CSPStackRep Block 来构建中型和大型网络的Backbone。如图 3© 所示,CSPStackRep Block 由3个 1×1 卷积层和一堆子块组成,该子块由两个 RepVGG BlockRepConv(分别在训练或推理时)和一个残差连接组成。此外,采用跨级部分(CSP)连接来提高性能,而不会产生过多的计算成本。与 CSPRepResStage 相比,它的外观更加简洁,并考虑了准确性和速度之间的平衡。

2、Neck

在实践中,多尺度的特征集成已被证明是目标检测的关键和有效部分。 采用来自 YOLOv4YOLOv5 的修改后的 PAN 拓扑作为检测Neck的基础。 此外,将 YOLOv5 中使用的 CSPBlock 替换为 RepBlock(适用于小型模型)或 CSPStackRep Block(适用于大型模型),并相应调整宽度和深度。 YOLOv6Neck表示为 Rep-PAN

在这里插入图片描述

3、Head

Efficient decoupled head

YOLOv5 的检测头是一个耦合Head,在分类和定位分支之间共享参数,而 FCOSYOLOX 中的检测头将两个分支解耦,并且在每个分支中引入了额外的两个 3×3 卷积层以提高性能。

YOLOv6 中采用混合通道策略来构建更高效的解耦Head。 具体来说,将中间 3×3 卷积层的数量减少到只有一个。 头部的宽度由BackboneNeck的宽度乘数共同缩放。 这些修改进一步降低了计算成本,以实现更低的推理延迟。
在这里插入图片描述

Anchor-free

Anchor-free检测器因其更好的泛化能力和解码预测结果的简单性而脱颖而出。 其后处理的时间成本大大降低。 有两种类型的Anchor-free检测器:基于Anchor和基于关键点。 在 YOLOv6 中,我们采用了基于Anchor点的范式,其框回归分支实际上预测了Anchor点到边界框4个边的距离。

2.2、Label Assignment

标签分配负责在训练阶段为预定义的Anchor分配标签。以前的工作已经提出了各种标签分配策略,从简单的基于 IoU 的策略和内部真实方法到其他更复杂的方案。

SimOTA OTA 将目标检测中的标签分配视为最佳传输问题。它从全局角度为每个真实对象定义了正/负训练样本。 SimOTAOTA 的简化版本,它减少了额外的超参数并保持了性能。在 YOLOv6 的早期版本中使用 SimOTA 作为标签分配方法。然而,在实践中,作者发现引入 SimOTA 会减慢训练过程。而且陷入不稳定训练的情况并不少见。因此,希望更换 SimOTA

任务对齐学习任务对齐学习(Task Alignment Learning,TAL)最早是在TOOD中提出的,其中设计了一个分类分数和预测框质量的统一度量。 IoU 被这个指标替换以分配对象标签。在一定程度上缓解了任务错位(分类和框回归)的问题。 TOOD 的另一个主要贡献是关于任务对齐的头部(T-head)。 T-head 堆叠卷积层以构建交互式特征,在其之上使用任务对齐预测器 (TAP)。 PP-YOLOE 改进了 T-head,将 T-head 中的 layer attention 替换为轻量级的 ESE attention,形成 ET-head。然而,我们发现 ET-head 会降低模型中的推理速度,并且没有准确度增益。因此,保留了高效解耦头的设计。

此外,作者观察到 TAL 可以带来比 SimOTA 更多的性能提升并稳定训练。因此,采用 TAL 作为 YOLOv6 中的默认标签分配策略。

2.3、损失函数

1、Classification Loss

提高分类器的性能是优化检测器的关键部分。 Focal Loss 修改了传统的交叉熵损失,以解决正负样本之间或难易样本之间的类别不平衡问题。为了解决训练和推理之间质量估计和分类的不一致使用,Quality Focal LossQFL)进一步扩展了Focal Loss,联合表示分类分数和分类监督的定位质量。而 VariFocal Loss (VFL) 源于 Focal Loss,但它不对称地对待正样本和负样本。通过考虑不同重要性的正负样本,它平衡了来自两个样本的学习信号。 Poly Loss 将常用的分类损失分解为一系列加权多项式基。它在不同的任务和数据集上调整多项式系数,通过实验证明比交叉熵损失和Focal Loss损失更好。

YOLOv6 上评估所有这些高级分类损失,最终采用 VFL

2、Box Regression Loss

框回归损失提供了精确定位边界框的重要学习信号。 L1 Loss 是早期作品中的原始框回归损失。逐渐地,各种精心设计的框回归损失如雨后春笋般涌现,例如 IoU-series 损失和概率损失。

IoU-series Loss IoU loss 将预测框的四个边界作为一个整体进行回归。它已被证明是有效的,因为它与评估指标的一致性。 IoU的变种有很多,如GIoUDIoUCIoUα-IoUSIoU等,形成了相关的损失函数。我们在这项工作中对 GIoUCIoUSIoU 进行了实验。并且SIoU应用于YOLOv6-NYOLOv6-T,而其他的则使用GIoU

Probability Loss Distribution Focal Loss (DFL) 将框位置的基本连续分布简化为离散化的概率分布。它在不引入任何其他强先验的情况下考虑了数据中的模糊性和不确定性,这有助于提高框定位精度,尤其是在ground-truth框的边界模糊时。在 DFL 上,DFLv2 开发了一个轻量级的子网络,以利用分布统计数据与真实定位质量之间的密切相关性,进一步提高了检测性能。然而,DFL 输出的回归值通常比一般框回归多 17 倍,从而导致大量开销。额外的计算成本阻碍了小型模型的训练。而 DFLv2 由于额外的子网络,进一步增加了计算负担。在实验中,DFLv2 在模型上为 DFL 带来了类似的性能提升。因此,只在 YOLOv6-M/L 中采用 DFL

3、Object Loss

Object loss 最早是在 FCOS 中提出的,用于降低低质量边界框的得分,以便在后处理中将其过滤掉。 它还被用于 YOLOX 以加速收敛并提高网络精度。 作为像 FCOSYOLOX 这样的Anchor-free框架,在 YOLOv6 中尝试过 object loss。 不幸的是,它并没有带来很多积极的影响。

2.4、行业便利的改进

1、More training epochs

经验结果表明,检测器的性能随着训练时间的增加而不断进步。 作者将训练持续时间从 300 个 epoch 延长到 400 个 epoch,以达到更好的收敛性。

2、Self-distillation

为了在不引入太多额外计算成本的情况下进一步提高模型精度,应用了经典的知识蒸馏技术,最小化了教师和学生预测之间的 KL-divergence。 将老师限制为学生本身,但经过预训练,因此称之为自我蒸馏。

请注意,KL-divergence通常用于衡量数据分布之间的差异。 然而,目标检测中有两个子任务,其中只有分类任务可以直接利用基于 KL-divergence的知识蒸馏。 由于 DFL 损失,也可以在框回归上执行它。 知识蒸馏损失可以表示为:

L K D = K L ( p t c l s ∥ p s c l s ) + K L ( p t r e g ∥ p s r e g ) L_{K D}=K L\left(p_{t}^{c l s} \| p_{s}^{c l s}\right)+K L\left(p_{t}^{r e g} \| p_{s}^{r e g}\right) LKD=KL(ptclspscls)+KL(ptregpsreg)
其中 p t c l s p^{cls}_t ptcls p s c l s p^{cls}_s pscls 分别是教师模型和学生模型的类预测,因此 p t r e g p^{reg}_t ptreg p s r e g p^{reg}_s psreg 是框回归预测。 整体损失函数现在公式化为:
L total  = L det  + α L K D L_{\text {total }}=L_{\text {det }}+\alpha L_{K D} Ltotal =Ldet +αLKD
其中 L d e t L_{det} Ldet 是使用预测和标签计算的检测损失。 引入超参数α来平衡两个损失。 在训练的早期阶段,来自老师的软标签更容易学习。 随着训练的继续,学生的表现将与老师相匹配,因此硬标签将更多地帮助学生。 在此基础上,将余弦权重衰减应用于 α,以动态调整来自硬标签和来自教师的软标签的信息。

3、Gray border of images

作者注意到在 YOLOv5YOLOv7 的实现中评估模型性能时,每个图像周围都有一个半步长的灰色边框。 虽然没有添加有用的信息,但它有助于检测图像边缘附近的对象。 这个技巧也适用于 YOLOv6

然而,额外的灰色像素明显降低了推理速度。 没有灰色边框,YOLOv6 的性能会变差。 假设该问题与马赛克增强中的灰色边框填充有关。 进行了在最后一个时期关闭马赛克增强的实验(也称为淡入淡出策略)以进行验证。 对此,改变了灰色边框的区域,将带有灰色边框的图像直接调整为目标图像大小。 结合这两种策略,模型可以在不降低推理速度的情况下保持甚至提高性能。

2.5、量化与部署

对于工业部署,通常的做法是采用量化来进一步加快运行时间而不会对性能造成太大影响。 训练后量化(PTQ)直接量化模型,只需要一个小的校准集。 而量化感知训练(QAT)通过访问训练集进一步提高了性能,这通常与蒸馏结合使用。 然而,由于在 YOLOv6 中大量使用了重参化块,以前的 PTQ 技术无法产生高性能,而在训练和推理期间在匹配假量化器时很难结合 QAT

1、Reparameterizing Optimizer

RepOptimizer 在每个优化步骤提出梯度重参化。 该技术也很好地解决了基于重参化模型的量化问题。 因此,以这种方式重建 YOLOv6 的重参化块,并使用 RepOptimizer 对其进行训练以获得对 PTQ 友好的权重。 特征图的分布在很大程度上变窄了,这极大地有利于量化过程。

2、Sensitivity Analysis

通过将量化敏感操作部分转换为浮点计算来进一步提高 PTQ 性能。 为了获得灵敏度分布,通常使用几个指标,均方误差 (MSE)、信噪比 (SNR) 和余弦相似度。 通常为了比较,可以选择输出特征图(在激活某个层之后)来计算这些带有和不带量化的指标。 作为替代方案,通过打开和关闭特定层的量化来计算验证 AP 也是可行的。

在使用 RepOptimizer 训练的 YOLOv6-S 模型上计算所有这些指标,并选择前 6 个敏感层以浮动运行。

3、使用 Channel-wise Distillation 进行量化感知训练

如果 PTQ 不足,建议使用量化感知训练 (QAT) 来提高量化性能。 为了解决训练和推理过程中假量化器不一致的问题,有必要在 RepOptimizer 上构建 QAT。 此外,通道蒸馏(后来称为 CW Distill)适用于 YOLOv6 框架,如图 5 所示。 这也是一种自我蒸馏方法,其中教师网络是 FP32 精度的学生本身。

实验

消融实验

1、label assignment

2、损失函数

3、自蒸馏

4、Gray border of images

5、PTQ

6、QAT

SOTA对比

TensorRT部署实践对比

T4 GPU

V100 GPU

参考

[1] YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications

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

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

相关文章

云原生Docker搭建chemex资产管理系统

这篇文章主要讲解如何使用Ubuntu系统安装Docker应用并且搭建Chemex资产管理系统 Chemex数据是存在数据库的,为了方便备份以及管理容器。可利用外部的数据库或者Docker搭建一个数据库出来。我这里就在Docker容器中创建一个Mysql数据库供Chemex资产管理系统使用。 一…

QQ浏览器是如何提升搜索相关性的?

导言 | 搜索相关性主要指衡量Query和Doc的匹配程度,是信息检索的核心基础任务之一,也是商业搜索引擎的体验优劣最朴素的评价维度之一。本文作者刘杰主要介绍QQ浏览器搜索相关性团队在相关性系统及算法方面的实践经历。值得一提的是,本文会特别…

数组常用方法总结 (2) :sort / join / reverse / concat

sort 排序后会改变原有数组。简单数组和对象数组都可以进行排序。默认升序排序。 <template><div class"myBlock"><div class"tableBlock"><div class"title">{{ newObject ? "操作后的数组" : "操作…

NEW | GOT Online支持多模式采集、Mono分析支持IL2CPP打包

在性能优化时&#xff0c;你是否也遇到过这样的困扰&#xff1a;和性能相关的参数非常多&#xff0c;为什么能保障广度&#xff0c;就没法保障深度&#xff1f;这是因为数据的获取本身存在打点消耗&#xff0c;如果获取全量数据势必存在大量打点操作&#xff0c;导致收集的数据…

定时任务、cron表达式、springBoot整合定时任务和异步任务-58

一&#xff1a;定时任务 1.1 官网地址 http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html 1.2 cron表达式 Cron表达式是一个字符串&#xff0c;字符串以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&am…

Spring 教程

Spring 教程Spring 概述三层架构Spring 的优良特性使用 Spring 框架的好处依赖注入&#xff08;DI&#xff09;Spring 框架具有以下几个特点&#xff1a;1&#xff09;方便解耦&#xff0c;简化开发2&#xff09;方便集成各种优秀框架3&#xff09;降低 Java EE API 的使用难度…

如何集成GATEWAY作为网关(含网关404和503的解决办法)

新建model包 gateway 引入依赖 <dependencies><!--引入gateWay--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--新版本cloud去掉了负…

ESP32设备驱动-SHT31温度湿度传感器驱动

SHT31温度湿度传感器驱动 文章目录 SHT31温度湿度传感器驱动1、SHT31介绍2、硬件准备3、软件准备4、驱动实现1、SHT31介绍 SHT31 是 Sensirion 的下一代温湿度传感器。 它建立在一个新的 CMOSens 传感器芯片之上,该芯片是 Sensirion 新湿度和温度平台的核心。 与其前身相比,…

[数据库迁移]-LVM逻辑卷管理

[数据库迁移]-LVM逻辑卷管理 森格 | 2023年1月 1、本文旨在记录数据库迁移过程&#xff08;下云至机房&#xff09;中&#xff0c;对新磁盘做逻辑卷管理的过程&#xff0c;并对Linux的文件系统和分区做了相关介绍&#xff0c;如有不对之处&#xff0c;敬请指正。 2、对Linux文…

【实践】百度信息流推荐系统质效合一的交付系统建设

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年12月份热门报告盘点百度APP Feed流业务架构变迁思考和升级实践罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿《底层逻辑》高清配图‍基于深度学习的个性化…

数据结构:关于时间复杂度的例题计算

1、嵌套循环时间复杂度的计算 该程序&#xff0c;最上面的嵌套循环里&#xff0c;i每执行一次&#xff0c;j就执行N次&#xff0c;所以嵌套循环执行次数为N*N次&#xff1b;中间的k变量循环了2*N次&#xff1b;最后M变量循环10次。所以总共执行了 N*N2*N10 次&#xff01; 所以…

ERROR: Could not find a version that satisfies the requirement six>=1.9.0

问题分析 ERROR: Could not find a version that satisfies the requirement six>1.9.0 (from prompt-toolkit) (from versions: none) ERROR: No matching distribution found for six>1.9.0 出现这个问题的原因是python国内网络不稳定&#xff0c;用pip管理工具安装库…

websocket创建时附加额外信息 [如自定义headers信息(利用nginx)]

目录 情景描述&#xff1a; 解决方案 一、服务端要求前端创建websocket时附带的token&#xff0c;必须放在request的headers中&#xff08;常出现在第三方的合作中&#xff09;&#xff1b; 思路&#xff1a; 整体效果&#xff1a; 具体步骤&#xff1a; 二、服务端只需要获…

【Unity云消散】巩固step,lerp和smoothstep

之前在学习HLSL常用函数时就有涉及到范围相关的函数&#xff0c;但是最近做的东西发现step,lerp和smoothstep这三个函数总是一直在用&#xff0c;总是会在用的时候突然忘记他们分别是干啥的&#xff0c;这里就记录一下方便查看吧&#xff0c;形式大部分参考Unity Shader 极简实…

单绞机控制算法(线缆行业)

在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错误和不足之处,诚恳的欢迎大家批评和指正。 收放卷行业开环闭环控制算法 PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-CSDN博…

whistle本地代理线上(vue项目)

安装whistle install -g whistle 安装好后&#xff0c;cmd控制台启动whistle “w2 start” 访问whistle本地前端 127.0.0.1:8899 &#xff08;一般是这个网址&#xff09; 这里要注意如果您当前使用的是https类型的域名&#xff0c;需要安装https证书&#xff0c;这样才能代…

ShardingSphere的强制路由不起作用

开启注释 开启hint 然后使用注释去查询&#xff1a;/* ShardingSphere hint: dataSourceNameds_db */

本地数仓项目(三)—— 数据可视化和任务调度

1 背景 本文基于《本地数据仓库项目(一)——数仓搭建详细流程》和《本地数仓项目(二)——搭建系统业务数仓详细流程》数据为依托&#xff0c;实现数据可视化和任务调度 2 构造可视化数据 在mysql中新建ads_uv_count表 DROP TABLE IF EXISTS ads_uv_count; CREATE TABLE ads…

机器学习的一般框架

数据科学开发工具 anaconda&#xff1a;管理开发环境 jupyter&#xff1a;编写整个数据处理流程 pycharm&#xff1a;远程编写调试代码 ipdb&#xff1a;pycharm dubug时偶尔出现一些bug&#xff0c;可以用结合ipdb补充解决 数据开发六步 data 数据的获得、清洗、特征工程等…

1.数据结构(栈 队列 数组 链表)

栈 先进后出 后进先出 队列 先进先出 后进后出