本文总结:
YOLOv6各算法中各部件总结如下:
| 算法名称 | Backbone | Neck | Head | 卷积/激活函数 | cls loss | reg loss | 深度系数 | 宽度系数 | 标签分配 | epochs |
| YOLOv6n | EfficientRep | RepPANNeck | EffiDeHead | RepConv/ReLU | VFL | SIoU DFL=False | 0.33 | 0.25 | 3epoch前:ATSS 其他epoch:TAL | 400 |
| YOLOv6t | EfficientRep | RepPANNeck | EffiDeHead | RepConv/ReLU | VFL | SIoU DFL=False | 0.33 | 0.375 | 3epoch前:ATSS 其他epoch:TAL | 400 |
| YOLOv6s | EfficientRep | RepPANNeck | EffiDeHead | RepConv/ReLU | VFL | GIoU DFL=False | 0.33 | 0.50 | 3epoch前:ATSS 其他epoch:TAL | 400 |
| YOLOv6m | CSPRepBackbone (csp_e=2/3) | CSPRepPANNeck (csp_e=2/3) | EffiDeHead | RepConv/ReLU | VFL | GIoU DFL=True | 0.60 | 0.75 | 3epoch前:ATSS 其他epoch:TAL | 400 |
| YOLOv6l | CSPRepBackbone (csp_e=1/2) | CSPRepPANNeck (csp_e=1/2) | EffiDeHead | Conv/SiLU | VFL | GIoU DFL=True | 1.0 | 1.0 | 3epoch前:ATSS 其他epoch:TAL | 400 |
专栏链接:
https://blog.csdn.net/qq_39707285/article/details/124005405
此专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
本章目录
论文《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》2022.9.7。
YOLOv6 是美团视觉智能部研发的一款目标检测框架,致力于工业应用。本框架同时专注于检测的精度和推理效率,在工业界常用的尺寸模型中:YOLOv6-nano 在 COCO 上精度可达 35.0% AP,在 T4 上推理速度可达 1242 FPS;YOLOv6-s 在 COCO 上精度可达 43.1% AP,在 T4 上推理速度可达 520 FPS。在部署方面,YOLOv6 支持 GPU(TensorRT)、CPU(OPENVINO)、ARM(MNN、TNN、NCNN)等不同平台的部署,极大地简化工程部署时的适配工作。目前,项目已开源至Github,传送门:YOLOv6。
精度与速度远超 YOLOv5 和 YOLOX 的新框架。目标检测作为计算机视觉领域的一项基础性技术,在工业界得到了广泛的应用,其中 YOLO 系列算法因其较好的综合性能,逐渐成为大多数工业应用时的首选框架。至今,业界已衍生出许多 YOLO 检测框架,其中以 YOLOv5、YOLOX 和 PP-YOLOE最具代表性,但在实际使用中,我们发现上述框架在速度和精度方面仍有很大的提升的空间。基于此,我们通过研究并借鉴了业界已有的先进技术,开发了一套新的目标检测框架——YOLOv6。该框架支持模型训练、推理及多平台部署等全链条的工业应用需求,并在网络结构、训练策略等算法层面进行了多项改进和优化,在 COCO 数据集上,YOLOv6 在精度和速度方面均超越其他同体量算法,相关结果如下图 1 所示:

上图展示了不同尺寸网络下各检测算法的性能对比,曲线上的点分别表示该检测算法在不同尺寸网络下(s/tiny/nano)的模型性能,从图中可以看到,YOLOv6 在精度和速度方面均超越其他 YOLO 系列同体量算法。

上图展示了输入分辨率变化时各检测网络模型的性能对比,曲线上的点从左往右分别表示图像分辨率依次增大时(384/448/512/576/640)该模型的性能,从图中可以看到,YOLOv6 在不同分辨率下,仍然保持较大的性能优势。
本小节《概述》转自URL
根据经验分析以往YOLO系列及最新算法,观察到了几个重要因素,这些因素促使重新完善YOLO框架:
通过对以上问题的分析,提出了YOLOv6,在精度和速度方面实现了迄今为止最好的折衷。另外为了提高推理速度而不使性能有有太多退化,研究了最前沿的量化方法,包括 训练后量化(post-training quantization,PTQ)和 量化感知训练(quantization-aware training,QAT),并将其整合在YOLOv6中。
YOLOv6的关键点总结如下:
YOLOv6主要从以下几个方面进行改进, 网络设计、标签分配、损失函数、数据增强、工业便利化改进、量化和部署。
一阶段目标检测算法通常由 backbone、 neck和 head组成。
backbone主要决定特征表示能力,同时,其设计对推理效率有着至关重要的影响,因为它承担了大量的计算成本。
neck用于将低层物理特征与高层语义特征聚合,然后在各级建立金字塔特征图。
head由多个卷积层组成,并根据neck部的多级特征预测最终检测结果。从结构的角度来看,它可以分为anchor-based和anchor-free,或者更确切地说,分为参数耦合head和参数解耦head。
在YOLOv6中,提出了 两个缩放的可重参数化backbone和neck,以适应不同尺寸的模型,以及一个 具有混合通道(hybrid-channel)策略的高效解耦head(decoupled head)。总体结构图如图2所示。

backbone的设计中,多分支的网络(ResNet,DenseNet,GoogLeNet,)相比单分支(ImageNet,VGG)的通常能够有更好的分类性能。但是,它通常伴随着并行性的降低,并导致推理延迟的增加。相反,像VGG这样的普通单路径网络具有高并行性和较少内存占用的优点,从而导致更高的推理效率。最近在 RepVGG中,提出了一种结构重参数化方法,将训练时多分支拓扑与推理时平面结构解耦(训练时是多分支,推理时转化为单分支),以实现更好的速度-精度权衡。
RepVGG融合过程如下图所示:


根据以上分析的鼓舞,设计了一个高效的重参数化的backbone,命名为 EfficientRep。对于 小型模型,backbone的主要组成部分是训练阶段的 RepBlock,如图3(a)所示。并且在 推理阶段,每个RepBlock被转换为具有ReLU激活函数的3×3卷积层的堆叠(表示为 RepConv),如图3(b)所示。通常,3×3卷积在主流GPU和CPU上高度优化,并且具有更高的计算密度。因此,主干网的效率是充分的利用硬件的计算能力,从而显著降低了推理延迟,同时增强了表示能力。
然而,我们注意到,随着模型尺寸的进一步扩展,单路径普通网络的计算成本和参数数量呈指数增长。为了更好地平衡计算成本和准确性,修改了 CSPStackRep Block以构建中大型网络的backbone。如图3(c)所示, CSPStackRep Block由三个1×1卷积层和由两个具有残差连接的RepVGG block(训练阶段)或RepConv(推理阶段)组成的子块堆叠组成。此外,采用了CSP来提高性能,而不需要过多的计算成本。与CSPRepResStage(PP-YOLOE)相比,它具有更简洁的外观,并考虑了准确性和速度之间的平衡。
EfficientRep Backbone具体设计结构图如下图所示:

该插图转自URL
采用来自YOLOv4和YOLOv5的改进的 PAN结构作为我们检测neck的基础。此外,将YOLOv5中使用的 CSPBlock替换为RepBlock(适用于小型模型)或CSPStackRep Block(用于大型模型),并相应调整宽度和深度。YOLOv6的neck表示为 Rep-PAN。结构图如下图所示:

该插图转自URL
Efficient decoupled head:YOLOv5的检测头是一个耦合头,在分类和定位分支之间共享参数,而FCOS和YOLOX中的对应部分将两个分支解耦,并在每个分支中引入另外两个3×3卷积层以提高性能。
在YOLOv6中,采用了一种 混合通道(hybrid-channel)策略,以构建更高效的解耦头。具体而言,将中间3×3卷积层的数量减少到只有一个。head的宽度由backbone和neck的宽度乘数共同缩放。这些修改进一步降低了计算成本,以实现更低的推理延迟。
Anchor-free:anchor-free检测器因其更好的泛化能力和解码预测结果的简单性而脱颖而出。其后处理的时间成本显著降低。有两种类型的anchor-free检测器:point-based(YOLOX,FCOS)和keypoing-based(CenterNet)。在YOLOv6中,采用了 anchor-free point-based范式。
探讨了单路径结构和多分支结构对backbone和neck的影响,以及CSPStackRep块的通道系数(channel coefficient表示为CC)。本节实验所有模型均采用TAL作为标签分配策略,VFL作为分类损失,GIoU和DFL作为回归损失。结果如表2所示。

从结果可以发现,不同规模的模型的最佳网络结构应该用不同的解决方案。
对于 YOLOv6-N,单路径结构在精度和速度方面都优于多分支结构。尽管单路径结构具有比多分支结构更多的FLOPs和参数,由于相对较低的内存占用和较高的并行度,它也可以运行的更快。
对于 YOLOv6-S,这两种block的结果差不多。当涉及到更大的模型时,多分支结构在精度和速度上实现了更好的性能。最后,为 YOLOv6-M选择通道系数为 2/3的多分支,为 YOLOv6-L选择通道系数 1/2的多分支。

此外,还研究了neck的宽度和深度对YOLOv6-L的影响。表3中的结果表明, 在相同速度下,细长neck的性能比宽浅neck好0.2%。
YOLO系列激活函数各不相同,如ReLU、LReLU、Swish、SiLU、Mish等。在这些激活函数中,SiLU是使用最多的。一般来说,SiLU的精度更高,不会造成太多额外的计算成本。然而,在工业应用中,特别是在部署具有TensorRT加速的模型时,ReLU具有更大的速度优势,因为它融合到了卷积中。
此外,进一步验证了RepConv/普通卷积(表示为Conv)和ReLU/SiLU/LReLU组合在不同大小网络中的有效性,以实现更好的折衷。如表4所示,带有SiLU的Conv在精度上表现最佳, 而RepConv和ReLU的组合实现了更好的权衡。所以建议用户在 对延迟敏感的应用程序中使用RepConv和ReLU。

本文选择 使用RepConv/ReLU在YOLOv6-N/T/S/M中,用于更高的推理速度;在大型型号 YOLOv6-L中使用Conv/SiLU组合加速训练并提高性能。
选择YOLOv5-N作为基线,并逐步添加其他组件。结果如表5所示。

标签分配负责在训练阶段将标签分配给预定义的anchors。以前的算法提出的各种标签分配策略,从简单的基于IoU的策略和内部GT方法(FCOS)到其他更复杂的方案。(随后会有专门一遍文章来讲标签分配。)接下来介绍SimOTA和Task alignment learning。
SimOTA:OTA将目标检测中的标签分配视为最佳传输的问题。它从全局角度定义了每个GT目标的正/负训练样本。SimOTA是OTA的简化版本,它减少了额外的超参数并保持了性能。在YOLOv6的早期版本中,SimOTA被用作标签分配方法。然而,在实践中,发现引入SimOTA会减缓训练过程。而且,陷入不稳定训练的情况经常出现。因此,本文设计了一个 SimOTA的替代品。
Task alignment learning:任务对齐学习(TAL)在TOOD中首次提出,其中设计了分类分数和预测框质量的统一度量。IoU度量被替换为分配目标标签。在一定程度上,任务(分类和框回归)的错位问题得到了缓解。TOOD的另一个主要贡献是关于 任务对齐头(task-aligned head,T-head)。T-head堆叠卷积层以构建交互特征,在其上使用任务对齐预测器(Task-Aligned-Predictor,TAP)。PP-YOLOE通过将T-head中的层注意力替换为轻量级ESE attention,形成ET-head。然而,我们发现ET-head会降低我们模型中的推理速度,并且不会带来精度增益。因此,我们保留了高效去耦头的设计。
此外,我们观察到TAL比SimOTA能带来更多的性能改进,并能稳定训练。因此,我们 采用TAL作为YOLOv6中的默认标签分配策略。

在表6中,分析了主流标签分配策略的有效性。在YOLOv6N上进行了实验。如预期的,可以观察到SimOTA和TAL是最佳两种策略。与ATSS相比,SimOTA可使AP增加2.0%,TAL可使AP比SimOTA高0.5%。考虑到TAL的稳定训练和更好的精度性能,我们 采用TAL作为标签分配策略。

此外,TOOD的实现采用ATSS作为早期训练阶段的warm-up标签分配策略。我们还保留了warm-up策略,并对其进行了进一步的探索。详细信息如表7所示,可以发现,在没有warm-up或通过其他策略(即SimOTA)预热的情况下,它也可以实现类似的性能。
详细的损失函数介绍详见文章《深度学习知识点总结:损失函数总结_Mr.小梅的博客-CSDN博客_深度学习损失函数总结》。
目标检测包括两个自任务:分类和定位,对应于两个损失函数:classification loss和box regression loss。对于每个子任务,近年来提出了各种损失函数。在本节中,将介绍这些损失函数,并描述如何为YOLOv6选择最佳损失函数。
在目标检测框架中,损失函数由分类损失、框回归损失和可选对象损失组成,其可公式如下:

其中L_cls、L_reg和L_obj分别分类损失、回归损失和对象损失。λ和µ是超参数。
改进分类器的性能是优化检测器的关键部分。Focal Loss修改了传统的交叉熵损失,以解决正负样本或难易样本之间的类不平衡问题。为了解决训练和推理之间质量估计和分类的不一致使用,Quality Focal Loss(QFL)进一步扩展了Focal Loss,将分类分数和本地化质量联合表示用于分类监督。而VariFocal Loss(VFL)源于Focal Loss,但它不对称地处理正样本和负样本。通过考虑不同重要程度的正样本和负样本,它平衡了来自两个样本的学习信号。Poly Loss将常用的分类损失分解为一系列加权多项式基。它在不同的任务和数据集上调整多项式系数,通过实验证明其优于交叉熵损失和Focal Loss。
评估了YOLOv6上的所有高级分类损失,以 最终采用VFL(VariFocal Loss)。

在YOLOv6-N/S/M上实验了Focal Los、Polyloss、QFL和VFL。如表8所示,与Focal Loss相比,VFL对YOLOv6-N/S/M分别带来0.2%/0.3%/0.1%的AP改善。所以,本文选择 VFL作为分类损失函数。
框回归损失为精确定位边界盒提供了重要的学习信号。L1 Loss是早期工作中的原始框回归损失。逐渐地,各种精心设计的框回归损失如IoU系列Loss和Probability Loss如雨后春笋般涌现。
IoU-series Loss: IoU Loss将预测框的四个边界作为一个整体单位进行回归。由于其与评价指标的一致性,已被证明是有效的。IoU有许多变体,如GIoU、DIoU、CIoU、α-IoU和SIoU等,形成相关损失函数。对GIoU、CIoU和SIoU进行了实验。 SIoU应用于YOLOv6-N和YOLOV 6-T,而其他的使用GIoU。

IoU系列损失函数和概率损失函数都在YOLOv6-N/S/M上进行了实验。最新的IoU系列损失函数用于YOLOv6N/S/M。表9中的实验结果表明,对于 YOLOv6-N和YOLOv 6-T,SIoU Loss优于其他Loss,而对于 YOLOv6-M,CIoU Loss表现更好。
**Probability Loss:Dostronition Focal Loss(DFL)将框位置的基本连续分布简化为离散化概率分布。**它考虑了数据中的模糊性和不确定性,而不引入任何其他先验,这有助于提高框定位精度,特别是当GT框的边界模糊时。基于DFL,DFLv2开发了一个轻量级子网络,以利用分布统计和实际定位质量之间的密切相关性,进一步提高检测性能。然而,DFL通常输出比一般盒回归多17倍的回归值,导致大量开销。额外的计算成本显著阻碍了小模型的训练。而DFLv2由于额外的子网络而进一步增加了计算负担。在本文的实验中,DFLv2在我们的模型上带来了与DFL类似的性能增益。因此,我们 仅在YOLOv6-M/L中采用DFL。

对于概率损失,如表10所示,对于YOLOv6-N/S/M,引入DFL可分别获得0.2%/0.1%/0.2%的性能增益。然而,对于小模型,推理速度受到很大影响。因此, DFL仅在YOLOv6-M/L中引入。
FCOS中首次提出了Object Loss,以降低低质量边界框的分数,以便在后处理中过滤掉它们。在YOLOX中也使用了它来加速收敛并提高网络精度。作为一个像FCOS和YOLOX这样的anchor-free框架,本文尝试将Object Loss引入YOLOv6。不幸的是,它没有带来很多积极的效果。

如表11所示,还对YOLOv6进行了Object Loss实验。从表11可以看出,Object Loss对YOLOv6-N/S/M网络有负面影响,其中最大减少量为1.1%。负增益可能来自TAL中Object分支和其他两个分支之间的冲突。具体地说,在训练阶段,预测框和GT之间的IoU以及分类分数被用于共同构建度量作为分配标签的标准。引入的Object分支将要对齐的任务的数量从两个扩展到三个,这显然增加了难度。基于实验结果和该分析,然后在 YOLOv6中去除Object Loss。
下面的技巧可以在实际实践中使用。它们不是为了进行实验比较,而是在没有太多繁琐的工作的情况下稳定地产生性能增益。
实验结果表明, 随着训练时间的增加,检测器的性能不断提高。我们将训练时间从300个周期延长到400个周期,以达到更好的收敛。

在实践中,更多的训练周期是进一步提高准确性的简单而有效的方法。表12显示了针对300和400个epochs训练的小型模型的结果。可以观察到,针对更长时间epoch的训练分别用于YOLOv6-N、T和S,显著提高了AP 0.4%、0.6%和0.5%。考虑到可接受的成本和产生的增益,对于YOLOv6, 训练400个epochs是更好的收敛方案。
注意到,在评估YOLOv5和YOLOv7中的模型性能时,在每个图像周围放置了half-stride灰色边界(就是resize图片时四周填充了灰度的padding)。虽然没有添加有用的信息,但它有助于检测图像边缘附近的对象。这个技巧也适用于YOLOv6。
然而,额外的灰度像素明显降低了推理速度。如果没有灰色边界,YOLOv6的性能会恶化,这也是YOLOv5和YOLOv7中遇到的情况。我们假设该问题与Mosaic增强中的灰色边界填充有关。为了验证,进行了在最后一个epoch时关闭Mosaic增强的实验(又名衰退策略,fade strategy)。在这方面,我们改变了灰度边界的面积,并将具有灰度边界的图像直接调整为目标图像大小。结合这两种策略,我们的模型可以在不降低推理速度的情况下保持甚至提高性能。

实验结果如表14所示。在这些实验中,YOLOv6-N和YOLOV-S训练400个周期,YOLOv6-M训练300个周期。可以观察到,当去除灰色边界时,在没有 关闭Mosaic衰落策略的情况下,YOLOv6-N/S/M的精度降低了0.4%/0.5%/0.7%。然而,当关闭Mosaic衰落策略时,性能退化变为0.2%/0.5%/0.5%。可以发现,一方面,性能下降的问题得到了缓解。另一方面,无论是否填充灰色边界,小模型(YOLOv6-N/S)的精度都会提高。
将输入图像限制为634×634,并在边缘周围添加3像素宽的灰色边界。使用该策略,最终图像的大小为预期的640×640。表14中的结果表明,当最终图像尺寸从672减小到640时,YOLOv6-N/S/M的最终性能甚至更精确0.2%/0.3%/0.1%。
对于工业部署,通常采用量化来进一步加快运行时间,而不会影响性能。 训练后量化(post-training,PTQ)仅使用小的校准集直接量化模型。而 量化感知训练(quantization-aware training,QAT)使用训练集,其通常与蒸馏联合使用,进一步提高了性能。然而,由于在YOLOv6中大量使用了重参数化块,先前的PTQ技术无法产生高性能,而在训练和推理期间匹配伪量化器时,很难结合QAT。接下来介绍部署过程中的陷阱和解决方法。
RepOptimizer提议在每个step中进行梯度重参数化。该技术很好地解决了基于重参数化的模型的量化问题。因此,本文以这种方式重建了YOLOv6的重参数化Block,并使用RepOptimizer优化器对其进行训练,以获得PTQ-friendly权重。特征图的分布大大缩小(如图6),这大大利于量化过程。

通过将量化敏感操作部分转换为浮点计算,进一步提高了PTQ性能。为了获得灵敏度分布,通常使用几种度量,均方误差(MSE)、信噪比(SNR)和余弦相似性。通常,为了进行比较,可以选择输出特征映射(在激活某一层之后)来计算这些度量,包括量化和不量化。作为替代方案,也可以通过打开和关闭特定层的量化来计算验证AP。
在PTQ不足的情况下,本文提出使用 量化感知训练(quantization-aware training,QAT)来提高量化性能。为了解决训练和推理过程中伪量化器的不一致性问题,有必要 在RepOptimizer优化器上建立QAT。此外,如图5所示,在YOLOv6框架内采用了 通道式蒸馏(后来称为CW蒸馏)。这也是一种自蒸馏方法,其中teacher网络是FP32精度中的student本身。

简而言之,考虑到持续的工业需求,提出了YOLOv6,仔细分析了迄今为止目标检测器组件的所有进步。结果在精度和速度上都超过了其他可用的实时目标检测器。为了便于工业部署,还为YOLOv6提供了一种定制的量化方法,从而提供了前所未有的快速检测器。
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题
我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe
我使用irb。下面是我写的代码。“斧头”..“bc”我期待"ax""ay""az""ba"bb""bc"但结果只是“斧头”..“bc”我该如何纠正?谢谢。 最佳答案 >puts("ax".."bc").to_aaxayazbabbbc 关于ruby-从结束值创建一系列字符串,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7617092/
我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_