【freespace】YOLOP: You Only Look Once for Panoptic Driving Perception论文解读

news2024/12/25 0:29:38

目录

Abstract 摘要

1、简介

2、 相关工作

2.1. 交通目标检测

2.2. 可驾驶区域分割

2.3. 车道检测

2.4. 多任务的方法

3. 方法

3.1. 编码器

3.1.1 骨干

3.1.2 脖子

3.2. 解码器

3.2.1 探测头

3.2.2 可驾驶区域分段头&车道线分段头

3.3. 损失函数

3.4. 训练模式

4. 实验

4.1. 设置

4.1.1 数据集设置

4.1.2 实现细节

4.1.3 实验设置

4.2. 结果

4.2.1 交通对象检测结果

4.2.2 可驾驶区域分割结果

4.2.3 车道检测结果

 4.3. 消融研究

4.3.1 端到端vs .一步一步

4.3.2 多任务vs .单任务

​编辑4.3.3 区域基础vs网格的

5. 结论


Abstract 摘要

        全景驾驶感知是自动驾驶中一个特殊的部分。高精度和实时性能够使得驾驶的决策更加的合理。我们提出了一个算法,yoloP,去同时进行交通目标检测,可行驶区域检测,以及车道线分割。它由一个编码器和三个解码器组成,编码器用于提取特征,三个解码器分别处理三个任务。我们的算法在BDD100K数据集上在精度方面和速度方面,表现的相当的好。此外,我们通过消融研究验证了我们的多任务学习模型对联合训练的有效性。据我们所知,这是第一个可以在嵌入式设备 Jetson TX2(23 FPS)上实时同时处理这三个视觉感知任务并保持出色精度的工作。

代码和模型地址:https://github.com/hustvl/YOLOP


1、简介

        最近,对自动驾驶的广泛研究揭示了全景驾驶感知系统的重要性。它在自动驾驶中发挥着重要作用

可以从摄像头并协助决策系统控制行动车辆的。为了限制车辆的操纵,视觉感知系统应该能够理解

然后向决策系统提供信息,包括:障碍物的位置、道路是否可行驶、车道的位置等。目标检测通常涉及全景驾驶帮助车辆避开障碍物的感知系统遵守交通规则。还需要可行驶区域分割和车道检测,因为它们对规划车辆行驶路线。

        对于这样的全景驾驶感知系统,高精度和实时性是最关键的两个要求,关系到自动驾驶汽车能否做出准确及时的决策,保证安全。然而,对于实际的自动驾驶系统,尤其是ADAS来说,计算资源往往是边际的、有限的。因此,在现实场景中同时考虑这两种需求是非常具有挑战性的。

        许多方法分别处理这些任务。例如,Faster R-CNN[24]和YOLOv4[1]处理目标检测;提出ENet[19]和
PSPNet[30]来进行语义分割。SCNN[18]和SAD-ENet[9]用于车道检测。尽管这些方法取得了优异的性能,但一个接一个地处理这些任务比一次处理所有任务需要更长的时间。在自动驾驶汽车中常用的嵌入式设备上部署全景驾驶感知系统时,应该考虑到有限的计算资源和延迟。此外,交通场景理解中的不同任务往往有很多相关信息。如图1所示,车道往往是可行驶区域的边界,而可行驶区域通常紧紧围绕着交通对象。多任务网络更适合这种情况,因为(1)它可以通过同时处理多个任务而不是顺序处理来加速图像分析过程。(2)它可以在多个任务之间共享信息,因为多任务网络通常共享相同的特征提取主干。因此,探索自动驾驶中的多任务方法具有本质意义。

        为了解决全景驾驶感知的多任务问题,即交通目标检测、可驾驶区域分割和车道检测,同时获得高精度和快速的速度,设计了一种简单高效的网络架构。我们使用轻量级的CNN[26]作为编码器,从图像中提取特征。然后将这些特征图馈送给三个解码器,以完成各自的任务。我们的检测解码器基于目前表现最好的单级检测网络[1],主要有两个原因:(1)单级检测网络比两级检测网络更快。(2)单阶段检测器的基于网格的预测机制与其他两个语义分割任务更相关,而实例分割通常与基于区域的检测器[7]相结合。并且我们在实验部分验证了这两种观点。编码器输出的特征图融合了不同层次和尺度的语义特征,我们的分割分支可以利用这些特征图出色地完成像素级语义预测。
        除了端到端的训练策略,我们还尝试了一些交替优化范式,逐步训练我们的模型。一方面,我们可以将不相关的任务放在不同的训练步骤中,以防止相互限制。另一方面,先训练的任务可以指导其他任务。所以这种范式有时很有效,尽管很麻烦。然而,实验表明,对于我们的模型来说,这是不必要的,因为端到端训练的模型可以表现得足够好。我们的全光驾驶感知系统在单个NVIDIA TITAN XP上达到41 FPS,在Jetson TX2上达到23 FPS;同时,在BDD100K数据集的
三个任务上达到了最先进的水平[28]。

        综上所述,本文的主要贡献是:(1)提出了一个高效的多任务网络,可以联合处理自动驾驶中的三个关键任务:目标检测、可驾驶区域分割和车道检测,以节省计算成本和减少推理时间。我们的工作是第一个在嵌入式设备上实现实时,同时在BDD100K数据集上保持最先进水平的性能。(2)设计了烧蚀实验,以验证多任务方案的有效性。证明了这三个任务可以联合学习,而不需要繁琐的交替优化。(3)设计了消融实验,证明了检测任务的基于网格的预测机制与语义分割任务的预测机制更相关,相信可以为其他相关的多任务学习研究工作提供参考。

2、 相关工作

        在本节中,我们将分别回顾上述三个任务的解决方案,然后介绍一些相关的多任务学习工作。我们只关注基于深度学习的解决方案。

2.1. 交通目标检测

        近年来,随着深度学习的快速发展,出现了许多突出的目标检测算法。目前主流的目标检测算法可以分为两阶段方法和一阶段方法。

        两阶段方法分两步完成检测任务。首先,获得区域建议框,然后利用区域建议框中的特征对目标进行定位和分类。区域建议的生成经历了几个发展阶段[2,4,5,24]。

        ssd -系列[14]和yolo -系列算法是单阶段方法中的里程碑。这种算法同时进行边界框回归和目标分类。YOLO[21]将图片划分为S×S网格,而不是使用RPN网络提取区域建议,这显著加快了检测速度。YOLO9000[22]引入了锚点机制来提高检测的召回率。YOLOv3[23]采用特征金字塔网络结构实现多尺度检测。YOLOv4[1]通过细化网络结构、激活函数、损失函数以及应用丰富的数据增广,进一步提升检测性能。

2.2. 可驾驶区域分割

        由于深度学习的快速发展,许多基于cnn的方法在语义分割领域取得了巨大的成功,它们可以应用于可驾驶区域分割任务中,提供像素级的结果。FCN[15]首先将全卷积网络引入到语义分割。尽管进行了跨层连接细化,但其性能仍然受到低分辨率输出的限制。PSPNet[30]提出了金字塔池化模块来提取各种尺度的特征,以增强其性能。除了准确性,速度也是评估这项任务的关键因素。为了实现实时推理速度,ENet[19]减少了特征图的大小。最近,多任务学习被引入来处理这一任务,Ed-geNet[6]将边缘检测与可驾驶区域分割任务相结合,在不影响推理速度的情况下获得更准确的分割结果。

2.3. 车道检测

        在车道线检测方面,有很多基于深度学习的创新研究。[17]构建了一个双分支网络来对图像进行语义分割和像素嵌入。它进一步对双分支特征进行聚类,实现车道线实例分割。SCNN[18]提出了slice-by-slice卷积,使信息能够在一层中跨行跨列的像素之间传递,但这种卷积非常耗时。Enet-SAD[9]使用自注意力蒸馏方法,使低层特征图能够从高层特征图中学习。这种方法提高了模型的性能,同时保持了模型的轻量化。

2.4. 多任务的方法

        多任务学习的目标是通过多个任务之间的共享信息来学习更好的表示。特别是,基于cnn的多任务学习方法还可以实现网络结构的卷积共享。Mask R-CNN[7]对Faster R-CNN进行了扩展,增加了一个预测目标掩码的分支,将实例分割和目标检测任务有效地结合在一起,这两个任务可以相互促进性能。LSNet[3]将目标检测、实例分割和姿态估计总结为位置敏感的视觉识别,并使用统一的解决方案来处理这些任务。MultiNet[25]通过一个共享的编码器和三个独立的解码器,同时完成场景分类、目标检测和驾驶区域分割这三个场景感知任务。DLT-Net[20]继承了编码器-解码器结构,并在子任务解码器之间贡献地构建上下文张量,以在任务之间共享指定信息。[29]提出了车道区域分割和车道边界检测之间相互关联的子结构。同时,它提出了一种新的损失函数,将车道线约束在车道区域的外部轮廓上,使它们在几何上重叠。然而,这个先验假设也限制了它的应用,因为
它只适用于车道线紧密包裹车道区域的场景。更重要的是,多任务模型的训练范式也值得思考。[10]指出,只有当所有这些任务确实相关时,联合训练才是恰当且有益的;否则,必须采用交替优化。因此,Faster R-CNN[24]采用了实用的4步训练算法来学习共享特征。这种范式有时可能是有用的,但大多数情况下是冗长乏味的

3. 方法

        我们提出了一个简单高效的前馈网络,可以完成交通目标检测,可驾驶区域分割和车道检测任务。如图2所示,我们的全景驾驶感知单次网络,命名为YOLOP,包含一个共享的编码器和三个后续的解码器来解决具体任务。不同解码器之间没有复杂和冗余的共享块,这减少了计算消耗,并允许我们的网络轻松进行端到端的训练。

3.1. 编码器

         我们的网络共享一个编码器,由一个骨干网络和一个颈部网络组成。

3.1.1 骨干

        backbone网络用于提取输入图像的特征。通常,一些经典的图像分类网络作为骨干。由于YOLOv4[1]在目标检测上的优异性能,我们选择CSP-Darknet[26]作为骨干网络,解决了优化[27]时的梯度重复问题。它支持特征传播和特征重用,减少了参数量和计算量。因此,有利于保证网络的实时性。

3.1.2 脖子

        颈部用于融合由脊骨生成的特征。我们的颈部主要由空间金字塔池(Spatial Pyramid Pooling, SPP)模块[8]和特征金字塔网络(Feature Pyramid Network, FPN)模块[11]组成。SPP生成并融合不同尺度的特征,FPN融合不同语义层次的特征,使得生成的特征包含多尺度、多语义层次信息。在我们的工作中,我们采用了拼接的方法来融合特征。

3.2. 解码器

        我们网络中的三个头是这三个任务的特定解码器。

3.2.1 探测头

        与YOLOv4类似,采用基于锚点的多尺度检测方案。首先,我们使用一种叫做路径的结构聚合网络(Aggregation Network, PAN),一种自下而上的特征金字塔网络[13]。FPN自顶向下传递语义特征,PAN自底向上传递定位特征。我们将它们组合在一起以获得更好的特征融合效果,然后直接使用PAN中的多尺度融合特征图进行检测。然后,多尺度特征图的每个网格将分配三个不同长宽比的先验锚点,检测头将预测位置的偏移和高度和宽度的缩放,以及每个类别对应的概率和预测的置信度。

3.2.2 可驾驶区域分段头&车道线分段头

        可行驶区域段头与车道线段头采用相同的网络结构。我们将FPN的底层馈送到分割分支,大小为(W/8, H/8,256)。我们的分割分支非常简单。经过三次上采样过程后,我们将输出特征图恢复为(W, H, 2)的大小,它代表了输入图像中每个像素对于可驾驶区域/车道线和背景的概率。由于颈部网络中共享SPP,我们没有像其他人[30]那样额外增加SPP模块来对分支进行分段,这并没有提高网络的性能。此外,我们在我们的上采样层中使用最近的插值方法来减少计算成本,而不是反卷积。因此,我们的分段解码器不仅获得了高精度的输出,而且在推理过程中速度非常快。

3.3. 损失函数

        由于我们的网络中有三个解码器,所以我们的多任务损失包含三个部分。至于检测损失Ldet,它是分类损失、对象损失和边界框损失的加权和,如方程1所示。

         其中Lclass和Lobj是focal loss[12],用于减少分类良好的示例的损失,从而迫使网络关注难的示例。Lclass用于惩罚分类,Lobj用于一次预测的置信度。Lbox是LCIoU[31],它将预测框与真实值之间的距离、重叠率、尺度和长宽比的相似性考虑在内。

        可驾驶区域分割的损失Lda - seg和车道线分割Lll−seg都包含Logits交叉熵损失Lce,其目的是最小化网络输出像素与目标之间的分类误差。值得一提的是,IoU loss:LIoU=Lll - seg中增加了1−tp +FTPP+ fn,因为它对车道线的稀疏类别预测特别有效。Lda和Lll−seg分别定义为式(2)、式(3)。

         综上所述,我们的最终损失是三个部分之和的加权和,如式(4)所示。

         其中α1, α2, α3, γ1, γ2, γ3可以被调节来平衡总损失的所有部分。

3.4. 训练模式

        我们尝试不同的范式来训练我们的模型。最简单的一种是端到端的训练,然后三个任务可以联合学习。当所有任务确实相关时,这种训练范式是有用的。此外,一些交替优化算法也被尝试过,它们会逐步训练我们的模型。在每一步中,模型可以专注于一个或多个相关的任务,而不管那些不相关的任务。即使不是所有的任务都是相关的,我们的模型仍然可以用这种范式在每个任务上进行充分的学习。而算法1说明了一种分步训练方法的过程。

4. 实验

4.1. 设置

4.1.1 数据集设置

        BDD100K数据集[28]支持自动驾驶领域的多任务学习研究。拥有10个任务的100k帧图片和注释,是最大的驾驶视频数据集。由于数据集具有地理、环境和天气的多样性,因此在BDD100k数据集上训练的算法具有足够的鲁棒性,可以迁移到新的环境中。因此,我们选择BDD100k数据集来训练和评估我们的网络。BDD100K数据集由三部分组成,70K图像的训练集、10K图像的验证集和20K图像的测试集。由于测试集的标签不是公开的,我们在验证集上评估我们的网络。

4.1.2 实现细节

        为了增强我们模型的性能,我们经验地采用了一些实用的数据增强技术和方法。
        为了使我们的检测器获得更多关于交通场景中物体的先验知识,我们使用k-means聚类算法从数据集的所有检测帧中获取先验锚点。我们使用Adam作为用于训练我们模型的优化器和初始学习率,β1和β2分别设置为0.001,0.937和0.999。在训练过程中使用了Warm-up和余弦退火来调整学习率,其目的是引导模型更快更好地收敛[16]。
        我们使用数据增强来增加图像的可变性,从而使我们的模型在不同的环境下具有鲁棒性。在我们的训练方案中考虑了光度失真和几何失真。对于光度失真,我们调整图像的色调、饱和度和值。我们使用随机旋转、缩放、平移、剪切和左右翻转来处理图像,以处理几何失真。


4.1.3 实验设置

        我们选择了一些优秀的多任务网络和专注于单一任务的网络来与我们的网络进行比较。multi - net和DLT-Net都可以处理多个全光驾驶感知任务,在目标检测和可驾驶区域分割方面都取得了很好的效果BDD100k数据集上的任务。Faster-RCNN是两阶段目标检测网络的杰出代表。YOLOv5是单阶段网络,在COCO数据集上实现了最先进的性能。PSP-Net凭借其卓越的聚合全局信息的能力,在语义分割任务上取得了出色的性能。我们在BDD100k数据集上重新训练了上述网络,并将它们与我们的网络在目标检测和可驾驶区域分割任务上进行了比较。由于目前还没有合适的多任
务网络在BDD100K数据集上处理车道检测任务,我们将我们的网络与Enet[19]、SCNN和Enet- sad这三种高级车道检测网络进行比较。此外,还将联合训练范式的性能与多种交替训练范式进行了比较。此外,我们还比较了我们训练处理多个任务的多任务模型与训练执行特定任务的模型的准确性和速度。此外,我们还比较了语义分割任务结合单阶段检测任务和两阶段检测任务的性能。接下来[9],我们将BDD100k数据集中的图像大小从1280×720×3调整为640×384×3。所有控制实验遵循相同的实验设置和评估指标,所有实验都在NVIDIAGTX TITAN XP上运行。

4.2. 结果

        在本节中,我们只是简单地对我们的模型进行端到端的训练,然后将其与所有三个任务上的其他代表性模型进行比较。

4.2.1 交通对象检测结果

        交通对象检测的可视化结果如图3所示。由于多网和DLT-Net只能检测5辆车,所以我们只考虑BDD100K数据集上5种车型的车辆检测结果。如表1所示,我们使用召回率和mAP50作为检测准确率的评价指标。我们的模型在检测精度上超过了Faster R-CNN、Multi-Net和DLT-Net,并且与使用更多技巧的YOLOv5s相当。更重要的是,我们的模型可以实时推断。YOLOv5s比我们的更快,因为它没有车道线段头和可行驶区域段头。

        图4为Faster R-CNN与YOLOP的定性比较。由于多任务的信息共享,YOLOP预测结果更加合理。例如,YOLOP不会将远离道路的物体误认为车辆。而且,假阴性的例子要少得多,边界框也更准确。

4.2.2 可驾驶区域分割结果

         可行驶区域分割的可视化结果如图5所示。本文将BDD100K数据集中的“区域/可驾驶”和“区域/备选”两类都不加区分地归为“可驾驶区域”。我们的模型只需要区分图像中的可驾驶区域和背景。mIoU用于评估不同模型的分割性能。结果如表2所示。可以看出,我们的模型分别比multi - net、DLT-Net和PSPNet高出19.9%、20.2%和1.9%。此外,我们的推理速度比他们的快4到5倍。
        PSPNet和YOLOP的结果对比如图6所示。PSPNet和YOLOP在此任务中都表现良好。但YOLOP在分割车辆或车道线旁边的边缘区域方面明显更好。我们认为这主要是因为其他两个任务都为这个任务提供了边缘信息。同时,YOLOP也较少出现愚蠢的错误,如将对面车道区域误判为可行驶区域。

4.2.3 车道检测结果

        车道检测的可视化结果如图7所示。BDD100K数据集中的车道线是用两条线标记的,所以直接使用an符号是非常棘手的。为了方便比较,实验设置遵循[9]。首先,我们根据两行标注计算中心线。然后我们画宽度设置为8像素的训练车道线,同时保持测试集车道线宽度为2像素。我们将车道线的像素精度和IoU作为评价指标。如表3所示,我们模型的性能大大超过了其他三个模型。


        图8为ENet-SAD和YOLOP Lane line检测结果对比。YOLOP分割结果的准确性和连续性明显优于ENet-SAD。有了其他两个任务共享的信息,YOLOP不会把一些车辆所在或可行驶的区域误认为车道线,但Enet-SAD却经常这样做。

 4.3. 消融研究

         我们设计了以下三个消融实验来进一步说明我们方案的有效性。本节中的所有评价指标与上述一致。

4.3.1 端到端vs .一步一步

        在表4中,我们将联合训练范式与多种交替训练范式的性能进行了比较。显然,我们的模型通过端到端训练已经表现得足够好了,所以没有必要进行交替优化。然而,有趣的是首先,范式训练检测任务似乎表现得更好。我们认为主要是因为我们的模型更接近完整的检测模型,并且在执行检测任务时模型更难收敛。更重要的是,由三步组成的范式略优于有两步的范式。类似的交替训练
可以运行更多的步骤,但我们观察到的改进微不足道。

4.3.2 多任务vs .单任务

        为了验证我们的多任务学习方案的有效性,我们比较了多任务方案和单任务方案的性能。一方面,我们训练我们的模型同时执行3个任务。另一方面,我们训练我们的模型分别执行交通目标检测、可驾驶区域分割和车道线分割任务。表5展示了这两种方案在每个具体任务上的性能对比。可以看出,我们的模型采用多任务方案实现的性能接近于专注于单个任务的性能。更重要的是,与单独执行每个任务相比,多任务模型可以节省大量的时间。


4.3.3 区域基础vs网格的

        验证基于网格的预测机制比基于区域的预测机制更与两个语义分割任务相关的观点。我们扩展了Faster R-CNN,通过添加两个语义分割头来像我们的模型那样并行执行三个任务,并且我们 称这种新模型为R-CNNP。我们训练YOLOP和R-CNNP (i)分别执行检测任务和两个分割任务,(ii)同时执行三个任务。在上面的两个实验中,两个分割任务是联合训练的,因为不需要考虑它们之间的交互作用。所有的实验设置都相同,结果如表6所示。在R-CNNP框架下,多任务训练的性能要比单独训练检测任务和语义分割任务差得多。显然,两种任务的组合在R-CNNP框架中存在冲突。但在我们的YOLOP框架中不存在这样的问题,多任务训练的效果与只关注检测或语义分割任务的效果相当。因此我们认为这是由于YOLOP的检测头和其他两种语义分割头一样,直接对Encoder输出的整个feature map执行全局分类或回归任务,所以它们在预测机制上是相似且相关的。然而,R-CNNP的检测头需要先选择区域提案,然后对每个提案的特征映射进行预测,这与语义分割的全局预测机制有很大不同。此外,R-CNNP在推理速度上也远远落后于YOLOP。因此,对于联合训练检测和分割任务,我们的框架是一个更好的选择。

5. 结论

        在本文中,我们提出了一个全新的、简单高效的网络,它可以同时处理目标检测、可驾驶区域分割和车道检测三个驾驶感知任务,并且可以进行端到端的训练。我们的模型在具有挑战性的BDD100k数据集上表现异常出色,在所有三个任务上都达到或大大超过了最先进的水平。并且首次在嵌入式设备Jetson TX2上实现了实时推理,这确保了我们的网络可以在现实世界的场景中使用。此外,我们已经验证了基于网格的预测机制与语义分割任务的预测机制更相关。这可能对类似的多任务学习研究工作有一定的借鉴意义。
        目前,虽然我们的多任务网络可以在不影响彼此性能的情况下进行端到端的训练,但我们希望用更适合多任务学习的范式来提高那些任务的性能。此外,我们的模型仅限于三个任务,在我们未来的框架中可以添加更多与自动驾驶感知系统相关的任务,如深度估计,使整个系统更加完整和实用。

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

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

相关文章

Windows同时安装两个版本的JDK并随时切换,以JDK6和JDK8为例,并解决相关存在的问题(亲测有效)

Windows同时安装两个版本的JDK并随时切换,以JDK6和JDK8为例,并解决相关存在的问题(亲测有效) 1.下载不同版本JDK 这里给出JDK6和JDK的百度网盘地址,具体安装过程,傻瓜式安装即可。 链接:http…

华为OD机试真题 JavaScript 实现【机器人活动区域】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试&am…

EXCEL,多条件查询数字/文本内容的4种方法

目录 1 问题:如何根据多条件查询到想要的内容 2 方法总结 2.1 方法1: sumif() 和sumifs() 适合查找符合条件的多个数值之和 2.2 方法2:使用lookup(1,0/((区域1条件1)*(区域2条件2)*....),结果查询区域) 2.3 方法3:使用 ind…

rknn模型在rv1126开发板上跑

在前面,已经将 onnx模型转为 rknn模型。 yolov5 onnx模型 转为 rknn模型_爱钓鱼的歪猴的博客-CSDN博客 这里探讨的是:rknn模型在rv1126开发板上运行 目录 1、rknn模型在PC端进行推理测试,评估模型精度 2、模型预编译 3、rknn模型部署到r…

【LeetCode】根据二叉树创建字符串

根据二叉树创建字符串 题目描述算法分析编程代码 链接: 根据二叉树创建字符串 题目描述 算法分析 当单纯的按照前序遍历输出后,我们只要对()进行一些修改就好 编程代码 /*** Definition for a binary tree node.* struct TreeNode {* …

偷懒神器-->花样的代码生成工具

1、CRUD代码生成: 根据MyBatisPlus逆向工程改造而来,添加了showDoc文档生成,数据库脚本生成,增删改查文件生成,Po、Vo、Request对象生成等。普通的增删改查一般搞定。并预调了部份判断逻辑。 效果示例: p…

0801|IO进程线程day4 文件IO函数-目录相关函数

1&#xff09;opendir 功能&#xff1a;打开一个目录文件; 原型&#xff1a; #include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name); 参数&#xff1a; char *name&#xff1a;指定要打开的目录的路径以及名字; 返回值&#xff1a; 成功&…

OpenCV实战:从图像处理到深度学习的全面指南

文章目录 1. OpenCV简介什么是OpenCV&#xff1f;OpenCV的历史与发展OpenCV的应用领域 2. OpenCV的安装与配置OpenCV在Windows系统下的安装OpenCV在Linux系统下的安装OpenCV在Mac OS系统下的安装配置Python环境使用OpenCV 3. OpenCV基础图像的载入、显示和保存图像的基础操作图…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis em

&#xfeff; 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据…

linux(一)-----osi七层模型

1.七层模型的定义 1&#xff09;物理层 &#xff08;指的是网卡&#xff0c;网线等物理层面的硬件&#xff09; 2&#xff09;数据链路层 前两层可以概括为物理链路层&#xff0c;以二进制的数据形式在物理媒介上进行传输数据&#xff08;传输协议ISO2100协议&#xff09; …

微信小程序 - 解析富文本插件版们

一、html2wxml 插件版 https://gitee.com/qwqoffice/html2wxml 申请使用注意事项 插件版本解析服务是由 QwqOffice 完成&#xff0c;存在不稳定因素&#xff0c;如对稳定性有很高的要求&#xff0c;请自行搭建解析服务&#xff0c;或在自家服务器上直接完成解析。对于有关插…

SCI论文的发文的模板(Elsevier,MDPI,IEEE)

不同的SCI期刊都有自己的出版商&#xff0c;不同的出版商有不同的发文格式。 最简单的方式就是去查官网上面&#xff0c;常用的期刊格式如下。到对应的位置下载模板即可&#xff0c;推荐使用latex。 MDPI MDPI | Preparing Manuscripts in LaTeX Elsevier Guide for authors …

P3373 【模板】线段树 2(乘法与加法)(内附封面)

【模板】线段树 2 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面三种操作&#xff1a; 将某区间每一个数乘上 x x x&#xff1b;将某区间每一个数加上 x x x&#xff1b;求出某区间每一个数的和。 输入格式 第一行包含三个整数 n , q , m n,q,m n,…

【多线程初阶】多线程案例之单例模式

文章目录 前言1. 什么是单例模式2. 饿汉模式3. 懒汉模式 --- 单线程版4. 懒汉模式 --- 多线程版5. 懒汉模式 --- 多线程改进版总结 前言 本文主要给大家讲解多线程的一个重要案例 — 单例模式. 关注收藏, 开始学习吧&#x1f9d0; 1. 什么是单例模式 单例模式是一种很经典的…

数据结构-二叉树

数据结构-二叉树 二叉树的概念二叉树的遍历分类 建立二叉树&#xff0c;并遍历二叉树的最小单元二叉树的最小单元初始化初始化二叉树前序遍历的实现中序遍历的实现后序遍历的实现计算节点的个数计算树的深度求第k层的个数查找二叉树的元素分层遍历 全部代码如下 二叉树的概念 二…

MySQL数据库服务器安装与配置(步骤简单详细,看完可学会下载MySQL所有版本)

目录 引言 一&#xff0c;5.6.51数据库服务器下载 二&#xff0c;8.1.0最新版数据库服务器下载 三&#xff0c;MySQL客户端下载 引言 个人认为MySQl数据库目前推荐的两个版本系列为5.6.51和8.系列。 至于我们为什么要下载两个版本呢&#xff1f;是因为官方在数据库下载的结构…

C++:STL的引入和string类

文章目录 STLSTL是什么STL的六大组件 stringstring类内成员函数迭代器 STL STL是什么 什么是STL&#xff1f;STL是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 要学一个新知识&#xf…

微信小程序 - scroll-view组件之上拉加载下拉刷新(解决上拉加载不触发)

前言 最近在做微信小程序项目中&#xff0c;有一个功能就是做一个商品列表分页限流然后实现上拉加载下拉刷新功能&#xff0c;遇到了一个使用scroll-viwe组件下拉刷新事件始终不触发问题&#xff0c;网上很多说给scroll-view设置一个高度啥的就可以解决&#xff0c;有些人设置了…

嵌入式软件开发有没有捷径

嵌入式软件开发有没有什么捷径&#xff1f;不定期会收到类似的问题&#xff0c;我只想说&#xff1a;嵌入式软件开发没有捷径 说实话&#xff0c;有这种想法的人&#xff0c;我其实想劝你放弃。对于绝大多数普通人&#xff0c;一步一个脚印就是捷径。 当然&#xff0c;这个问题…

若依(RuoYi)系统添加自定义的模块

RuoYi系统是干什么用的,这里不过多说明了,自己搜一下,其提供的功能己经基本满足了一些简单的系统应用,如果想进行二次开发的小伙伴,可能会想仅仅用Ruoyi的后台权限管理,但是业务功能想进行自定义,可以借鉴一下本文。我们用的是前后端分离版 一、前端的自定义模块 其实在…