【目标检测类】YOLOv5网络模型结构基本原理讲解

1. 基本概念

YOLOv5模型结构主要包括以下组成部分:‌

  • 输入端:‌YOLOv5的输入端采用了多种技术来增强模型的性能,‌包括Mosaic数据增强、‌自适应锚框计算、‌以及自适应图片缩放。‌这些技术有助于提高模型的泛化能力和适应不同尺寸的输入图像。‌

  • Backbone:‌Backbone部分是YOLOv5模型的核心,‌它采用了CSP-Darknet53结构。‌这种结构结合了CSP(‌Cross Stage Partial Network)‌技术和Darknet架构,‌通过减少计算量和参数数量同时保持高效的特征提取能力。‌此外,‌Focus结构作为一种有效的特征融合技术,‌在Backbone的开始部分被使用,‌以提高模型对小目标的检测能力。‌

  • Neck:‌Neck部分采用了FPN(‌Feature Pyramid Networks)‌+PAN(‌Path Aggregation Network)‌结构,‌这种结构能够在不同的特征图层次上进行检测,‌融合来自不同特征图层次的信息,‌从而提高目标检测的性能。‌

  • Prediction:‌在Prediction部分,‌YOLOv5使用了CIOU_Loss作为损失函数,‌这种损失函数可以缓解目标检测中类别不平衡的问题,‌提高模型的性能。‌此外,‌非极大值抑制(‌NMS)‌技术也在输出端被应用,‌对重叠的目标框进行处理,‌以得到最终的检测结果。‌

2.输入端

‌YOLOv5的输入端采用了多种技术来增强模型的性能,‌包括Mosaic数据增强、‌自适应锚框计算、‌以及自适应图片缩放。

2.1 Mosaic数据增强

Mosaic图像增强是一种数据增强技术,‌通过将多张图片按照一定比例组合成一张图片,‌以增加数据的多样性和丰富性,‌从而提高模型的训练效果和泛化能力。‌

Mosaic图像增强的原理主要涉及以下几个步骤:‌

  • 构建底图:‌首先,‌构建一张较大的底图,‌其尺寸通常大于输入图像的尺寸,‌例如2176*2176,‌并且底图通常为灰色(‌R114,G114,B114)‌。‌
  • 选择拼接点:‌在底图上选择一个拼接点,‌这个点通常位于底图的中心位置,‌例如点A(544,544)和点B(1632,1632)限定的矩形内。‌
  • 图像裁剪与拼接:‌随机选择四张图像,‌根据之前确定的拼接点,‌分别在这四张图像上裁剪出相应的区域,‌并将这些区域拼接到底图上。‌

实战代码模块的YOLOv5s的项目代码中,设置了两种类型,分别是Mosaic4 load和Mosaic9 load,这是两种不同的数据增强方式,它们的区别在于使用的图像数量不同。

  • Mosaic4 load会随机选择4张不同的图像,并将它们拼接在一起,形成一张包含4个不同图像的大图像。然后,将大图像作为训练集中的一张图像,对其进行数据增强操作,如随机裁剪、大小变换等。这样可以增加训练集的多样性和难度,提高目标检测模型的鲁棒性和泛化能力。
  • Mosaic9 load则会随机选择9张不同的图像,并将它们拼接在一起,形成一张包含9个不同图像的大图像。然后,对大图像进行数据增强操作,如随机裁剪、大小变换等。这样可以进一步增加训练集的多样性和难度,提高模型的鲁棒性和泛化能力。

总之,Mosaic4 load和Mosaic9 load都是用于数据增强的方法,它们的区别在于使用的图像数量不同,Mosaic9 load使用的图像数量更多,相应地增加了训练集的多样性和难度,但也增加了计算量和训练时间。

Mosaic图像增强的优点包括:‌

  • 增加数据多样性:‌通过组合多张图片,‌可以生成大量新的、‌具有丰富背景和目标的训练样本,‌从而增加模型的泛化能力。‌
  • 提高batch_size:‌由于四张图片拼接在一起,‌相当于在一个batch中提供了更多的信息,‌这在训练深度学习模型时可以提高训练效率和准确性。‌

然而,‌Mosaic图像增强也存在潜在的缺点,‌特别是在处理包含小目标的数据集时。‌如果数据集中本身就有很多小目标,‌数据增强之后可能会导致这些小目标在拼接后的图像中变得更小,‌从而影响模型的泛化能力。‌因此,‌在使用Mosaic图像增强时,‌需要权衡其带来的好处与可能带来的问题,‌确保模型训练的效果和泛化能力达到最佳。

补充:
YOLOv5图像增强支持多种模式,包括以下几种:

  • Mosaic模式:将四张不同的图像拼接成一张图像,用于增加数据集的多样性。
  • Random模式:包含多种图像增强方式,如随机缩放、随机裁剪、随机旋转、随机亮度调整、随机对比度调整等,可以随机地选择其中一种或多种方式进行图像增强。
  • MixUp模式:将两张不同的图像进行混合,用于增加数据集的多样性和防止过拟合。
  • CutMix模式:将两张不同的图像进行裁剪混合,用于增加数据集的多样性和防止过拟合。
  • GridMask模式:通过在图像中加入遮罩,可以增加数据集的多样性和防止过拟合。
  • AutoAugment模式:通过搜索最优的数据增强策略来提高模型的性能。

2.2  自适应锚框计算

自适应锚框计算是一种在目标检测模型中,‌特别是YOLO系列模型中,‌用于优化锚框设置的方法。‌这种方法旨在根据训练数据集的特性,‌自动调整锚框的大小和数量,‌以提高模型的检测性能。‌自适应锚框计算的实现通常涉及以下几个步骤:‌

  • 数据预处理:‌在进行锚框计算之前,‌通常需要对训练数据进行预处理,‌包括图像的缩放、‌裁剪、‌归一化等操作,‌以确保输入数据的一致性和标准化。‌

  • 白化操作:‌白化操作旨在去除输入数据的冗余信息,‌通过降低特征之间的相关性并使所有特征的方差相等,‌从而优化数据的分布,‌便于后续的锚框计算。‌

  • 锚框计算:‌根据预处理后的数据,‌使用聚类算法(‌如K-means算法或其改进版K-means++算法)‌对目标框的尺寸进行聚类,‌以找到与数据集最匹配的锚框尺寸。‌这个过程考虑了目标框的大小和形状分布,‌以确保锚框能够覆盖大多数目标的大小和形状变化。‌

  • 遗传算法:‌在某些情况下,‌遗传算法被用来优化锚框的选择,‌通过模拟自然选择和遗传进化的过程,‌搜索到最优的锚框配置。‌

  • 调整与验证:‌根据计算结果调整锚框的设置,‌并在验证集上进行验证,‌以确保新的锚框设置能够提高模型的检测性能。‌

通过自适应锚框计算,‌YOLO系列模型能够更好地适应不同的数据集,‌提高目标检测的准确性和效率。

自适应锚框计算的方法主要有两种:

  • Anchor-free方法:该方法直接回归目标的位置和尺寸,不需要使用锚框。典型的Anchor-free方法包括CenterNet和CornerNet等。
  • Anchor-based方法:该方法使用锚框来检测目标,但是锚框的大小和宽高比等参数是根据输入图像自适应计算的。典型的Anchor-based方法包括RetinaNet和FSAF等。

总之,自适应锚框的方法可以避免手动设置锚框参数的问题,提高目标检测的精度和鲁棒性。同时,自适应锚框的方法也是目标检测领域的一个研究热点。

而 YOLOv5使用的是一种名为ATSS(Adaptive Training Sample Selection)的自适应锚框计算方法。

ATSS是一种基于Anchor-based的目标检测算法,它通过学习的方式自动计算出最适合输入图像的锚框参数,而不需要手动设置。ATSS算法的核心思想是,在训练过程中,根据样本与锚框的匹配度(即交并比IoU),自适应地选择正负样本,从而有效地降低了难样本的影响,并提高了检测精度。ATSS算法在YOLOv5中的应用,使得YOLOv5在目标检测任务中取得了较为出色的性能表现。

2.3 自适应图片缩放

自适应图片缩放是一种常用的技术,可以用于图像识别和目标检测任务,如在YOLO(You Only Look Once)中。在YOLO中,自适应图片缩放是一种基于目标尺度的图像缩放方式,‌旨在自适应地缩放输入图像的尺寸,‌以适应不同尺度目标的检测,‌从而提高检测精度和鲁棒性。‌

以YOLOv5s为例,自适应图片缩放的原理和步骤如下:‌

  • 计算缩放比例:‌首先,‌根据原始图片的大小和输入到网络图片的大小计算缩放比例。‌
  • 计算缩放后的图片大小:‌接着,‌根据原始图片的大小和计算出的缩放比例,‌确定缩放后的图片大小。‌
  • 计算黑边填充数值:‌特别地,‌对于短边进行缩放时,‌还需要计算黑边填充的数值,‌以确保长边被裁剪到特定的尺寸(‌如416像素)‌。‌
  • 仅在模型推理阶段执行:‌需要注意的是,‌这一操作仅在模型推理阶段执行。‌在模型训练阶段,‌仍然采用传统的方法,‌即将原始图片裁剪到固定大小(‌如416x416像素)‌。‌

YOLOv5s采用自适应图片缩放的主要目的是解决目标检测中存在的尺度不一致问题,‌通过这种方式,‌模型能够更好地适应不同大小的目标,‌从而提高检测的准确性和鲁棒性。

3. Backbone层

Backbone部分是YOLOv5模型的核心,主要由Focus结构以及CSP结构组成。

3.1 Focus结构

Focus结构是一种特殊的网络结构,‌用于对输入特征图进行下采样,‌同时减少计算量和参数量,‌同时保留输入特征图中的重要信息,‌以提高模型的特征提取能力。‌这种结构主要应用于YOLOv5的各个卷积块的第一个卷积层,‌以实现对输入特征图的下采样和特征压缩。‌

具体操作:

以YOLOv5s为例,当原始640×640×3的图像输入Focus结构时,具体操作如下:

  • 切片操作:在图像的行和列方向上进行隔像素抽取,组成新的特征层。每幅图像可以重组为4个特征层,每个特征层的尺寸都是原图的一半(即320×320),但通道数增加到原来的4倍(即12个通道)。这是因为每隔一个像素取一个值,相当于将原图的像素信息分散到了4个互补的特征层中,且没有信息丢失。
  • 堆叠与卷积:将这四个特征层进行堆叠,得到一个新的特征图(320×320×12)。然后,对这个堆叠后的特征图进行一次卷积操作,卷积核大小通常为3×3,输出通道数根据需要设定(在YOLOv5s中为32),最终得到320×320×32的特征图。

优点与特点:

  • 高效下采样:Focus结构通过切片和堆叠操作实现了高效的下采样,与传统卷积下采样相比,它在减少计算量的同时保留了更多的信息。
  • 增加通道数:切片操作使得输入通道数增加了4倍,这为后续层提供了更丰富的特征信息。
  • 减少信息丢失:由于采用了切片而非直接的下采样操作,Focus结构在减少图像尺寸的同时避免了信息的丢失。

特别注意:
YOLOv5的代码中有时会将Focus结构替换为卷积层。这是因为Focus结构在实现上比较复杂,需要进行通道分离、卷积、通道拼接等操作,导致计算量较大,不利于模型的训练和推理为了简化网络结构并提高运行效率,YOLOv5的作者采用了一种策略,即将Focus结构替换为标准的卷积层,从而减少计算量和参数量。具体来说,YOLOv5中的卷积层是以步长为2的方式进行下采样的,与Focus结构类似,它可以实现对输入特征图的压缩和下采样。因此,将Focus结构替换为卷积层可以在一定程度上提高模型的训练和推理效率,同时减少代码的复杂度和开发难度。

3.2 CSP结构

CSP(Cross Stage Partial)结构是YOLOv5中的一个重要组成部分,用于构建骨干网络(backbone)。CSP结构最初在CVPR 2020中提出,可以有效地减少网络参数和计算量,同时提高特征提取的效率。

CSP结构的核心思想是将输入特征图分成两部分,一部分经过一个小的卷积网络(称为子网络)进行处理,另一部分则直接进行下一层的处理。然后将两部分特征图拼接起来,作为下一层的输入。

具体来说,CSP结构包括以下几个步骤:

  • 将输入特征图分成两部分,一部分进行子网络的处理,另一部分直接进行下一层的处理。
  • 在子网络中,先使用一个卷积层将输入特征图进行压缩,然后进行一系列卷积操作,最后再使用一个卷积层进行扩张。这样可以提取出相对较少的高层次特征。
  • 在下一层中,将经过子网络处理的特征图与直接处理的特征图进行拼接,然后再进行一系列卷积操作。这样可以将低层次的细节特征和高层次的抽象特征结合起来,提高特征提取的效率。

CSP结构在YOLOv5中被广泛应用,包括骨干网络中的多个阶段以及头部网络(head)中的一些模块。它可以显著地减少网络的参数和计算量,同时提高特征提取的效率,从而加快模型的训练和推理速度。

CSP结构的优点和特点:

  • 减少参数量和计算量:通过将输入特征图分为两部分进行处理,可以大幅减少卷积核的数量和参数量,从而降低网络的计算复杂度。
  • 增加网络深度:CSP结构允许网络在保持计算效率的同时,扩展到更深的层次,从而提高网络的表达能力和检测性能。
  • 提高特征表达能力:通过多个分支的卷积操作,CSP结构能够提取到更多样化的特征,有利于更好地捕捉图像中的目标信息。
  • 增强特征的多样性:不同分支的卷积操作可以产生不同尺度和方向的特征图,从而增强特征的多样性,提高模型对不同目标的检测能力

Yolov5中的CSP结构实现:

在YOLOv5中,CSP结构被广泛应用于主干网络(Backbone)和颈部网络(Neck)中。具体来说,YOLOv5采用了两种CSP结构:CSP1_X和CSP2_X。

  • CSP1_X:主要应用于主干网络部分。它将输入特征图分为两个分支,一个分支经过多个残差结构(如BottleneckCSP或C3模块),另一个分支则直接进行卷积操作。两个分支的结果通过拼接和卷积操作进行融合,以生成下一阶段的输入特征图。
  • CSP2_X:主要应用于颈部网络部分。与CSP1_X类似,但可能包含更多的卷积层或残差组件,以适应颈部网络对特征融合和增强的需求。

4. Neck网络

YOLOv5的Neck网络是目标检测模型中的一个关键组成部分,它位于Backbone(主干网络)和Head(头部网络)之间,主要负责进一步提炼Backbone提取的特征,并进行多尺度特征融合,以提升检测性能。

在YOLOv5中,Neck网络主要采用了FPN(Feature Pyramid Networks)和PAN(Path Aggregation Network)结构相结合的方式,以实现多尺度特征的有效融合。

  • FPN结构:FPN通过自顶向下的路径,将高层级的语义特征传递给低层级的特征图,从而增强低层级特征图的语义信息。这种结构有助于模型在检测小目标时能够利用到更多的上下文信息。
  • PAN结构:PAN在FPN的基础上增加了自底向上的路径,将低层级的特征信息传递给高层级的特征图,进一步增强了特征图的表达能力。这种双向融合的方式使得模型能够更全面地捕捉到图像中的目标特征。

4.1 FPN结构

定义与作用:

FPN是一种用于目标检测的特征金字塔网络,它通过自顶向下的路径将高层级的语义特征传递给低层级的特征图,从而增强低层级特征图的语义信息。这种结构有助于模型在检测小目标时能够利用到更多的上下文信息。

工作原理:

  • 特征图金字塔:FPN首先构建了一个特征图金字塔,其中每个层级都对应不同尺度的特征图。
  • 上采样与融合:高层级的特征图通过上采样(如双线性插值)来增大其空间分辨率,然后与相邻的低层级特征图进行融合(如元素相加或拼接)。
  • 卷积操作:融合后的特征图通常会经过一个卷积层来减少特征图的通道数,并进一步整合特征信息。

优点:

  • FPN能够有效地利用高层级特征图的语义信息来增强低层级特征图的表达能力。
  • 通过构建特征图金字塔,FPN能够同时处理不同尺度的目标,提高检测精度。

4.2 PAN结构

定义与作用:

PAN是一种路径聚合网络,它在FPN的基础上增加了自底向上的路径,将低层级的特征信息传递给高层级的特征图。这种双向融合的方式使得模型能够更全面地捕捉到图像中的目标特征。

工作原理:

  • 自底向上路径:低层级的特征图通过一系列卷积层和上采样操作逐渐增大其空间分辨率,并与高层级的特征图进行融合。
  • 特征融合:与FPN类似,PAN也采用了特征融合的方式,但不同的是,PAN在融合过程中既考虑了自顶向下的语义信息,又考虑了自底向上的细节信息。
  • 增强特征表示:通过双向融合,PAN能够生成更具表达力的特征图,为后续的目标检测和定位提供有力的支持。

优点:

  • PAN通过双向融合的方式实现了多尺度特征的有效整合和传递。
  • 它能够同时利用高层级的语义信息和低层级的细节信息,提高模型的检测性能。

5.Prediction

YOLOv5的输出端主要是预测框,每个预测框由以下信息组成:

  • 置信度(confidence score):表示该框内是否存在目标的概率,取值范围为0到1。
  • 类别概率(class probabilities):表示该框内目标属于各个类别的概率,一般是预先定义好的类别数量。
  • 边界框位置(bounding box coordinates):表示目标的位置和大小,一般用矩形框来表示。

YOLOv5中的输出层一般包括三个不同尺度的特征图,每个特征图对应不同尺度的预测框,每个预测框包含的信息如上述所述。具体地,YOLOv5在输出层通过使用anchor box来预测目标的边界框位置和大小,同时对每个anchor box对应的预测结果使用softmax函数来计算类别概率。

总之,YOLOv5的输出端可以输出图像中目标的位置、大小和类别等信息,以便后续的目标识别和跟踪等任务进行处理。

5.1 Bounding box损失函数

YOLOv5中的Bounding box损失函数采用IoU loss函数,主要用于衡量预测的边界框与真实边界框之间的差异。

IoU loss是Intersection over Union(IoU)的一种变形,它是一种用于测量预测边界框与真实边界框之间重叠程度的指标。在目标检测中,IoU通常被用来评估预测框和真实框的重叠情况,以确定预测框是否正确。

具体而言,对于每个预测边界框,我们计算其与所有真实边界框的IoU值,然后选择IoU最大的那个真实边界框作为其对应的匹配目标,从而计算出其IoU loss。

回归损失函数近些年的发展过程是:
Smooth L1 Loss → IoU Loss(2016)→ GIoU Loss(2019)→ DIoU Loss(2020)→ CIoU Loss(2020)
IOU_Loss:主要考虑检测框和目标框重叠面积。
GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

5.2 NMS非极大值抑制

在目标检测任务中,一个物体可能被多个预测框检测出来,为了避免对同一个物体进行多次检测,需要对重复的预测框进行过滤,这个过程就是非极大值抑制(Non-maximum suppression,简称NMS)。

在YOLOv5中,NMS主要是通过以下几个步骤实现的:

  • 首先,对所有预测框按照置信度从高到低进行排序。
  • 然后,从置信度最高的预测框开始,依次遍历每个预测框,判断该预测框与后面所有预测框之间的IOU值是否大于一定的阈值(一般为0.5或0.6)。
  • 如果IOU值大于阈值,则将该预测框从候选框列表中剔除,否则保留该预测框。
  • (剔除的是相对于当前框(即置信度高的框)的预测框,这些框被认为可能是冗余的(因为它们与当前框重叠较多,且置信度较低))
  • 继续遍历下一个预测框,重复上述步骤,直到所有预测框都被遍历一遍。
  • 最终,保留下来的预测框就是经过NMS处理后的结果,即每个物体只对应一个预测框。

NMS算法的核心是通过比较重复预测框之间的IOU值,去除冗余的预测框,保留最优的结果。在YOLOv5中,NMS可以避免同一个物体被重复检测的问题,提高了检测的精度和效率。

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

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

相关文章

MySQL基础操作全攻略:增删改查实用指南(中)

本节目标: NOT NULL - 指示某列不能存储 NULL 值。 UNIQUE - 保证某列的每行必须有唯一的值。 DEFAULT - 规定没有给列赋值时的默认值。 PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标 识&am…

【C++】模拟实现stack

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 ​ 目录 一.了解项目功能 📌了解stack官方标准 📌了解模拟实现stack 二.逐步实现项目功能模块及其逻辑详解 📌实现stack成员变量 &…

【Linux】进程间通信(管道通信、共享内存通信)

一.什么是进程间通信 进程间通信这五个字很好理解,就是进程和进程之间通信。 那么为什么要有进程间通信呢? 1.数据传输:一个进程需要将它的数据发送给另一个进程 2.资源共享:多个进程之间共享同样的资源 3.通知事件:一…

遗传算法与深度学习实战——生命模拟与进化论

遗传算法与深度学习实战——生命模拟与进化论 0. 前言1. 模拟进化1.1 代码实现1.2 代码改进 2. 达尔文进化论3. 自然选择和适者生存3.1 适者生存3.2 进化计算中的生物学 小结系列链接 0. 前言 生命模拟通过计算机模拟生物体的基本特征、遗传机制、环境互动等,试图模…

WPF 依赖属性 IsHitTestVisible

IsHitlTestVisible 仅影响本身的元素(含内部包含的子元素),不影响父元素效果,且事件会传递到父元素。 Eg: 如父元素有click事件, 子元素设置了IsHitTestVisiblefalse, 当鼠标单击这个子元素时&…

Android 埋点信息分析——内存篇

源码基于:Android U 0. 前言 在前一篇《Android statsd 埋点简析》一文中简单剖析了Android 埋点采集、传输的框架,本文在其基础对埋点信息进行解析,来看下Android 中埋下的内存信息有哪些。 1. 通过代码剖析google 埋点内容 1.1 PROCESS_M…

BootStrap前端面试常见问题

在前端面试中,关于Bootstrap的问题通常围绕其基本概念、使用方式、特性以及实际应用等方面展开。以下是一些常见的问题及其详细解答: 1. Bootstrap是哪家公司研发的? 回答:Bootstrap是由Twitter的Mark Otto和Jacob Thornton合作…

脊髓损伤小伙伴的活力重启秘籍! 让我们一起动起来,拥抱不一样的精彩生活✨

Hey小伙伴们~👋 今天咱们来聊聊一个超级重要又温暖的话题——脊髓损伤后的锻炼大法来啦!🎉 记住,无论遇到什么挑战,我们都要像打不死的小强一样,活力满满地面对每一天!💪 首先&#…

2024实验班选拔考试(热身赛)

比赛传送门 邀请码&#xff1a;2024wksyb A. 简单的数列问题 签到&#xff0c;记得开long long。 #include<bits/stdc.h> #define rep(i,a,b) for (int ia;i<b;i) #define per(i,a,b) for (int ia;i>b;--i) #define se second #define fi first #define endl …

【C#语音文字互转】.NET的TTS文本转语音合成

官方文档给出环境为Visual Studio 2017及以上&#xff1b;C#SDK为.NET4.8及以上 本文章环境介绍&#xff1a; Visual Studio 2022&#xff1b;C#SDK为.NET6.0 语音转文字请移步&#xff1a;【C#语音文字互转】C#语音转文字&#xff08;方法一&#xff09; 一. 启动 Visual Stud…

【OceanBase系列】—— OceanBase应急三板斧

作者&#xff1a; 花名&#xff1a;洪波&#xff0c; OceanBase 数据库解决方案架构师 目前随着OceanBase数据库越来越流行&#xff0c;社区已经有很多用户在生产环境使用了OceanBase&#xff0c;也有不少用户的核心业务用到了OceanBase数据库&#xff0c;在使用OceanBase数据库…

新址·新征程|美创科技北京中心喜迎乔迁

7月30日&#xff0c;北京暴雨倾城 连绵大雨和隆隆雷声 却像是在为一场新征程洗礼 这一天&#xff0c;我们迎来了重要的时刻 ——美创科技北京中心搬新家啦&#xff01; 新址&#xff1a;北京市海淀区庚坊国际大厦6层 喜迎新址&#xff0c;一场简单但喜气盈盈、温馨十足的乔…

【Python学习手册(第四版)】学习笔记16-函数基础

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要介绍Python中函数的基本概念&#xff0c;作用域以及参数传递&#xff0c;函数语法以及def和return语句的操作&#xff0c;函数调用表达式的行为&#xff…

Delphi5实现DLL的编写、调用

效果图 显式跟隐式调用差不多的&#xff0c;就重新画了窗体&#xff0c;画的有点粗糙。 DLL文件 DLL文件是一种包含了可执行代码的库文件&#xff0c;但它不能独立运行&#xff0c;必须由其他程序&#xff08;如EXE文件&#xff09;显式或隐式地加载并调用。DLL文件通常用于实…

全国地铁路线及站点SHP数据

数据是GIS的血液&#xff01; 我们在《126M全球手机基站SHP数据分享》一文中&#xff0c;为你分享过全球手机基站分布数据。 现在再为你分享全国地铁轻轨路线与站点SHP数据&#xff0c;你可以在文末查看该数据的领取方法。 全球地铁路线及站点数据 截至2023年12月31日&…

LAVIS在Mac,M1PRO芯片下的安装实战

LAVIS在Mac,M1PRO芯片下的安装实战 契机 ⚙ 本地想装个图片理解的大模型&#xff0c;看了下blip2感觉比较合适&#xff0c;macos安装的时候有点坑需要注意下&#xff0c;但是最终也无法使用mps加速&#xff0c;比较蛋疼。这里记录下安装步骤。 安装 LAVIS/projects/blip2 a…

【研发日记】Matlab/Simulink技能解锁(十二)——Stateflow中的两种状态机嵌套对比

文章目录 前言 项目背景 两级状态机 函数状态机 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simulink技能解锁(八)——分布式仿真》 见《【研发日记】Matlab/Simulink技能解锁(九)——基…

数据结构(其四)--特殊矩阵的存储

目录 11.特殊矩阵的压缩存储 &#xff08;1&#xff09;.一维数组的储存结构 &#xff08;2&#xff09;.二维数组的存储结构 &#xff08;3&#xff09;.普通矩阵的存储 &#xff08;4&#xff09;.特殊矩阵的压缩存储 i.对称矩阵 ii.三角矩阵 iii.三对角矩阵 iiii.稀疏矩…

Java多商户新零售超市外卖商品系统

解锁新零售奥秘&#xff0c;多商户外卖超市商品系统大揭秘&#xff01; &#x1f31f; 开篇&#xff1a;新零售时代的浪潮 在这个日新月异的数字化时代&#xff0c;新零售已悄然成为商业变革的新风口。想象一下&#xff0c;足不出户就能逛遍全城商家&#xff0c;心仪商品一键…

力扣——238.移动零

题目 思路 利用双指针&#xff0c;先找到第一个为0的地方指向&#xff0c;指针2指向下一个&#xff0c;指针1之前是已经处理好的数据&#xff0c;指针2进行遍历&#xff0c;遇到非零则与指针1数据交换&#xff0c;然后指针1。 代码 class Solution { public:void moveZeroes(…