目标检测 | YOLO v1、YOLO v2、YOLO v3与YOLO v3 SPP理论讲解

☀️教程:霹雳吧啦Wz
☀️链接:https://www.bilibili.com/video/BV1yi4y1g7ro?p=1&vd_source=c7e390079ff3e10b79e23fb333bea49d

一、YOLO v1

在这里插入图片描述

针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,YOLO创造性的提出了one-stage目标检测算法。也就是将物体的定位和物体的分类在一个步骤中完成。该模型在的性能为45FPS,并在PASCAL VOC2007数据集的测试集上mAP为63.4,虽然相比Faster R-CNN的73.2mAP低很多,但大大加快了推理速度。

1.1 YOLO v1思想

(1)首先将一副图像划分成S×S个网格,如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。这里每个网格只预测一个object。

在这里插入图片描述

(2)网络输出:每个网格要预测B个bounding box,每个bounding box除了要预测位置之外,还要附带一个confidence值。另外,每个网格还要预测C个类别的分数。

在YOLO v1中,B一般取2,即每个网格单元预测两个边界框,每个边界框包括5个预测值: x , y , w , h x,y,w,h x,y,w,h,和置信度confidence。其中, x , y x,y x,y表示预测边界框的中心坐标(相对网格来说,值在0到1之间), w , h w,h w,h表示预测边界框的宽和高(相对图片来说,值在0到1之间),confidence的定义为 P r ( O b j e c t ) × I O U p r e d t r u t h Pr(Object)×IOU_{pred}^{truth} Pr(Object)×IOUpredtruth,即边界框内存在对象的概率乘以预测边界框和真实边界框之间的交并比。除此之外,每个网格单元还会预测 C C C个条件类别概率。所以最终网络的输出如下:

在这里插入图片描述

如图所示,输出为一个7×7×30的特征矩阵,沿深度方向的每一行都是一个网格的输出结果,其中包含两个预测框的共十个预测值和属于20分类中每一个类别的概率。

在测试的时候,对检测到的每一个目标的confidence定义为 P r ( C l a s s i ∣ O b j e c t ) × P r ( O b j e c t ) × I O U p r e d t r u t h Pr(Class_i|Object)×Pr(Object)×IOU_{pred}^{truth} Pr(ClassiObject)×Pr(Object)×IOUpredtruth,即类别概率与上面的置信度乘积。所以最终的confidence既包含了为某个目标的概率,也包含了预测的目标边界框和真实目标边界框的重合程度。

1.2 YOLO v1网络结构

在这里插入图片描述

网络输入:YOLOv1网络处理固定大小的输入图像,通常是448×448像素,这是为了适应网络中全连接层的固定输入尺寸。

卷积层和池化层:YOLOv1包含24个卷积层,使用1x1卷积和3x3卷积交替出现的方式来提取特征。1x1卷积层通常用来进行通道数的减少,从而降低参数数量和计算复杂度,而3x3卷积则负责提取空间特征。并且网络中使用了多个最大池化层,这些层通常跟在3x3的卷积层后面,用于降低特征图的空间维度,增加特征的局部感受野。

全连接层:在经过多个卷积层和池化层提取特征之后,YOLOv1网络使用了两个全连接层来进一步处理特征。第一个全连接层输出维度为4096,目的是为了保留足够的信息以供最终的检测任务使用。第二个全连接层根据输出需求计算而来,即7×7×30=1470,最终reshape为7×7×30形状。

NMS筛选层:筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box。这样就得到了最终的最合适的几个box和他们的类别。

1.3 YOLO v1损失函数

在这里插入图片描述

YOLO v1的损失函数分为三部分

边界框定位损失:对于每个网格单元中负责预测的那些边界框(即真实对象的中心落在该单元内的边界框),YOLOv1使用均方误差(MSE)来惩罚预测的边界框位置和尺寸与真实边界框的差异。具体来说,YOLOv1对边界框的中心坐标 ( x , y ) (x,y) (x,y)和宽高的平方根 ( w , h ) (\sqrt{w},\sqrt{h}) (w ,h )进行回归。使用平方根是为了减小大框和小框在损失中的不均衡影响,因为较大的框对于相同的位置或尺寸误差更不敏感,如下图所示:

在这里插入图片描述

损失函数中还引入了一个系数 λ c o o r d \lambda_{coord} λcoord(通常设置为5),以增大定位损失在总损失中的比重,从而强调对边界框位置精度的重视。

置信度损失:YOLOv1的置信度损失包括对象存在的置信度损失和对象不存在的置信度损失两部分。对于每个网格单元预测的边界框,如果该框是“负责”对象的,其置信度损失是预测置信度(预测框与实际框的交并比IOU)与1之间差值的平方;如果不是“负责”对象的,其置信度损失是预测置信度与0之间差值的平方。对于没有对象的边界框,还引入了一个权重 λ n o o b j \lambda_{noobj} λnoobj(通常小于1,如0.5),减小这部分损失对总损失的贡献,因为负样本(没有对象的框)通常远多于正样本。

类别损失:对于每个网格单元,YOLOv1使用平方误差来惩罚预测的类别概率和真实类别标签之间的差异。只有当网格单元内确实存在对象时,类别损失才会被计算,这部分损失的目的是确保正确分类网格单元中的对象。

1.4 YOLO v1总结

YOLO算法开创了one-stage检测的先河,它将物体分类和物体检测网络合二为一,都在全连接层完成。所以它大大降低了目标检测的耗时,提高了实时性。但它的缺点也十分明显:

  1. 每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。
  2. 原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差
  3. 最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
  4. 对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD对它有些优化,我们后面再看。

YOLO v1是没有采用Anchor的,它是直接预测出的位置信息,而不是基于Anchor来调整位置。

二、YOLO v2

在这里插入图片描述

YOLO v2是YOLO系列的第二代目标检测模型,相较于YOLO v1,YOLO v2在性能和准确性上有了显著提升,重点解决YOLO v1召回率和定位精度方面的不足。其在PASCAL VOC2007数据集的测试集上mAP最高可以达到78.6,相比YOLO v1提高了将近15个百分点,并且针对544×544的图片能达到40fps。

原论文名叫做YOLO9000是因为,该模型使用PASCAL VOC数据集和ImageNet数据集进行联合训练,最终模型能检测超过9000个类别。

2.1 YOLO v2思想

YOLO v2是在YOLO v1的基础上做了一系列的改进与尝试。

(1)Batch Normalization—批量归一化

CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,YOLO v2对网络的每一层的输入(每个卷积层后)都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会更快,同时提高了2%以上的mAP。Batch Normalization 也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。

(2)High Resolution Classifier—高分辨率分类器

YOLO v1中预训练使用的是分类数据集,大小是224×224 ,然后迁移学习,微调时使用YOLO模型做目标检测的时候才将输入变成448 × 448。这样改变尺寸,网络就要多重新学习一部分,会带来性能损失。

YOLO v2在预训练时就使用448×448的高分辨率下对分类网络进行训练,并且后续用同样的尺寸在目标检测网络中微调,使网络能够更好地适应更高分辨率的输入,从而提高了近4%的mAP。

(3)Convolutional With Anchor Boxes—带有Anchor Boxes的卷积

YOLO v1中是使用全连接层来直接预测边界框,其中边界框的坐标是相对于每个网格的,宽与高是相对于整张图片。由于各个图片中存在不同尺度和长宽比的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。

Faster R-CNN则不是直接预测目标边界框,而是使用手工挑选的先验Anchor Boxes。利用RPN预测的边界框是相对于Anchor Boxes的坐标和高宽的偏移offset。RPN在特征图的每个位置预测Anchor Box偏移量而不是坐标,简化了问题,使得网络更容易学习。

YOLO v2删掉了分类网络的全连接层和最后一个pooling层,使得最后的卷积层可以有更高分辨率的特征,缩小网络操作的输入图像为416×416,并且使用了Anchor Boxes。使用了Anchor之后,模型的mAP值从69.5降到了69.2,下降了约0.3,而召回率却从81%提高到了88%。

在这里插入图片描述

如图所示,YOLO v2在使用Anchor之后,类别概率是属于box的,每个box对应一个类别概率,而不是由网格决定,因此每个box对应25个预测值。每个网格携带的是 25 × 5 =125个信息,25是 xywh+置信度+分类数,5就是5个Anchor。

(4)Dimension Clusters—维度聚类(K-means聚类确定Anchor初始值)

Anchor Boxes的尺寸是手工指定了长宽比和尺寸,相当于一个超参数,这违背了YOLO对于目标检测模型的初衷,因为如果指定了Anchor的大小就没办法适应各种各样的物体了。

所以,YOLO v2在训练集的边界框上运行K-means聚类训练bounding boxes,可以自动找到更好的boxes宽高维度。

(5)Direct location prediction—直接的位置预测

在使用Anchor之后,模型不稳定,特别是在早期迭代期间。大多数不稳定性来自于对边框(x, y)位置的预测。根据RPN中的位置预测方法:
x = ( t x ∗ w a ) + x a x = (t_x * w_a)+x_a x=(txwa)+xa y = ( t y ∗ h a ) + y a y = (t_y*h_a)+y_a y=(tyha)+ya

这个公式是不受约束的,因此任何锚框可以出现在图像中的任何位置。在随机初始化的情况下,模型需要很长时间才能稳定到预测合理的偏移量。

YOLO v2改进为预测边界框中心点相对于对应网格左上角位置的相对偏移值。将网格归一化为1×1,坐标控制在每个网格内,同时配合sigmod函数将预测值转换到0~1之间的方法,做到每一个Anchor只负责检测周围正负一个单位以内的目标box。这样使模型更容易稳定训练,mAP值提升了约5%。

(6)Fine-Grained Features—细粒度的特征

YOLO v2提取了Darknet-19(backbone)最后一个maxpooling层的输入,得到26×26×512的特征图。经过1×1×64的卷积以降低特征图的维度,得到26×26×64的特征图,然后经过pass through层的处理变成13x13x256的特征图(抽取原特征图每个2x2的局部区域组成新的channel,即原特征图大小降低4倍,channel增加4倍),再与13×13×1024大小的特征图连接,变成13×13×1280的特征图,最后在这些特征图上做预测。

在这里插入图片描述

此操作最终使模型提升了1%的mAP。

(7)Multi-Scale Training—多尺度的训练

YOLOv2模型只使用了卷积和池化层,所以可以动态调整输入大小。每隔几次迭代就改变网络,而不是固定输入图像的大小。

具体操作为网络每10批训练后随机选择一个新的图像尺寸大小。由于模型下采样了32倍,从以下32的倍数{320,352,…,608}作为图像维度的选择。将网络输入调整到那个维度,并继续训练。这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在输入size较大时,训练速度较慢,在输入size较小时,训练速度较快,而multi-scale training又可以提高准确率,因此算是准确率和速度都取得一个不错的平衡。

(8)Darknet19—全新的backbone

在这里插入图片描述

大多数检测框架依赖于VGG-16作为基本的特征提取器。VGG-16是一个强大、精确的分类网络,但是它计算复杂。Darknet19与VGG模型类似,主要使用3×3的卷积,并在每个池化步骤后加倍通道数。使用全局平均池进行预测,并使用1×1卷积压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用BN层以加快模型收敛同时防止过拟合,最后用Average pooling层代替全连接层进行预测,整个网络共19个卷积层。注意在目标检测网络中使用时要去掉红框部分

2.2 YOLO v2网络结构

在这里插入图片描述

如图所示,YOLO v2的网络结构首先由Darknet19来提取特征,其中的每个Convolutional都包含一个卷积+BN+Leaky ReLU。将Darknet19的最后一层删除掉并增加了三个3×3的卷积层,每个卷积层有1024个卷积核,最后一个1×1的卷积层输出该网络需要输出的结果。例如,对于PASCAL VOC数据集,预测5个Anchor,每个Anchor有xywh+置信度+分类数共25个信息,所以最后输出结果的深度为125。此外,还将backbone中最后一个3×3×512的卷积层经过PassThrough Layer融合进了目标检测网络的倒数第2和第3个卷积层之间,来让模型使用细粒度特征。

2.3 YOLO v2总结

YOLO v2对比YOLO v1做了许多改进,其性能在各种检测数据集上比其他检测系统更快。此外,它可以在各种图像大小下运行,以在速度和精度之间提供平滑的折中。

对比YOLO v1,其所做改进包括:

  • 加了BN(卷积后,激活函数前)。
  • 加了高分辨率分类器。
  • 加了anchor(聚类得到个数,1个gird cell 生成5个anchor);
  • 限制预测框。
  • 加入细粒度特征(类似于concat的残差)加入对尺度训练。
  • 改进骨干网络(GoogleNet 变darknet-19)。
  • 通过WordTree将不同数据集结合联合训练,用一种新颖的方法扩充了数据集。

三、YOLO v3

在这里插入图片描述

YOLO v3在YOLO v2的基础上改良了网络的主干,利用多尺度特征图进行检测,改进了多个独立的Logistic regression分类器来取代softmax来预测类别分类。该篇论文是Joseph Redmon关于YOLO系列的最后一篇。

3.1 YOLO v3思想

YOLO v3中的几点改进:

(1)全新的backbone—Darknet53

YOLO v3修改了backbone,由Darknet19变为Darknet53。

在这里插入图片描述

Darknet53中包含了53个卷积层,与ResNet差不多,都是堆叠了一系列的残差结构,但不同的是Darknet53中是没有池化层的,而是通过卷积层的步长来对特征图进行尺度压缩。其主要改进如下:

  • 没有采用最大池化层,转而采用步长为2的卷积层进行下采样。

  • 为了防止过拟合,在每个卷积层之后加入了一个BN层和一个Leaky ReLU。

  • 引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。

  • 将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。

(2)多尺度融合

然后,YOLOv3借鉴了FPN的方法,采用多尺度的特征图对不同大小的物体进行检测,以提升小物体的预测能力。YOLOv3采用了3个不同尺度的特征图(三个不同卷积层提取的特征),通过下采样32倍、16倍和8倍得到3个不同尺度的特征图。例如输入416X416的图像,则会得到13X13 (416/32),26X26(416/16) 以及52X52(416/8)这3个尺度的特征图,不同尺度下的预测方法也不同。注意,在不同尺度融合的时候与FPN采用的对应维度相加不同,YOLO v2采用的是在深度方向上进行拼接。

下图给出了三个预测层的特征图大小以及每个特征图上预设边界框的尺寸(这些预设边界框尺寸都是作者根据COCO数据集聚类得到的):

在这里插入图片描述

由于在每个尺度上预测三个Anchor,所以最终的张量深度为 N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N×N×[3 * (4+1+80)] N×N×[3(4+1+80)],80为COCO数据集的类别个数。

(3)目标边界框的预测

在这里插入图片描述
(4)正负样本的匹配
在这里插入图片描述
如图所示,在实际实现的时候是计算每一个GT(Ground Truth)的三个AT模板的IoU,选择大于阈值的AT即可,这样有助于扩充正样本,而不是像论文一样只选择最大的IoU。

3.2 YOLO v3网络结构

在这里插入图片描述

3.3 YOLO v3损失函数

在这里插入图片描述

如图所示,YOLO v3损失的计算由置信度损失、分类损失和定位损失三部分组成。

置信度损失:

在这里插入图片描述

分类损失:

在这里插入图片描述

定位损失:

在这里插入图片描述

3.4 YOLO v3总结

在这里插入图片描述

四、YOLO v3 SPP

YOLO v3 SPP主要在YOLO v2的基础上增加了很多trick,涉及了很多篇论文。其中最主要的有三个trick:

  • Mosaic图像增强
  • SPP模块
  • CIoU Loss

4.1 Mosaic图像增强

Mosaic图像增强就是将多张图片组合在一起,使网络进行训练的方法。Mosaic 数据增强算法参考 CutMix数据增强算法。CutMix数据增强算法使用两张图片进行拼接,而 Mosaic 数据增强算法一般使用四张进行拼接,但两者的算法原理是非常相似的。它的优点有:

  • 增加数据多样性,随机选取四张图像进行组合,组合得到图像个数比原图个数要多。

  • 增强模型鲁棒性,混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标。

  • 加强批归一化层(Batch Normalization)的效果。当模型设置 BN 操作后,训练时会尽可能增大批样本总量(BatchSize),因为 BN 原理为计算每一个特征层的均值和方差,如果批样本总量越大,那么 BN 计算的均值和方差就越接近于整个数据集的均值和方差,效果越好。

  • Mosaic 数据增强算法有利于提升小目标检测性能。Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标。

4.2 SPP模块

在这里插入图片描述

YOLO v3 SPP中的SPP模块借鉴了上面的SPP-Net论文,其模块结构如下:

在这里插入图片描述

YOLO v3 SPP与YOLO v3不同之处就是在第一个预测特征层之前的Convolutional Set中间加入了上图所示的SPP模块。该模块最终的输出由四部分Concat而来,第一部分为模块的输入,第二部分为输入经过一个5×5的下采样,第三部分为输入经过一个9×9的下采样,第四部分为输入经过一个13×13的下采样。这四部分在channel方向上进行拼接,使得输出的channel数比输入的channel翻了4倍。经过此操作,实现了不同尺度的特征融合。

4.3 CIoU Loss

在之前的YOLO v3中,定位损失采用的是L2损失。然而L2损失不能很好的反应两个边界框重合的程度。那么在YOLO v3 SPP中将引入CIoU Loss,该损失函数是从IoU Loss发展而来。

IoU Loss:最基本的度量方法,计算预测框与真实框的交集和并集的比例。其主要缺点是当两个框不重叠时,IOU为0,这导致无法提供梯度更新。

在这里插入图片描述

GIoU Loss:在IOU的基础上增加了一个衡量两个框“最小闭合区域”的概念,解决了非重叠框的梯度问题,但仍未考虑框的形状差异和中心点偏移。

在这里插入图片描述

DIoU Loss:除了包含GIOU的所有优点外,还添加了一个度量预测框和真实框中心点距离的项。这有助于更快的收敛速度,尤其是在中心点偏移显著的情况下。

在这里插入图片描述

CIoU Loss:在DIOU的基础上进一步增加了一个关于宽高比(aspect ratio)的度量,这使得损失函数不仅考虑了框的重叠区域和中心距离,还考虑了框的形状差异。

在这里插入图片描述

4.4 YOLO v3 SPP网络结构

在这里插入图片描述

参考链接

[1] https://www.cnblogs.com/jins-note/p/11209384.html

[2] https://blog.csdn.net/weixin_43334693/article/details/129087464

[3] https://blog.csdn.net/weixin_43334693/article/details/129143961

[4] https://space.bilibili.com/18161609/channel/seriesdetail?sid=244160

[5] https://blog.csdn.net/dgvv4/article/details/123988282

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

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

相关文章

2024-07-20 Unity插件 Odin Serializer2 —— 序列化教程

文章目录 1 由根对象决定序列化2 实现 Odin 序列化器2.1 继承已有序列化类2.2 自定义序列化类 3 避免 Unity 无限深度警告4 指定序列化秘钥4.1 External String Reference Resolver4.2 External GUID Reference Resolver4.3 External Index Reference Resolver 4 功能与限制4.1…

为什么我不建议用Excel做进销存系统?

进销存管理系统是一个企业中非常关键的部分,它涉及商品的采购、销售和库存管理等复杂流程。虽然EXCEL作为一个办公软件,它的通用性和灵活性使其能够处理这类数据,但实际上,使用它来构建专业的进销存管理系统存在一些明显的局限性。…

haproxy服务介绍

haproxy 搭建使用开启HAProxy的界面UI配置负载均衡配置web代理 HAProxy(High Availability Proxy)是一个高性能的TCP/HTTP负载均衡器和代理服务器,广泛用于提升Web应用的可用性和性能。[官网说明](https://docs.haproxy.org/2.8/intro.html#3…

NLP: 词袋模型和TFIDF模型

文章目录 词袋模型TF-IDF模型词汇表模型 词袋模型 文本特征提取有两个非常重要的模型: 词集模型:单词构成的集合,集合自然每个元素都只有一个,也即词集中的每个单词都只有一个。 词袋模型:在词集的基础上如果一个单词…

autoxjs的安装与配置

AutoxJs 是一个基于 JavaScript 的自动化工具,用于在 Android 平台上创建自动化脚本。它是在原 Auto.js 项目的基础上继续维护和升级而来的。 AutoxJs 的优势主要包括以下几点: 无需 root 权限:可以在没有 root 权限的设备上运行大部分功能&…

JavaWeb系列二十三: web 应用常用功能(文件上传下载)

文件上传下载 基本介绍文件上传基本原理文件上传应用实例文件上传注意事项和细节 文件下载基本原理文件下载应用实例文件下载注意事项 ⬅️ 上一篇: JavaWeb系列二十二: 线程数据共享和安全(ThreadLocal) 🎉 欢迎来到 JavaWeb系列二十三: web 应用常用功能(文件上传…

创建最佳实践创建 XML 站点地图--SEO

您是否正在努力让您的网站被搜索引擎索引?您想提高您网站的搜索引擎知名度吗?如果是,您可能会错过 XML 站点地图的重要性。XML 站点地图在改善您网站的 SEO 方面发挥着至关重要的作用。‍ XML 站点地图是您网站结构的蓝图,可帮助…

YOLOv5项目梳理

1 项目介绍 参考项目:YOLO项目 1.1训练模型 YOLOv5模型 train.py 训练预训练模型 ... ... def parse_opt(knownFalse):# 命令行参数解析器初始化parser argparse.ArgumentParser()# 初始权重路径,默认为 ROOT / yolov5s.pt,用于指定模…

Navicat 17 for Mac 数据库管理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1. 双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕。2. 应用程序/启动台显示Navicat图标,表示安装成功。 二、运行测试运行后提示:“Navicat Premium.pp”已损坏&#x…

在qt的c++程序嵌入一个qml窗口

//拖拽一个QQuickWidget c端和qml通信的桥梁 找到qml的main.qml的路径 ui->quickWidget->setSource(QUrl::fromLocalFile("../../../code/main.qml"));// QML 与 Qt Widgets 通信//窗口就成了一个类实例对象pRoot (QObject*)ui->quickWidget->rootObje…

redis面试基础知识

redis的数据类型 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样: 五种基本数据类型 Redis 通用命令 通用指令是部分数据类型的,都可以使用的指令,常见的有: KEYS&#xff…

思维(交互题),CF 1990E2 - Catch the Mole(Hard Version)

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 E2 - Catch the Mole(Hard Version) 二、解题报告 1、思路分析 考虑每次误判都会让鼹鼠上升一层,相应的,最外层的一层结点都没用了 由于数据范围为5000,我们随便找个叶子…

Electron案例解析-编写一个简单的electron程序

index.html <!DOCTYPE html> <html> <head><meta charset"UTF-8" /><!-- 内容安全策略--><metahttp-equiv"Content-Security-Policy"content"default-src self; script-src self"/><metahttp-equiv&quo…

C语言-栈和队列

文章目录 &#x1f3af;引言&#x1f453;栈和队列1.栈1.1栈的概念与结构1.2栈的实现 2.队列2.1队列的概念与结构2.2队列的实现 &#x1f947;结语 &#x1f3af;引言 欢迎来到HanLop博客的C语言数据结构初阶系列。在之前的文章中&#xff0c;我们详细介绍了链表及其操作方法。…

8年前端总结和感想(转)~

我是牛奶&#xff0c;本文是我前端工作 8 年的一些总结和感想 主要记录下个人点滴、前端知识点、场景应用、未来的憧憬以及个人规划&#xff0c;供自己以后查漏补缺&#xff0c;也欢迎同道朋友交流学习。 自我介绍 我是一名工作在非知名公司的 8 年前端&#xff0c;双非普通本…

JMeter使用手册

安装 下载地址 https://jmeter.apache.org/download_jmeter.cgi 下载后解压到win的文件夹中 打开JMeter的bin文件夹&#xff0c;双击这个jar就启动了JMeter 启动 出现这样的界面 基本使用 添加变量 这个变量在使用的时候可以被引用 创建线程组 所有的请求都得基于…

Linux:Linux进程概念

目录 前言 1. 冯诺依曼体系结构 2. 操作系统 2.1 什么是操作系统 3. 进程 3.1 基本概念 3.2 描述进程——PCB 3.3 进程和程序的区别 3.4 task_struct-PCB的一种 3.5 task_struct的内容分类 4. 查看进程 4.1 通过系统文件查看进程 4.2 通过ps指令查看进程 4.3 …

lse:一款专为渗透测试和CTF设计的Linux枚举工具

关于linux-smart-enumeration linux-smart-enumeration是一款专为渗透测试和CTF设计的Linux枚举工具&#xff0c;该工具可以帮助广大研究人员收集与本地Linux系统安全相关的信息。 工具特性 该工具从2.0版本开始符合POSIX标准&#xff0c;并且经过了shellcheck和posh测试。它…

前端三大主流框架Vue React Angular有何不同?

前端主流框架&#xff0c;Vue React Angular&#xff0c;大家可能都经常在使用&#xff0c;Vue React&#xff0c;国内用的较多&#xff0c;Angualr相对用的少一点。但是大家有思考过这三大框架的不同吗&#xff1f; 一、项目的选型上 中小型项目&#xff1a;Vue2、React居多…

【数据结构-前缀和】力扣2550.统计范围内的元音字符串数

给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。 每个查询 queries[i] [li, ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内&#xff08;包含 这两个值&#xff09;并且以元音开头和结尾的字符串的数目。 返回一个整数数组&#xff0c;其中…