PicoDet论文译读笔记

2023-11-15

PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices

摘要

在目标检测中如何实现更好的精度-速度均衡是一个具有挑战性的问题。在本文中,作者致力于目标检测中关键组件的优化和神经网络架构的选择,以提升精度和效率。本文探索了anchor-free侧路在轻量级目标检测模型上的应用。本文增强了主干网络的结构;设计了neck部分的轻量型结构,此结果可以提升网络的特征提取能力。本文改进了标签分配策略(label assignment strategy)以及损失函数,使得训练更加得稳定高效。通过这些优化策略,本文创造出新型的实时目标检测器系列,命名为PP-PicoDet,此模型在移动设备上的目标检测实现了卓越的性能。与其它常见的模型相比,PicoDet实现了更好的速度和时延之间的均衡。PicoDet-S使用仅0.99M参数实现30.6%-mAP,与YOLOX-Nano相比,在mAP上具有4.8%的绝对值提升,同时在移动CPU推理时延下降55%;与NanoDet相比,在mAP上具有7.1%的绝对值提升。PicoDet在移动端ARM-CPU上达到了123-FPS(使用Paddle-Lite达到150-FPS),输入图像尺寸为320。PicoDet-S使用仅3.3M参数实现40.9%-mAP,与YOLOv5s相比,在mAP上具有3.7%的绝对值提升,且速度加快44%。代码和预训练模型开源在PaddleDetection仓库。

1 引言

  如图1所示,PicoDet模型在轻量级目标检测中远远优于最先进的结果。
在这里插入图片描述
目标检测被广泛应用于许许多多的计算机视觉任务中,包括自动驾驶、机器视觉、智能交通、工业质量检测和目标跟踪等。Two-stage模型常常具有更好的性能;然而,这类资源较高的网络常常会限制其在实际场景中的应用。为了克服这个问题,轻量级移动端目标检测模型已经吸引了越来越多研究者的兴趣,致力于设计更加高效的检测方法。现今YOLO系列【1_YOLOv3, 2_YOLOv4, 3_YOLOv5, 4_YOLOX】的目标检测方法变得十分流行,因为它们很好地考虑了资源的限制。相较于two-stage模型,YOLO系列模型具有更好的效率和较高的精度。然而,YOLO系列模型无法解决下面提到的这些问题:1)需要小心对锚框进行重新设计来适应于不同的数据集。2)正样本和负样本之间的不平衡问题,因为大多数生成的锚框都是负样本。
  近些年来,许多工作致力于发展更加高效的检测架构,例如anchor-free的检测器。FCOS【5_FCOS】解决了 GT labels之间重合的问题。相较于其它的anchor-free检测方法,FCOS不需要复杂的超参数调整。然而,大多数anchor-free模型都是用于大规模服务器的模型。有少数方法如NanoDet和YOLOX-Nano【4_YOLOX】既是anchor-free也是移动端的检测模型。其中的问题是轻量级anchor-free模型常常难以实现精度和效率之间的平衡。因此在本文中,受到FCOS和GFL【7_GFL】的启发,本文提出一种移动端友好且高效的anchor-free检测模型,命名为PP-PicoDet。总的来说,本文的主要贡献如下:

  • 本文使用CSP(Cross Stage Partial)结构来构建CSP-PAN作为neck部分。CSP-PAN用 1 × 1 1\times1 1×1卷积将neck所有分支的输入通道数全部统一为相同的通道数(96),从而能够有效的增强网络的特征提取能力,且减少网络参数。本文还将 3 × 3 3\times3 3×3可分离卷积增加到 5 × 5 5\times5 5×5可分离卷积(替换ShuffleNetv2中的Channel-Shuffle操作),从而增大感受野(reception field)。
  • 标签分配策略(label assignment strategy)在目标检测中是十分重要的。本文使用SimOTA【4_YOLOX】动态标签分配策略,并优化了一些计算细节。具体来说,本文使用 Varifocal Loss (VFL)【8_VFNet】和 GIoU loss【9_DIoU】来计算代价矩阵(cost matrix),在降低效率的情况下提高了精度。
  • ShuffleNetV2【10_ShuffleNetV2】是在移动端上计算高效。本文在此基础上改进了网络结构并提出了一种新的主干网络,称为 Enhanced ShuffleNet (ESNet),性能优于ShuffleNetV2。
  • 本文提出一种改进的用于检测的 One-Shot Neural Architecture Search (NAS)方法,;来自动找到目标检测的最优架构。本文直接在检测数据集上训练超网络,从而显着节省计算量并优化检测性能。本文中NAS生成的模型实现了更好的效率精度均衡。

  通过上述优化,本文提出了一系列大大超越轻量级SOTA结果的模型。如表1所示,
在这里插入图片描述
PicoDet-S以0.99M参数以及1.08G-FLOPs实现30.06%mAP。它在移动端ARM-CPU上实现了150FPS,输入尺寸为320。PicoDet-M在仅2.15M参数和2.5G-FLOPs的情况下实现34.3%mAP。PicoDet-L在仅3.3M参数和8.74G-FLOPs情况下实现40.9%mAP。本文提供了小、中、大三种模型来支持不同的部署场景。本文中所有的实验基于PaddlePaddle实现。代码和预训练模型可以在PaddleDetection【11_PaddleDetection】中获得。

2 相关工作

  目标检测是计算机视觉中的经典任务,旨在图像和视频中识别出物体的类别和位置。现有的目标检测模型,可以分为两类:anchor-based检测器和anchor-free检测器。Two-stage检测器【12_FastRCNN, 13_SPPNet, 14_FasterRCNN, 15_FPN, 16_MaskRCNN, 17_CascadeRCNN】通常都是anchor-based,会从图像中产生region-proposals,并从region-proposals产生最终的定位框。为了提升目标定位的精度,FPN【15_FPN】会融合多尺度高层的语义特征。Two-stage检测器在目标定位上常常更加精确,然而很难在CPU或ARM设备上实现实时检测。一阶段检测器【18_SSD, 19_YOLO9000, 1_YOLOv3, 2_YOLOv4, 3_YOLOv5, 20_PPYOLO, 21_PPYOLOv2, 4_YOLOX】也是anchor-based的检测模型,在速度和精度间有着更好的平衡,因此被广泛应用于实际场景。SSD【18_SSD】,会检测多个尺度的目标,对小物体更加友好,但是精度不高。同时,YOLO系列(除了YOLOv1【22_YOLOv1】)在精度和速度上表现较好。然而,仍然无法解决本文在之前章节中分析的问题。
  Anchor-free的检测器【23_Cornernet, 24_CenterKeypoint, 5_FCOS】旨在消除锚框,是目标检测研究中的重要进展。YOLOv1的主要思想是将图像分成多个网格,然后在物体中心点附近预测定位框。CornerNet【23_Cornernet】检测定位框的一对角点,因而不需要设计锚框作为先验框。CenterNet【25_CenterNet】去掉了左上角点和右下角点,直接检测中心点。FCOS【5_FCOS】首先以像素预测的方式重新构建模型,并提出“centerness”分支。Anchor-free检测器解决了一些anchor-based检测器存在的问题,降低了内存占用,并且对定位框的计算更加准确。
  后来的工作从多个方面提升了检测器的性能。ATSS【26_ATSS】提出自适应的训练采样选择方法,根据目标的统计特征来自动选择正负样本。GFL(Generalized Focal Loss)去掉了FCOS中的“centerness”分支,并将质量估计合并到类别预测向量中(译者注:这里的“质量”也就是可信度的意思),来形成定位质量和分类的联合表示。
  在移动端目标检测中,许多工作致力于实现更加准确高效的目标检测器。通过使用YOLOv4【2_YOLOv4】中的压缩-编译设计,YOLObile【27_YOLObile】在移动设备上实现了实时目标检测。PP-YOLO-Tiny【11_PaddleDetection】采用了MobileNetV3【28_MobileNetV3】的主干网络,以及基于PP-YOLO【 20_PPYOLO】的TinyFPN结构。NanoDet使用ShuffleNetV2【10_ShuffleNetV2】作为主干网络使模型更加轻量,并使用ATSS和GFL来提高精度。YOLOX-Nano是目前YOLOX【4_YOLOX】系列中最轻量的模型,使用动态标签分配策略SimOTA,在参数可接受的条件下实现最佳的性能。
  手工设计模型严重依赖于专家知识和繁琐试验。近些年来,NAS在发现和优化网络架构上展示出令人欣喜的成果,例如:MobileNetV3、EfficientNet【29_EfficientNet】和MnasNet【30_MnasNet】。NAS因此成为生成具有更好效率-精度均衡检测器的绝佳选择。One-shot NAS方法通过共享同样的权重来节省计算资源。近些年来许多 One-shot NAS工作致力于图像分类,例如:ENAS【31_ENAS】和SMASH【32_SMASH】。根据我们所知,很少有工作将NAS用于目标检测的任务。NAS-FPN【33_NASFPN】搜索特征金字塔网络(FPN)。DetNas【34_DetNas】首先在ImageNet上训练超网主干,然而在COCO上对超网络进行微调。MobileDets【35_MobileDets】使用NAS并提出一种增强搜索空间系列模型,以在移动设备上实现更好的时延-精度均衡。

3 方法

  在本章中,首先会介绍本文的设计思想和对更优主干网络的NAS搜索方法,这些会有助于提升精度和降低时延。之后,本文将提出对于neck和head模块的增强策略。最后,本文将描述使用的标签分类策略和其它用来提升性能的策略。

3.1 更好的主干网络

  手工设计主干网络。基于大量实验,本文发现ShuffleNetV2在移动设备上比其它网络具有更好的鲁棒性。为了进一步提升ShuffleNetV2的性能,本文遵循PP-LCNet【36_PP-LCNet】的一些方法来增强网络结构,并构建了新的主干网络,称为ESNet(Enhanced ShuffleNet)。图3具体地描述了ESNet中的ES-Block。
在这里插入图片描述
SE模块【37_SENet】能很好地对网络通道进行加权并获得更好的特征。因此,我们在所有blocks中加入了SE模块。类似于MobileNetV3,SE模块中两个layers的激活函数分别是ReLU和H-Sigmoid。Channel shuffle在ShuffleNetV2中提供了通道间的信息交换,但是也导致了特征融合的损失。为了解决这个问题,本文在stride为2时加入了 depthwise convolution和 pointwise convolution来结合不同通道的信息(图3a)。GhostNet【38_GhostNet】的作者提出了一种新型的Ghost模块能在较少参数量下产生更多特征图,从而提升网络的学习能力。本文在blocks中加入了Ghost模块并将stride设为1,来进一步增强ESNet的性能(图3b)。
  Neural Architecture Search(NAS)。同时,本文提出首个针对目标检测器的one-shot搜索的工作。目标检测模型搭配在分类上高性能的主干网络,可能会因为不同任务间的差异而性能下降。本文没有去搜索一个较佳的分类器,而是在检测数据集上训练和搜索检测的超网络,从而介绍了大量计算并且达到检测而不是分类的最优。此框架仅需两步:(1)在检测数据集上训练one-shot超网,(2)使用EA(evolutionary algorithm,进化算法)算法对训练好的超网络进行架构搜索。
  为了方便搜索,本文对主干网络仅使用channel-wise搜索。具体来说,本文给出了选择不同通道比率的弹性比率选项。本文会随机选择通道比率,粗略的选择范围是 [ 0.5 , 0.675 , 0.75 , 0.875 , 1 ] [0.5, 0.675, 0.75, 0.875, 1] [0.5,0.675,0.75,0.875,1]。举例来说,0.5表示宽度被调整为整个模型的0.5倍。通道数能被8整除,可以提高再硬件设备上的推理速度。因此,没有采取原始模型使用的通道数,本文首先对每个stage的block使用通道数 [ 128 , 256 , 512 ] [128, 256, 512] [128,256,512]来训练完整模型。所有的比率选项也会保持通道数为8的倍数。所选比率适用于每个块中的所有可修剪卷积。所有的输出通道都是固定的,与完整模型相同。为了避免繁琐的超参数调整,本文固定了所有在架构搜索中的原始设置。对于训练策略,本文采用了sandwich-rule,在每个训练迭代中,采样最大(full)和最小子模型以及六个随机子模型。训练策略中没有使用其它额外技术,如蒸馏,因为不同技术对不同模型的性能表现并不十分一致,尤其是对检测任务而言。最后,所选架构会在ImageNet数据集【39_ImageNet】上重新训练并在COCO【40_COCO】上微调训练。

3.2 CSP-PAN和 detector head

  本文使用PAN【41_PAN】结构来获得多层特征图以及CSP结构来进行相邻特征图间的特征连接和融合。CSP结构被广泛用于YOLOv4【2_YOLOv4】和YOLOX【4_YOLOX】的neck部分。在原始的CSP-PAN中,每个输出特征图的通道数与来自主干网络的输入特征图保持相同。对于移动设备来说,这样大通道数的结构具有昂贵的计算成本。为了解决这个问题,本文用 1 × 1 1\times1 1×1卷积使所有特征图中的通道数与最小的通道数相等,(也就是都设为96)。通过CSP结构实现top-down和bottom-up的特征融合。缩小的特征使得计算成本更低且不损失准确性。此外,本文还在原有CSP-PAN的顶部加入了一个特征图尺度分支来检测更多物体。与此同时,所有除了 1 × 1 1\times1 1×1卷积外的卷积层都使用 Depthwise Separable Convolution。深度可分离卷积使用 5 × 5 5\times5 5×5卷积扩大感受野。这种结构在使用很少参数的情况下给精度带来了大幅度提升。模块的具体结构如图2所示。
在这里插入图片描述
  在检测头中,本文使用 Depthwise Separable Convolution和 5 × 5 5\times5 5×5卷积来扩大感受野。深度可分离卷积的数量可以被设置为2、4或更多。整体的网络结构如图2所示。Neck和head部分都有四个尺度分支。本文中head部分的通道数与neck部分保持一致,并将分类和回归分支耦合在一起。YOLOX【4_YOLOX】使用参数更少的解耦预测头来提高精度。本文中耦合预测头在没有降低通道数时表现更好。参数和推理速度与检测头解耦基本相同。

3.3 标签分配策略和损失函数

  正负样本标签分配对目标检测模型有着本质的影响。大多数检测器使用fixed标签分配策略。这些策略十分简单。RetinaNet【44_RetinaNet&FocalLoss】直接用anchor跟真值的IoU来划分正负样本。FCOS【5_FCOS】将中心点在真值框内的anchors作为正样本,而YOLOv4【2_YOLOv4】和YOLOv5【3_YOLOv5】会将真值框中心点及其相邻的anchors都作为正样本。ATSS【26_ATSS】基于真值框最近anchors的统计特性来决定正负样本。上面提到的标签分配策略在整个训练过程中是保持不变的。SimOTA是一种会随着训练进程持续变化的标签分配策略,并且在YOLOX【4_YOLOX】中获得较好的效果。
  本文使用SimOTA动态标签分配策来优化训练过程。SimOTA首先通过中心点先验信息决定候选区域,之后计算候选区内真值跟预测框的IoU,最后对每个真值框将n个最大的IoU求和获得参数 κ \kappa κ。通过直接计算候选区内所有预测框跟真值框的损失作为代价矩阵。对于每个真值框,选最小 κ \kappa κ损失对应的锚点作为正样本。原始SimOTA使用CE-Loss和IoU-Loss的加权和来计算代价矩阵。为了跟SimOTA中的代价矩阵和目标函数对齐,本文使用Varifocal-Loss和GIoU-Loss的加权和作为代价矩阵。GIoU-loss的权重为 λ \lambda λ,这里设置为6,因为实验显示此设置是最好的。具体的公式为
c o s t = l o s s v f l + λ ⋅ l o s s g i o u cost = loss_{vfl}+\lambda\cdot loss_{giou} cost=lossvfl+λlossgiou
在检测head中,对于分类,本文使用Varifocal-Loss来耦合分类预测和置信度预测。对于回归,本文使用GIoU-Loss和Distribution-Focal-Loss。其公式如下:
l o s s = l o s s v f l + 2 ⋅ l o s s g i o u + 0.25 ⋅ l o s s d f l loss=loss_{vfl}+2\cdot loss_{giou} + 0.25\cdot loss_{dfl} loss=lossvfl+2lossgiou+0.25lossdfl
在以上所有公式中, l o s s v f l loss_{vfl} lossvfl指Varifocal-Loss, l o s s g i o u loss_{giou} lossgiou指GIoU-loss, l o s s d f l loss_{dfl} lossdfl指Distribution-Focal-Loss。

3.4 其它策略

  近年来出现了越来越多超越ReLU的激活函数。在这些激活函数中,H-Swish,一种简化版的Swish函数,计算更快并且对移动端更友好。本文将检测器中的激活函数从ReLU替换为H-Swish。在保持推理时延不变的情况下性能大幅度提升。
  不同于线性步长学习衰减,余弦学习衰减会以指数形式衰减学习率。余弦学习率会平缓地下降,从而对训练过程更有利,特别是当batch-size较大的时候。
  过多的数据增广会提高正则化效果而使得轻量模型更难以收敛。所以,本文只使用了随机翻转、随机裁剪和多尺度缩放作为训练中的数据增广。

4. 实验

4.1 实现细节

  对于训练,本文使用随机梯度下降(SGD),并设置动量0.9,权重衰减为4e-5。这里使用了余弦衰减的学习率策略,且初始学习率为0.1。Batch-size默认为80x8,使用8x32G-V100-GPU设备。本文训练了300个epochs,花费了2到3天。所有的实验在COCO-2017【40_COCO】训练集上训练,此训练集包含80类和118k张图像;实验在COCO-2017的验证集上评测,验证集包含5000张图像,评测使用标准的COCO-mAP指标,且使用单尺度测试。Exponential Moving Average(EMA)有效地利用了近期的信息并直观保持了长期影响。轻量级模型更容易陷入局部最优于是更加难以收敛。因此,本文引入了一种类似于正则化的机制,称为Cycle-EMA,用于重置历史信息,由 forget step来控制。
  对于架构搜索的任务,所有的超参数设置和用于超网络训练的数据集都与原始模型的设置相同,具体信息在下一章节中。本文使用L2-norm梯度裁剪来避免梯度爆炸。还有一个区别是本文在每一步中训练了八个候选模型,因为本文使用的搜索空间很大。

4.2 消融研究

  所有消融实验的结果如表2所示。
在这里插入图片描述
所有实验的评测是在COCO-2017验证集上进行的。
  CSP-PAN:本文首先建立了一个与NanoDet类似的基线模型,主干网络使用ShuffleNetV2-1x,neck部分使用不包含卷积的PAN,损失函数使用标准GFL【7_GFL】的损失函数,还有标签分配策略使用ATSS【26_ATSS】。所有的激活函数使用LeakyRelu。于是获得mAP(0.5:0.95)结果为25.3。除此之外,本文还使用了CSP-PAN结构。其中特征图尺度为3。于是mAP(0.5:0.95)提升到28.1。最终,本文在CSP-PAN顶部增加了一个特征图尺度(就是现在图中的结构),而增加的参数量不超过50K。mAP(0.5:0.95)分数则进一步提升至29.1。结果如表2所示。
  损失函数:本文在上一节的相同设置下比较了Varifocal-Loss(VFL)和Quality-Focal-Loss(QFL)的影响。这两种函数的结果十分相近,Varifocal-Loss的效果只比Quality-Focal-Loss稍微好一点。将VFL替换为QFL,mAP(0.5:0.95)分数从29.1提升到29.2。结果显示在表2中。
在这里插入图片描述
  标签分配策略:在上一节的相同设置下,本文用原始SimOTA和改进的SimOTA替换了ATSS。本文发现n越大,效果越差。超参数n于是被设为10。ATSS的性能与原始SimOTA几乎一样。本文改进的SimOTA的mAP(0.5:0.95)分数达到了30.0。结果显示在表2中。
  本文进一步比较了Varifocal-Loss和GIoU-Loss使用不同权重时SimOTA的效果。本文改变了公式(1)中 λ \lambda λ的值来进行消融实验。结果如表3所示。
在这里插入图片描述
当GIoU-loss的权重为6时,获得了最佳的结果。
  ESNet主干网络:本文在ImageNet-1k上比较了ESNet-1x与原始ShuffleNetV2-1.5x网络。表4展示了在推理时间更低的情况下,ESNet实现了更高的精度。
在这里插入图片描述
  本文还比较了原始模型和搜索模型的性能,结果如表5所示。
在这里插入图片描述
搜索的模型在实验限制下进降低了0.2%mAP,而移动端CPU推理时间提升了41.5%(使用PaddleLite达到54.9%)。本文将上述检测器的主干替换为ESNet-0.75x,参数数量降低了大约200K,mAP(0.5:0.95)最后达到29.7。结果显示在表2中。
在这里插入图片描述
  H-Swish激活函数:最后,我们将所有激活函数从LeakyRelu替换为H-Swish,mAP(0.5:0.95)最后提升到30.6。结果显示在表2中。

4.3 与SOTA算法的对比

  从表1中可知,可以看到本文的模型在精度和速度上都大大超过了所有的YOLO模型。
在这里插入图片描述
这些成绩主要归功于下面的改进:(1)本文的neck部分要比YOLO系列的neck要更加轻量,所以主干和head能分配更多参数。(2)本文使用针对类别不平衡的Varifocal-Loss、动态可学习的样本分配策略和基于FCOS的回归方法的组合,这种组合在轻量级模型中表现更好。在相同数量参数的情况下,PP-PicoDet-S在mAP和时延上都超越了YOLOX-Nano和NanoDet。PP-PicoDet-L的mAP和时延都优于YOLOv5s。由于使用汇编语言优化的卷积算子效率更高,本文发现本文模型在Paddle Lite上的推理时间甚至优于在NCNN上的推理时间。总结来说,本文的模型已经在很大程度上领先于SOTA模型。

5 结论和未来工作

  本文提供了一系列新的轻量级目标检测模型,这些模型在移动设备的目标检测任务中有着优秀的性能。据本文所知,本文的PP-PicoDet-S模型是首个mAP(0.5:0.95)超过30同时保持1M参数、ARM-CPU上100+FPS的模型。此外,PP-PicoDet-L模型在仅用3.3M参数的条件下mAP(0.5:0.95)超过了40。未来将继续探究新的技术,以提供更多高精度高效率的检测模型。

6 致谢

本工作受到了中国国家重点研发计划项目(2020AAA0103503)的支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PicoDet论文译读笔记 的相关文章

  • perl实现,匹配并打印一个段落

    有一个应用场景 实现后 觉得还是记录下来 以后还会遇到的 举例 根据 这样的行 匹配并打印该段落范围的所有行 另外一点 打印出的内容 只允许存在max最大值和min最小值 sdsdfsdf 1123123 1sdfs 2saas max 0
  • 最浅显易懂的Django系列教程(49)-redis教程

    redis教程 概述 redis是一种nosql数据库 他的数据是保存在内存中 同时redis可以定时把内存数据同步到磁盘 即可以将数据持久化 并且他比memcached支持更多的数据结构 string list列表 队列和栈 set 集合
  • 数据分析基础理论

    什么是数据分析 收集大量数据 研究和概括总结 提取有用的信息形成概 帮助做出判断 以便采取适当行动 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析 将他们加以汇总和理解 以求最大化的开发数据功能 发挥数据的作用 数据分析的价值
  • CentOS7网络配置

    本文是我从另外三个文章中整合而来 用于自存 如有侵权请联系我删除 CentOS 7教程 二 网络设置 知乎 zhihu com VMware安装 Linux下CentOS7的配置及网络环境的配置 最新版特别全 centos7 配置 Cong
  • GET和POST的区别、Promise的两个方法及POST请求常见的参数类型

    GET和POST的区别 可能有纰漏 区别 GET POST 参数的位置不同 GET把请求参数直接暴露在URL上 因此GET比POST更不安全 不能用来传递敏感信息 GET请求发送的参数会被完整的保留在浏览器历史记录里 POST把请求参数放在
  • springBoot的配置文件

    目录 配置文件的格式 1 配置项的分类和中文支持 2 properties 配置文件 读取配置文件 优缺点分析 3 yml 配置文件 读取配置文件 优缺点分析 4 多个配置文件 5 properties 和 yml 的对比 在 spring
  • 2.1/2.2 系统目录结构 2.3 ls命令 2.4 文件类型 2.5 alias命令

    这个是同学提供的 2 1 2 2 系统目录结构 系统的目录 tree命令 yum install y tree 以树形结构显示文件目录 显示如下特别注意一下目录 root boot dev etc home bin srv usr loca
  • S11、反射系数、回损、VSWR之间的换算

    文章目录 1 S参数 2 反射系数 3 电压驻波比 VSWR 4 回损 RL 5 换算表 6 反射功率系数 7 传输功率系数 8 统一转换 参考 在学习天线设计过程中 遇到许多经常出现的参数 总结一下避免以后每次都去查找资料 1 S参数 S
  • Springboot2整合mybatis-plus+swagger+druid

    一 简介 1 版本 springboot版本为2 0 5 RELEASE mybatisplus版本为2 1 9 2 项目地址 https gitee com wbsxch ssm git 3 留个记录 方便查找 开发步骤 1 新建spri
  • 第四课:循环(一遍又一遍/重复/啰嗦)结构

    第四课 循环 一遍又一遍 重复 啰嗦 结构 一 掌握while循环结构 其次于for 1 初始化循环变量 xxxxx 2 循环条件 while 条件表达式 3 循环操作 循环体 4 更新循环变量 循环出口 二 掌握do while循环 前期
  • Unity游戏开发面试问题总结(含答案)

    马上金九银十了 今天就来给大家说说关于面试题的内容 给大家整理了9道Unity面试基本都会问到的问题 初衷也很简单 就是希望在面试的时候能够帮助到大家 减轻大家的负担和节省时间 对于没有跳槽打算的也可以复习一下相关知识点 就当是查缺补漏 1
  • Python时间序列分析3-非平稳序列的随机分析-SRARIMA

    import pandas as pd import matplotlib pyplot as plt import numpy as np from datetime import datetime timedelta from time
  • 数据挖掘中基本概念--数据类型的属性与度量

    当我们在学习数据挖掘算法或者机器学习算法时 我们都会发现某些算法只能应用于特定的数据类型 所以在学习数据挖掘算法或者机器学习算法前我们需要对数据类型的属性度量有一个很清晰的了解 如果在数据类型这一步就出现问题 不管算法再怎么优异肯定也是白搭
  • 江西理工大学期末试卷c语言,2016年江西理工大学信息工程学院计算机应用技术(加试)之C语言程序设计复试笔试最后押题五套卷...

    一 选择题 1 设有函数定义 A B C D 答 A 则以下对函数sub 的调用语句中 正确的是 解析 函数的参数有两个 第一个是整型 第二个是字符类型 在调用函数时 实参必须一个是整型 一个是字符型相容的类型 整型 A 项中97为字符传入
  • NotePad++安装HEX-Editor插件

    在菜单栏点击插件 插件管理 搜索HEX Editor并打钩 点击安装 然后重新打开notepad 会发现工具栏多了一个H的符号 此时点击H 即可以16进制的形式读取当前文件 还是没有的话建议多试几次
  • Excel通用表头及单元格合并

    要在Java中实现XLS文件中的通用表头合并和单元格合并 您可以使用Apache POI库 下面是一个示例代码 展示了如何实现这两个功能 import org apache poi hssf usermodel import org apa
  • WIFI连接之WPA3-SAE介绍

    WPA3 SAE是WiFi Protected Access 3 Simultaneous Authentication of Equals 同等同时认证 的缩写 它是一种更安全的无线网络加密标准 用于保护WiFi网络的安全性和隐私 WPA

随机推荐

  • slf4j日志写文件配置

    logback spring xml 配置代码如下
  • css 文字两端对齐

    1 需求是这样的 用div css实现一个表单 要求表单中 输入框前面的label文字都两端对齐 效果如下 2 先贴出html代码 div class item box span 姓名 span div
  • 基于Linux及QT的即时通信系统的设计与实现

    基于Linux及QT的即时通信系统 写在前面 开发环境 系统概述 数据库表设计 服务器的数据库表 客户端的数据库表 实现结果 服务器效果展示 客户端效果展示 代码解释 服务器端代码 写在最后 写在前面 刚刚做完毕设 论文也查完重 有了时间写
  • 【LeetCode1114】按序打印————多线程

    思想 利用锁建立屏障 1 题目描述 我们提供了一个类 public class Foo public void one print one public void two print two public void three print
  • redis分布式锁的演变过程

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 直接添加Redis缓存 二 使用setnx执行抢锁过程 三 setnx获取锁 设置过期时间 四 引入UUID解决误删锁问题 五 引入Lua脚本来做删除 六 对递
  • element UI el-select 绑定值为对象时设置默认值

    适用场景描述 在项目中实现编辑功能时 如页面存在下拉框且下拉框的数据在点击相应的select时进行调用 在编辑时可能需要修改部分数据 而且存在部分下拉数据并不是必选项 如果直接获取所有的下拉数据 可能会造成浪费 需要在下拉框内显示已有的值作
  • 文件夹正在使用,无法删除 无法重命名等操作怎么办?

    大家好 我是Q站小编鹏仔 平时大家使用电脑删除临时文件夹或修改文件夹名称时 会提示 文件夹正在使用 操作无法完成 因为其中的文件夹或文件已在另一程序中打开 请关闭该文件夹或文件 然后重试 如下图所示 很多人就遇到这中问题 会发现我目前并未打
  • 插入排序的几种优化及测试结果

    插入排序很简单的了 于是我将算法的优化的第一站选在了这里 编程珠玑 在第十一章就首先讨论了这个问题 我写的基本版本 void insertSort1 int a int len int i int j int tmp for i 1 i l
  • Intellij IDEA 插件开发秘籍

    来这里找志同道合的小伙伴 这里总结一下 Intellij IDEA 插件开发的知识 供大家参考 本篇文章包含以下内容 开发环境搭建 Component 介绍 Extension Point And Extension 介绍 Service
  • 遥感+python 1.4 RPC校正

    遥感 python 1 4 RPC校正 目录 遥感 python 1 4 RPC校正 一 正射校正 二 RPC校正原理 三 代码实现 本章节 笔者主要讲述RPC校正的概念 原理 即代码实现 一 正射校正 正射校正一般是通过在像片上选取一些地
  • 【数据结构】有向无环图

    有向无环图 若一个有向图中不存在环 则称为有向无环图 简称DAG图 举例 比如有一棵树长这样 我们会发现它有重复的地方 将这两部分合并 还是有重复的地方 再次合并 总结规律 有向无环图中 未知变量不能重复 比如上例 只会有一个a b c d
  • Javascript基础第六天知识点以及案例:作用域、JS预解析、对象

    作用域目标 能够说出 JavaScript 的两种作用域 能够区分全局变量和局部变量 能够说出如何在作用域链中查找变量的值 1 作用域 1 1 作用域概述 通常来说 一段程序代码中所用到的名字并不总是有效和可用的 而限定这个名字的可用性的代
  • 慢速,混合和快速衰减模式。为什么我们要把事情复杂化?

    慢速 混合和快速衰减模式 为什么我们要把事情复杂化 如果你正在驱动感性负载 而它是有刷或无刷直流电机 步进电机 螺线管或继电器 你一定经历过一些问题 比如不需要的电流在不受欢迎的方向流动 如果你没有考虑到物理定律的这个事实 那么你有可能只有
  • caddy php h5ai,使用Docker快速安装H5ai网盘、内置HTML5视频播放器DPlayer

    说明 本镜像由iLemonrain大佬制作 使用的是LOC冻猫大佬修改的H5ai源码 其内置了HTML5视频播放器DPlayer 这里说下安装方法 安装 本镜像使用环境为Apache 2 4 PHP 7 1 1 安装Docker CentO
  • 每次都忘记:vscode把空格替换成换行符并换行显示

    勾选正则表达式 空格直接打 换行用 n
  • Cocos2d-x简单游戏<捕鱼达人>代码实现

    这个简单的捕鱼游戏Demo只是完成了简单的 1 场景切换 数据加载 武器等级更换 lt 大炮的升级 gt 2 鱼的随机游动 大炮发射子弹 撒网 捕鱼 3 子弹 鱼 网的碰撞检测等 4 场景及背景音乐的定时更换 碰撞时得音效 仅供参考 入门练
  • 100m光纤测速多少正常_光纤收发器的六个指示灯代表是什么意思?

    对光纤收发器这块了解的朋友应该知道 光纤收发器有6个LED指示灯 它们分别显示了收发器的工作状态 根据LED所示 我们就能判断出收发器是否工作正常和可能有什么问题 从而能帮助找出故障 那么 光纤收发器的六个指示灯分别代表什么意思 有哪些作用
  • 2015-2023年全球医疗器械公司100强(附细分领域排行)

    目录 2023全球医疗器械企业100强榜单 12家中国企业上榜 2022年度全球医疗器械公司100强排行榜 2021年全球医疗器械百强排行榜 2020年全球医疗器械企业100强公布 年份待定 2020全球医疗器械100强 2019年度全球医
  • JWT原理解析与实现

    1 Token与Session优缺点概述 1 1 Session的由来 在登录一个网站进行访问时由于HTTP协议是无状态的就是说一次HTTP请求后他就会被销毁 比如我在www a com login里面登录了 然后你就要访问别的了比如要访问
  • PicoDet论文译读笔记

    PP PicoDet A Better Real Time Object Detector on Mobile Devices 摘要 在目标检测中如何实现更好的精度 速度均衡是一个具有挑战性的问题 在本文中 作者致力于目标检测中关键组件的优