轨道列车舱门检测系统源码分享

news2024/9/26 1:28:18

轨道列车舱门检测检测系统源码分享

[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

1.研究背景与意义

项目参考AAAI Association for the Advancement of Artificial Intelligence

项目来源AACV Association for the Advancement of Computer Vision

研究背景与意义

随着城市化进程的加快,轨道交通系统在现代城市中扮演着越来越重要的角色。轨道列车作为城市公共交通的重要组成部分,其安全性和效率直接影响到乘客的出行体验和城市的运行效率。在轨道列车的运行过程中,舱门的安全检测显得尤为重要。舱门的异常开启、关闭不当或故障可能导致乘客的安全隐患,甚至引发严重的事故。因此,开发一个高效、准确的舱门检测系统,能够及时识别和处理舱门相关的安全问题,具有重要的现实意义。

近年来,深度学习技术的快速发展为物体检测领域带来了革命性的变化。YOLO(You Only Look Once)系列模型因其高效的实时检测能力而受到广泛关注。YOLOv8作为该系列的最新版本,结合了多种先进的算法和技术,具有更高的检测精度和更快的处理速度。然而,针对特定应用场景的YOLOv8模型仍需进行改进和优化,以适应轨道列车舱门检测的特殊需求。

本研究旨在基于改进的YOLOv8模型,构建一个高效的轨道列车舱门检测系统。我们使用的数据集包含4007张图像,专注于单一类别——舱门。这一数据集的构建为模型的训练和测试提供了坚实的基础。通过对数据集的深入分析,我们可以提取出舱门的多样性特征,包括不同的角度、光照条件和背景环境。这些特征将为模型的训练提供丰富的信息,从而提高其在实际应用中的泛化能力。

在实际应用中,舱门检测系统不仅需要具备高准确率,还需具备实时性和鲁棒性。针对这一需求,我们将对YOLOv8模型进行改进,采用数据增强、模型剪枝和量化等技术,以提高模型的检测速度和准确性。同时,我们还将引入集成学习的方法,通过结合多个模型的预测结果,进一步提升检测的可靠性。

本研究的意义不仅在于技术层面的创新,更在于其对轨道交通安全管理的积极推动。通过构建高效的舱门检测系统,我们能够为轨道交通运营提供实时监控和预警机制,及时发现潜在的安全隐患,保障乘客的安全。此外,该系统的成功应用还将为其他交通工具的安全检测提供借鉴,推动智能交通技术的发展。

综上所述,基于改进YOLOv8的轨道列车舱门检测系统的研究,不仅具有重要的学术价值,更具备广泛的应用前景。通过深入探索深度学习在物体检测中的应用,我们期待能够为轨道交通的安全管理提供新的解决方案,助力城市交通的智能化和安全化发展。

2.图片演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:由于此博客编辑较早,上面“2.图片演示”和“3.视频演示”展示的系统图片或者视频可能为老版本,新版本在老版本的基础上升级如下:(实际效果以升级的新版本为准)

(1)适配了YOLOV8的“目标检测”模型和“实例分割”模型,通过加载相应的权重(.pt)文件即可自适应加载模型。

(2)支持“图片识别”、“视频识别”、“摄像头实时识别”三种识别模式。

(3)支持“图片识别”、“视频识别”、“摄像头实时识别”三种识别结果保存导出,解决手动导出(容易卡顿出现爆内存)存在的问题,识别完自动保存结果并导出到tempDir中。

(4)支持Web前端系统中的标题、背景图等自定义修改,后面提供修改教程。

另外本项目提供训练的数据集和训练教程,暂不提供权重文件(best.pt),需要您按照教程进行训练后实现图片演示和Web前端界面演示的效果。

3.视频演示

3.1 视频演示

4.数据集信息展示

4.1 本项目数据集详细数据(类别数&类别名)

nc: 1
names: [‘door’]

4.2 本项目数据集信息介绍

数据集信息展示

在本研究中,我们使用的数据集名为“drzwi”,其主要目的是为了训练和改进YOLOv8模型在轨道列车舱门检测系统中的应用。该数据集专注于轨道列车舱门的检测,具有单一类别的特征,类别数量为1,具体类别为“door”。这一类别的选择反映了我们研究的重点,即准确识别和定位轨道列车的舱门,以提升列车安全性和乘客的出行体验。

“drzwi”数据集的构建过程充分考虑了轨道列车舱门的多样性和复杂性。为了确保模型在实际应用中的有效性,我们收集了来自不同环境和条件下的舱门图像。这些图像不仅涵盖了不同类型的列车舱门,还包括了在不同光照、天气和拍摄角度下的样本。这种多样化的数据来源使得模型能够更好地适应各种实际场景,提高了其泛化能力。

在数据集的标注过程中,我们采用了严格的标注标准,确保每一张图像中的舱门都被准确地框定和标识。通过使用高质量的标注工具,标注人员对每个舱门的边界框进行了精确的绘制,并为每个框分配了相应的类别标签。这一过程不仅提高了数据集的质量,也为后续的模型训练提供了可靠的基础。

为了增强模型的鲁棒性,我们还对“drzwi”数据集进行了数据增强处理。这包括对图像进行旋转、缩放、裁剪、翻转等操作,以生成更多的训练样本。这种数据增强策略旨在模拟不同的现实场景,帮助模型学习到更多的特征,从而提高其在实际应用中的表现。

在训练过程中,我们将“drzwi”数据集分为训练集和验证集,以便对模型的性能进行评估。训练集用于模型的学习,而验证集则用于监测模型在未见数据上的表现。这种分割方式能够有效防止模型的过拟合,确保其在实际应用中的可靠性。

此外,为了评估模型的检测效果,我们将使用一系列指标,包括精确率、召回率和F1-score等。这些指标将帮助我们全面了解模型在舱门检测任务中的表现,并为后续的改进提供依据。

综上所述,“drzwi”数据集的构建和使用为改进YOLOv8的轨道列车舱门检测系统提供了坚实的基础。通过高质量的图像数据和精确的标注,我们期望模型能够在复杂的环境中准确识别舱门,进而提升轨道交通的安全性和效率。这一研究不仅具有重要的理论意义,也为实际应用提供了可行的解决方案,推动了智能交通系统的发展。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.全套项目环境部署视频教程(零基础手把手教学)

5.1 环境部署教程链接(零基础手把手教学)

5.2 安装Python虚拟环境创建和依赖库安装视频教程链接(零基础手把手教学)

6.手把手YOLOV8训练视频教程(零基础小白有手就能学会)

6.1 手把手YOLOV8训练视频教程(零基础小白有手就能学会)

7.70+种全套YOLOV8创新点代码加载调参视频教程(一键加载写好的改进模型的配置文件)

7.1 70+种全套YOLOV8创新点代码加载调参视频教程(一键加载写好的改进模型的配置文件)

8.70+种全套YOLOV8创新点原理讲解(非科班也可以轻松写刊发刊,V10版本正在科研待更新)

由于篇幅限制,每个创新点的具体原理讲解就不一一展开,具体见下列网址中的创新点对应子项目的技术原理博客网址【Blog】:

9.png

8.1 70+种全套YOLOV8创新点原理讲解链接

9.系统功能展示(检测对象为举例,实际内容以本项目数据集为准)

图9.1.系统支持检测结果表格显示

图9.2.系统支持置信度和IOU阈值手动调节

图9.3.系统支持自定义加载权重文件best.pt(需要你通过步骤5中训练获得)

图9.4.系统支持摄像头实时识别

图9.5.系统支持图片识别

图9.6.系统支持视频识别

图9.7.系统支持识别结果文件自动保存

图9.8.系统支持Excel导出检测结果数据

10.png

11.png

12.png

13.png

14.png

15.png

16.png

17.png

10.原始YOLOV8算法原理

原始YOLOv8算法原理

YOLOv8是YOLO系列中的最新版本,代表了目标检测领域的一次重要进步。与其前身YOLOv5相比,YOLOv8在检测精度和速度上都取得了显著的提升。这一版本的设计理念是为了适应不同的应用场景,提供了五种不同规模的模型:YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l和YOLOv8x。每种模型在网络深度和检测精度上都有所不同,其中YOLOv8n以其最小的参数量和最快的检测速度而受到青睐。

YOLOv8的网络结构可以分为四个主要部分:输入端、骨干网络、颈部网络和头部网络。输入端的设计包括了马赛克数据增强、自适应锚框计算和自适应灰度填充等技术,这些技术旨在提高模型对输入数据的适应性和多样性,从而增强模型的鲁棒性。马赛克数据增强通过将多张图像拼接在一起,增加了训练样本的多样性,帮助模型更好地学习到不同场景下的特征。

在骨干网络部分,YOLOv8采用了C2f模块和空间金字塔池化融合(SPPF)结构。C2f模块是YOLOv8的核心特征提取单元,其设计灵感来源于YOLOv7的ELAN结构。C2f模块通过引入更多的分支和跨层连接,增强了模型的梯度流,使得特征学习更加高效。这种结构的引入使得YOLOv8在特征表示能力上得到了显著提升,能够更好地捕捉到图像中的细节信息。

颈部网络则采用了路径聚合网络(PAN)结构,旨在增强不同尺度对象的特征融合能力。通过对来自骨干网络不同阶段的特征图进行融合,PAN能够有效地捕捉到不同尺度目标的信息,从而提高目标检测的性能和鲁棒性。这一部分的设计是YOLOv8能够在多种场景下保持高效检测的关键。

头部网络负责最终的目标检测和分类任务,其设计上采用了分类和检测过程的解耦结构。传统的耦合头结构在处理复杂场景时可能会导致性能瓶颈,而YOLOv8通过将分类和检测分开,能够更灵活地处理不同任务。头部网络中,损失计算过程采用了Task-Aligned Assigner分配策略,根据分类与回归的分数加权结果选择正样本,从而提高了训练的效率和准确性。分类分支使用二元交叉熵损失(BCELoss),而回归分支则结合了分布焦点损失(DFLoss)和完全交并比损失函数(CIOULoss),进一步提升了模型对边界框预测的精准性。

YOLOv8在模型结构上的创新不仅体现在网络的深度和宽度上,还包括了对锚框的处理方式。YOLOv8采用了无锚框检测头(Anchor-Free)设计,减少了锚框预测的数量,从而加速了非最大抑制(NMS)过程。这一改进使得YOLOv8在目标检测时更加高效,尤其是在处理复杂场景和多目标检测时,能够显著提升处理速度和准确性。

总的来说,YOLOv8的设计充分考虑了目标检测任务的多样性和复杂性,通过引入新的网络结构和优化算法,使得模型在检测精度和速度上都得到了显著提升。其灵活的模型架构和高效的特征提取能力,使得YOLOv8在实际应用中表现出色,能够满足不同场景下的需求。随着YOLOv8的推出,目标检测技术将迎来新的发展机遇,为各类应用提供更为强大的支持。

18.png

11.项目核心源码讲解(再也不用担心看不懂代码逻辑)

11.1 ui.py

以下是代码的核心部分,并附上详细的中文注释:

import sys
import subprocess

def run_script(script_path):
    """
    使用当前 Python 环境运行指定的脚本。

    Args:
        script_path (str): 要运行的脚本路径

    Returns:
        None
    """
    # 获取当前 Python 解释器的路径
    python_path = sys.executable

    # 构建运行命令,使用 streamlit 运行指定的脚本
    command = f'"{python_path}" -m streamlit run "{script_path}"'

    # 执行命令
    result = subprocess.run(command, shell=True)
    
    # 检查命令执行的返回码,如果不为0则表示出错
    if result.returncode != 0:
        print("脚本运行出错。")

# 实例化并运行应用
if __name__ == "__main__":
    # 指定要运行的脚本路径
    script_path = "web.py"  # 这里可以直接指定脚本名,假设它在当前目录下

    # 调用函数运行脚本
    run_script(script_path)

代码分析与注释:

  1. 导入模块

    • sys:用于访问与 Python 解释器相关的变量和函数。
    • subprocess:用于执行外部命令和程序。
  2. run_script 函数

    • 功能:接收一个脚本路径,使用当前 Python 环境运行该脚本。
    • 参数:script_path,表示要运行的脚本的路径。
    • 使用 sys.executable 获取当前 Python 解释器的路径,以确保在正确的环境中运行脚本。
    • 构建命令字符串,使用 streamlit 模块运行指定的脚本。
    • 使用 subprocess.run 执行构建的命令,并通过 shell=True 允许使用 shell 特性。
    • 检查命令的返回码,如果返回码不为0,表示脚本运行出错,打印错误信息。
  3. 主程序部分

    • 使用 if __name__ == "__main__": 确保只有在直接运行该脚本时才会执行以下代码。
    • 指定要运行的脚本路径为 web.py,可以根据需要修改为其他脚本。
    • 调用 run_script 函数来执行指定的脚本。

这个程序文件 ui.py 是一个用于运行 Python 脚本的简单工具,特别是用于运行 Streamlit 应用的。首先,文件中导入了一些必要的模块,包括 sysossubprocess,这些模块提供了与系统交互和执行外部命令的功能。此外,还导入了 abs_path 函数,这个函数来自于 QtFusion.path 模块,可能用于获取文件的绝对路径。

ui.py 中,定义了一个名为 run_script 的函数。这个函数的主要功能是接收一个脚本路径作为参数,并使用当前的 Python 环境来运行这个脚本。函数内部首先获取当前 Python 解释器的路径,这通过 sys.executable 实现。接着,构建一个命令字符串,该命令使用 Streamlit 来运行指定的脚本。命令的格式是 "{python_path}" -m streamlit run "{script_path}",其中 python_path 是当前 Python 解释器的路径,script_path 是要运行的脚本路径。

随后,使用 subprocess.run 方法来执行这个命令。shell=True 参数表示在一个新的 shell 中执行命令。执行完命令后,程序会检查返回的状态码,如果返回码不为 0,表示脚本运行出错,程序会打印出相应的错误信息。

在文件的最后部分,使用 if __name__ == "__main__": 语句来确保只有在直接运行这个文件时才会执行下面的代码。这里指定了要运行的脚本路径,调用 abs_path 函数获取 web.py 的绝对路径,并最终调用 run_script 函数来运行这个脚本。

总的来说,这个文件的功能是为运行一个名为 web.py 的 Streamlit 应用提供了一个简单的界面,用户只需运行 ui.py,就可以启动相应的应用。

11.2 code\ultralytics\engine\model.py

以下是经过简化并添加详细中文注释的核心代码部分:

import inspect
import sys
from pathlib import Path
from typing import Union
from ultralytics.nn import nn  # 导入神经网络模块

class Model(nn.Module):
    """
    YOLO模型的基础类,统一所有模型的API接口。
    """

    def __init__(self, model: Union[str, Path] = "yolov8n.pt", task=None, verbose=False) -> None:
        """
        初始化YOLO模型。

        Args:
            model (Union[str, Path], optional): 要加载或创建的模型路径或名称,默认为'yolov8n.pt'。
            task (Any, optional): YOLO模型的任务类型,默认为None。
            verbose (bool, optional): 是否启用详细模式。
        """
        super().__init__()
        self.model = None  # 模型对象
        self.task = task  # 任务类型
        self.model_name = str(model).strip()  # 去除模型名称的空格

        # 检查是否为Ultralytics HUB模型
        if self.is_hub_model(model):
            self.session = self._get_hub_session(model)  # 获取HUB会话
            model = self.session.model_file  # 获取模型文件

        # 加载或创建新的YOLO模型
        model = self.check_model_file(model)  # 检查模型文件后缀
        if Path(model).suffix in (".yaml", ".yml"):
            self._new(model, task=task, verbose=verbose)  # 从配置文件创建新模型
        else:
            self._load(model, task=task)  # 从权重文件加载模型

        self.model_name = model  # 更新模型名称

    def predict(self, source=None, stream=False, **kwargs):
        """
        使用YOLO模型进行预测。

        Args:
            source (str | int | PIL | np.ndarray): 进行预测的图像来源,接受YOLO模型支持的所有来源类型。
            stream (bool): 是否流式处理预测,默认为False。
            **kwargs : 传递给预测器的其他关键字参数。

        Returns:
            (List[ultralytics.engine.results.Results]): 预测结果。
        """
        if source is None:
            source = "assets"  # 默认使用资产文件夹
            print(f"警告: 'source'缺失,使用默认'source={source}'。")

        # 设置预测器参数
        custom = {"conf": 0.25}  # 方法默认参数
        args = {**self.overrides, **custom, **kwargs, "mode": "predict"}  # 合并参数

        # 初始化预测器
        if not self.predictor:
            self.predictor = self._smart_load("predictor")(overrides=args)  # 加载预测器
            self.predictor.setup_model(model=self.model)  # 设置模型
        return self.predictor(source=source, stream=stream)  # 返回预测结果

    @staticmethod
    def is_hub_model(model):
        """检查提供的模型是否为HUB模型。"""
        return model.startswith("https://hub.ultralytics.com/models/")  # 检查模型URL是否符合HUB模型格式

    def _new(self, cfg: str, task=None, model=None, verbose=False):
        """
        初始化新模型并从模型定义推断任务类型。

        Args:
            cfg (str): 模型配置文件
            task (str | None): 模型任务
            model (BaseModel): 自定义模型。
            verbose (bool): 加载时显示模型信息
        """
        cfg_dict = self.load_yaml(cfg)  # 加载配置文件
        self.task = task or self.guess_model_task(cfg_dict)  # 推断任务类型
        self.model = (model or self._smart_load("model"))(cfg_dict, verbose=verbose)  # 创建模型

    def _load(self, weights: str, task=None):
        """
        从权重文件加载模型并推断任务类型。

        Args:
            weights (str): 要加载的模型检查点
            task (str | None): 模型任务
        """
        self.model, self.ckpt = self.attempt_load_one_weight(weights)  # 加载权重
        self.task = self.model.args["task"]  # 获取任务类型

    def _smart_load(self, key):
        """加载模型/训练器/验证器/预测器。"""
        try:
            return self.task_map[self.task][key]  # 根据任务类型获取相应的类
        except Exception as e:
            raise NotImplementedError(f"模型不支持该任务类型: {self.task}") from e

    @property
    def task_map(self):
        """返回任务与模型、训练器、验证器和预测器类的映射。"""
        raise NotImplementedError("请提供模型的任务映射!")

代码注释说明

  1. 类和方法说明:每个类和方法都有简要的说明,解释其功能和参数。
  2. 初始化方法:在__init__方法中,详细说明了如何加载模型和任务类型。
  3. 预测方法predict方法中详细描述了如何进行预测,包括参数和返回值。
  4. 静态方法is_hub_model用于检查模型是否为HUB模型。
  5. 加载和创建模型_new_load方法用于初始化和加载模型的具体实现。
  6. 错误处理:在_smart_load方法中处理可能的错误并提供反馈。

这些注释旨在帮助理解代码的结构和功能,使得其他开发者能够更容易地维护和扩展该代码。

这个程序文件定义了一个名为 Model 的类,主要用于统一处理各种 YOLO(You Only Look Once)模型的 API。该类继承自 PyTorch 的 nn.Module,并提供了一系列方法和属性来加载、训练、预测和评估模型。

在类的构造函数 __init__ 中,用户可以指定模型文件的路径或名称、任务类型和是否启用详细模式。构造函数首先检查模型是否来自 Ultralytics HUB 或 Triton Server,如果是,则相应地处理模型。接着,程序会根据模型文件的后缀名(如 .yaml.pt)来决定是加载新模型还是创建新模型。

该类的核心方法包括:

  • __call__:允许使用 Model 实例直接调用,实际上是调用 predict 方法进行对象检测。
  • _new_load:分别用于初始化新模型和加载已有模型的权重。
  • predict:执行预测,接受多种类型的输入源(如文件路径、图像等),并返回预测结果。
  • train:用于训练模型,支持使用自定义训练器和配置参数。
  • val:用于在给定数据集上验证模型的性能。
  • export:将模型导出为其他格式,便于在不同平台上使用。

此外,类中还定义了一些静态方法,如 is_hub_modelis_triton_model,用于检查模型的来源类型。还有一些辅助方法,如 reset_weightsfuse,用于重置模型参数和融合模型层以加快推理速度。

类的属性包括模型的名称、设备信息、转换函数等,方便用户获取模型的相关信息。通过 add_callbackclear_callbackreset_callbacks 方法,用户可以管理模型训练和预测过程中的回调函数。

总的来说,这个类为 YOLO 模型的使用提供了一个高层次的封装,使得用户可以方便地进行模型的加载、训练、预测和评估。

11.3 70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\models\yolo\pose\predict.py

以下是代码中最核心的部分,并附上详细的中文注释:

from ultralytics.engine.results import Results  # 导入结果处理类
from ultralytics.models.yolo.detect.predict import DetectionPredictor  # 导入检测预测类
from ultralytics.utils import DEFAULT_CFG, LOGGER, ops  # 导入默认配置、日志记录器和操作工具

class PosePredictor(DetectionPredictor):
    """
    PosePredictor类,扩展了DetectionPredictor类,用于基于姿态模型的预测。
    """

    def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
        """初始化PosePredictor,设置任务为'pose'并记录使用'mps'作为设备的警告。"""
        super().__init__(cfg, overrides, _callbacks)  # 调用父类构造函数
        self.args.task = 'pose'  # 设置任务类型为姿态预测
        # 检查设备类型,如果是Apple MPS,记录警告信息
        if isinstance(self.args.device, str) and self.args.device.lower() == 'mps':
            LOGGER.warning("WARNING ⚠️ Apple MPS known Pose bug. Recommend 'device=cpu' for Pose models. "
                           'See https://github.com/ultralytics/ultralytics/issues/4031.')

    def postprocess(self, preds, img, orig_imgs):
        """返回给定输入图像或图像列表的检测结果。"""
        # 应用非极大值抑制,过滤预测结果
        preds = ops.non_max_suppression(preds,
                                        self.args.conf,  # 置信度阈值
                                        self.args.iou,  # IOU阈值
                                        agnostic=self.args.agnostic_nms,  # 是否类别无关的NMS
                                        max_det=self.args.max_det,  # 最大检测数量
                                        classes=self.args.classes,  # 选择的类别
                                        nc=len(self.model.names))  # 类别数量

        # 如果输入图像不是列表,则将其转换为numpy数组
        if not isinstance(orig_imgs, list):
            orig_imgs = ops.convert_torch2numpy_batch(orig_imgs)

        results = []  # 存储结果的列表
        for i, pred in enumerate(preds):  # 遍历每个预测结果
            orig_img = orig_imgs[i]  # 获取原始图像
            # 将预测框的坐标缩放到原始图像的尺寸
            pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], orig_img.shape).round()
            # 获取关键点预测结果并进行坐标缩放
            pred_kpts = pred[:, 6:].view(len(pred), *self.model.kpt_shape) if len(pred) else pred[:, 6:]
            pred_kpts = ops.scale_coords(img.shape[2:], pred_kpts, orig_img.shape)
            img_path = self.batch[0][i]  # 获取图像路径
            # 将结果存储到Results对象中
            results.append(
                Results(orig_img, path=img_path, names=self.model.names, boxes=pred[:, :6], keypoints=pred_kpts))
        return results  # 返回所有结果

代码说明:

  1. PosePredictor类:该类继承自DetectionPredictor,用于处理姿态预测的任务。
  2. 初始化方法:在初始化时设置任务类型为“pose”,并检查设备类型,如果是Apple的MPS设备,则记录警告。
  3. 后处理方法:该方法负责处理模型的预测结果,包括应用非极大值抑制、缩放预测框和关键点坐标,并将结果封装到Results对象中以便后续使用。

该程序文件是一个用于姿态预测的类 PosePredictor,它继承自 DetectionPredictor 类,属于 Ultralytics YOLO 系列模型的一部分。该类的主要功能是对输入图像进行姿态检测,并返回检测结果。

在文件开头,首先导入了一些必要的模块和类,包括 ResultsDetectionPredictor 和一些工具函数。接着,定义了 PosePredictor 类,并在类的文档字符串中提供了使用示例,说明如何实例化该类并调用其预测功能。

__init__ 方法中,初始化了 PosePredictor 类。该方法调用了父类的构造函数,并将任务类型设置为 'pose'。此外,如果设备类型为 'mps'(即 Apple 的 Metal Performance Shaders),则会发出警告,建议用户使用 CPU 进行姿态模型的推理,因为在 MPS 上已知存在一些问题。

postprocess 方法用于处理模型的预测结果。它接收预测结果、输入图像和原始图像作为参数。首先,使用非极大值抑制(NMS)来过滤掉低置信度的检测结果。接着,如果输入的原始图像不是列表格式,则将其转换为 NumPy 数组格式。

然后,方法遍历每个预测结果,调整边界框的坐标以适应原始图像的尺寸,并将关键点的坐标进行相应的缩放。最后,将每个检测结果封装为 Results 对象,并将其添加到结果列表中。最终,该方法返回所有处理后的结果。

总体而言,该文件实现了一个专门用于姿态检测的预测器,提供了初始化、预测和后处理的功能,使得用户能够方便地进行姿态识别任务。

11.4 train.py

以下是经过简化并添加详细中文注释的核心代码部分:

import random
import numpy as np
import torch.nn as nn
from ultralytics.data import build_dataloader, build_yolo_dataset
from ultralytics.engine.trainer import BaseTrainer
from ultralytics.models import yolo
from ultralytics.nn.tasks import DetectionModel
from ultralytics.utils import LOGGER, RANK
from ultralytics.utils.torch_utils import de_parallel, torch_distributed_zero_first

class DetectionTrainer(BaseTrainer):
    """
    基于检测模型的训练类,继承自BaseTrainer类。
    """

    def build_dataset(self, img_path, mode="train", batch=None):
        """
        构建YOLO数据集。

        参数:
            img_path (str): 包含图像的文件夹路径。
            mode (str): 模式,'train'或'val',用户可以为每种模式自定义不同的数据增强。
            batch (int, optional): 批次大小,适用于'rect'模式。默认为None。
        """
        gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
        return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=mode == "val", stride=gs)

    def get_dataloader(self, dataset_path, batch_size=16, rank=0, mode="train"):
        """构造并返回数据加载器。"""
        assert mode in ["train", "val"]
        with torch_distributed_zero_first(rank):  # 仅在DDP中初始化数据集*.cache一次
            dataset = self.build_dataset(dataset_path, mode, batch_size)
        shuffle = mode == "train"  # 训练模式下打乱数据
        if getattr(dataset, "rect", False) and shuffle:
            LOGGER.warning("WARNING ⚠️ 'rect=True'与DataLoader的shuffle不兼容,设置shuffle=False")
            shuffle = False
        workers = self.args.workers if mode == "train" else self.args.workers * 2
        return build_dataloader(dataset, batch_size, workers, shuffle, rank)  # 返回数据加载器

    def preprocess_batch(self, batch):
        """对一批图像进行预处理,包括缩放和转换为浮点数。"""
        batch["img"] = batch["img"].to(self.device, non_blocking=True).float() / 255  # 将图像转换为浮点数并归一化
        if self.args.multi_scale:  # 如果启用多尺度
            imgs = batch["img"]
            sz = (
                random.randrange(self.args.imgsz * 0.5, self.args.imgsz * 1.5 + self.stride)
                // self.stride
                * self.stride
            )  # 随机选择新的尺寸
            sf = sz / max(imgs.shape[2:])  # 计算缩放因子
            if sf != 1:
                ns = [
                    math.ceil(x * sf / self.stride) * self.stride for x in imgs.shape[2:]
                ]  # 计算新的形状
                imgs = nn.functional.interpolate(imgs, size=ns, mode="bilinear", align_corners=False)  # 进行插值缩放
            batch["img"] = imgs
        return batch

    def get_model(self, cfg=None, weights=None, verbose=True):
        """返回YOLO检测模型。"""
        model = DetectionModel(cfg, nc=self.data["nc"], verbose=verbose and RANK == -1)  # 创建检测模型
        if weights:
            model.load(weights)  # 加载权重
        return model

    def plot_training_samples(self, batch, ni):
        """绘制带有注释的训练样本。"""
        plot_images(
            images=batch["img"],
            batch_idx=batch["batch_idx"],
            cls=batch["cls"].squeeze(-1),
            bboxes=batch["bboxes"],
            paths=batch["im_file"],
            fname=self.save_dir / f"train_batch{ni}.jpg",
            on_plot=self.on_plot,
        )

    def plot_metrics(self):
        """从CSV文件中绘制指标。"""
        plot_results(file=self.csv, on_plot=self.on_plot)  # 保存结果图

代码说明:

  1. 类定义DetectionTrainer类用于训练YOLO检测模型,继承自BaseTrainer
  2. 构建数据集build_dataset方法用于根据给定的图像路径和模式构建YOLO数据集。
  3. 获取数据加载器get_dataloader方法构造并返回数据加载器,支持分布式训练。
  4. 预处理批次preprocess_batch方法对输入的图像批次进行归一化和缩放处理。
  5. 获取模型get_model方法返回一个YOLO检测模型,并可选择加载预训练权重。
  6. 绘制训练样本plot_training_samples方法用于可视化训练样本及其标注。
  7. 绘制指标plot_metrics方法用于从CSV文件中绘制训练过程中的指标。

这个程序文件 train.py 是一个用于训练 YOLO(You Only Look Once)目标检测模型的脚本,继承自 BaseTrainer 类。该文件主要包含了构建数据集、数据加载、预处理、模型设置、训练过程中的损失计算和可视化等功能。

首先,程序导入了一些必要的库和模块,包括数学运算、随机数生成、深度学习框架 PyTorch 相关的模块,以及 Ultralytics 提供的用于数据处理和模型训练的工具。

DetectionTrainer 类是该文件的核心,负责管理训练过程。它的 build_dataset 方法用于构建 YOLO 数据集,接收图像路径、模式(训练或验证)和批量大小作为参数。该方法通过调用 build_yolo_dataset 函数来创建数据集,并根据模型的步幅设置进行处理。

get_dataloader 方法则负责构建数据加载器,确保在分布式训练中只初始化一次数据集,并根据模式设置是否打乱数据顺序。它会根据训练或验证模式选择合适的工作线程数量,并返回构建好的数据加载器。

preprocess_batch 方法中,程序对输入的图像批次进行预处理,包括将图像缩放到适当的大小并转换为浮点数。该方法还支持多尺度训练,通过随机选择图像大小来增强模型的鲁棒性。

set_model_attributes 方法用于设置模型的属性,包括类别数量和类别名称等,以确保模型能够正确识别训练数据中的目标。

get_model 方法用于返回一个 YOLO 检测模型,如果提供了权重文件,则会加载这些权重。

get_validator 方法返回一个用于验证模型性能的 DetectionValidator 实例,以便在训练过程中评估模型的表现。

label_loss_items 方法用于返回一个包含训练损失项的字典,方便后续的监控和分析。

progress_string 方法生成一个格式化的字符串,用于显示训练进度,包括当前的轮次、GPU 内存使用情况、损失值、实例数量和图像大小等信息。

plot_training_samples 方法用于绘制训练样本及其标注,便于可视化训练过程中的数据情况。

最后,plot_metricsplot_training_labels 方法分别用于绘制训练过程中的指标和创建带标签的训练图,帮助用户更好地理解模型的训练效果。

总体来说,这个程序文件提供了一个完整的框架,用于训练 YOLO 模型,支持数据集构建、模型设置、训练过程监控和结果可视化等功能。

11.5 70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\models\yolo_init_.py

以下是代码中最核心的部分,并附上详细的中文注释:

# 导入Ultralytics YOLO库中的分类、检测、姿态估计和分割功能
from ultralytics.models.yolo import classify, detect, pose, segment

# 从当前模块导入YOLO模型
from .model import YOLO

# 定义模块的公开接口,包含分类、分割、检测、姿态估计功能和YOLO模型
__all__ = 'classify', 'segment', 'detect', 'pose', 'YOLO'

注释说明:

  1. 导入功能模块

    • classify:用于图像分类的功能。
    • detect:用于目标检测的功能。
    • pose:用于姿态估计的功能。
    • segment:用于图像分割的功能。

    这些功能都是YOLO(You Only Look Once)模型的核心应用,能够处理不同的计算机视觉任务。

  2. 导入YOLO模型

    • from .model import YOLO:从当前模块中导入YOLO模型的实现,以便后续使用。
  3. 定义公开接口

    • __all__:这个特殊变量定义了当使用from module import *时,哪些名称会被导入。这里列出了所有需要公开的功能和模型,确保用户可以方便地访问这些核心功能。

这个程序文件是Ultralytics YOLO模型库的一部分,主要用于导入和组织YOLO相关的功能和模型。文件的开头包含了一条注释,指出这是Ultralytics YOLO项目,并声明其使用AGPL-3.0许可证,这意味着该代码是开源的,并且遵循相应的开源协议。

接下来,文件通过from语句导入了四个主要的功能模块:classify(分类)、detect(检测)、pose(姿态估计)和segment(分割)。这些模块分别实现了YOLO模型在不同任务上的应用,允许用户使用这些功能进行图像处理和分析。

此外,文件还从同一目录下的model模块中导入了YOLO类,这个类可能是YOLO模型的核心实现,提供了模型的构建、训练和推理等功能。

最后,__all__变量被定义为一个元组,包含了所有希望被外部访问的名称。这意味着当用户使用from ultralytics.models.yolo import *时,只会导入classifysegmentdetectposeYOLO这几个名称,从而避免了命名冲突和不必要的导入。

总体而言,这个文件的主要作用是为YOLO模型的不同功能提供一个清晰的接口,使得用户能够方便地使用这些功能进行计算机视觉任务。

11.6 70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\nn\extra_modules\orepa.py

以下是代码中最核心的部分,并附上详细的中文注释:

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np

# 定义OREPA模块
class OREPA(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=None, groups=1, dilation=1, act=True):
        super(OREPA, self).__init__()
        
        # 初始化参数
        self.kernel_size = kernel_size
        self.in_channels = in_channels
        self.out_channels = out_channels
        self.groups = groups
        self.stride = stride
        self.padding = padding if padding is not None else (kernel_size // 2)
        self.dilation = dilation
        
        # 激活函数的选择
        self.nonlinear = nn.ReLU() if act else nn.Identity()
        
        # 定义权重参数
        self.weight_orepa_origin = nn.Parameter(torch.Tensor(out_channels, in_channels // groups, kernel_size, kernel_size))
        nn.init.kaiming_uniform_(self.weight_orepa_origin)  # 使用Kaiming初始化
        
        # 定义其他卷积权重
        self.weight_orepa_avg_conv = nn.Parameter(torch.Tensor(out_channels, in_channels // groups, 1, 1))
        nn.init.kaiming_uniform_(self.weight_orepa_avg_conv)
        
        self.weight_orepa_1x1 = nn.Parameter(torch.Tensor(out_channels, in_channels // groups, 1, 1))
        nn.init.kaiming_uniform_(self.weight_orepa_1x1)

        # 其他参数的初始化
        self.vector = nn.Parameter(torch.Tensor(6, out_channels))  # 权重组合向量
        self.fre_init()  # 自定义初始化

    def fre_init(self):
        # 自定义初始化方法
        prior_tensor = torch.Tensor(self.out_channels, self.kernel_size, self.kernel_size)
        half_fg = self.out_channels / 2
        for i in range(self.out_channels):
            for h in range(self.kernel_size):
                for w in range(self.kernel_size):
                    if i < half_fg:
                        prior_tensor[i, h, w] = np.cos(np.pi * (h + 0.5) * (i + 1) / 3)
                    else:
                        prior_tensor[i, h, w] = np.cos(np.pi * (w + 0.5) * (i + 1 - half_fg) / 3)
        self.register_buffer('weight_orepa_prior', prior_tensor)  # 注册为缓冲区

    def weight_gen(self):
        # 生成最终的卷积权重
        weight_orepa_origin = self.weight_orepa_origin * self.vector[0, :].view(-1, 1, 1, 1)
        weight_orepa_avg = self.weight_orepa_avg_conv * self.vector[1, :].view(-1, 1, 1, 1)
        weight_orepa_1x1 = self.weight_orepa_1x1 * self.vector[2, :].view(-1, 1, 1, 1)
        
        # 合并所有权重
        weight = weight_orepa_origin + weight_orepa_avg + weight_orepa_1x1
        return weight

    def forward(self, inputs):
        # 前向传播
        weight = self.weight_gen()  # 生成权重
        out = F.conv2d(inputs, weight, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups)
        return self.nonlinear(out)  # 应用激活函数

# 定义一个用于测试的卷积模块
class ConvBN(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1):
        super(ConvBN, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, groups=groups, bias=False)
        self.bn = nn.BatchNorm2d(out_channels)  # 批归一化

    def forward(self, x):
        return self.bn(self.conv(x))  # 前向传播

# 定义RepVGGBlock_OREPA模块
class RepVGGBlock_OREPA(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=None, groups=1, act=True):
        super(RepVGGBlock_OREPA, self).__init__()
        self.deploy = False  # 是否部署模式
        self.rbr_dense = OREPA(in_channels, out_channels, kernel_size, stride, padding, groups)  # 使用OREPA模块
        self.rbr_1x1 = ConvBN(in_channels, out_channels, kernel_size=1, stride=stride, groups=groups)  # 1x1卷积

    def forward(self, inputs):
        # 前向传播
        out1 = self.rbr_dense(inputs)  # 通过OREPA模块
        out2 = self.rbr_1x1(inputs)  # 通过1x1卷积
        return out1 + out2  # 合并输出

代码核心部分解释:

  1. OREPA模块:这是一个自定义的卷积模块,使用多个卷积核和参数组合生成最终的卷积权重。它支持多种卷积操作的组合。
  2. 权重生成weight_gen方法用于生成最终的卷积权重,通过组合不同的卷积权重和对应的权重系数。
  3. 前向传播:在forward方法中,输入通过生成的卷积权重进行卷积操作,并应用激活函数。
  4. ConvBN模块:这是一个简单的卷积层,后接批归一化,方便在网络中使用。
  5. RepVGGBlock_OREPA模块:这是一个复合模块,结合了OREPA和1x1卷积,能够处理输入并生成输出。

这些模块的设计使得网络能够灵活地组合不同的卷积操作,从而提高了模型的表达能力和性能。

该程序文件包含了YOLOv8算法中的一些改进模块,主要实现了OREPA(Ordered Residual Path Aggregation)和相关的卷积层结构。代码中使用了PyTorch框架,定义了多个类和函数,以实现高效的卷积操作和参数生成。

首先,文件导入了必要的库,包括PyTorch的核心模块、数学库和NumPy。接着,定义了一些辅助函数,如transI_fusebntransVI_multiscale,用于处理卷积核和批归一化(Batch Normalization)层的融合,以及对卷积核进行多尺度填充。

OREPA类是核心模块之一,继承自nn.Module。在初始化方法中,设置了输入输出通道、卷积核大小、步幅、填充、分组等参数,并根据是否部署(deploy)来选择不同的参数初始化方式。该类中定义了多个卷积权重参数,并通过Kaiming均匀分布进行初始化。权重生成函数weight_gen负责根据当前的参数生成最终的卷积权重。

OREPA_LargeConv类则是对大卷积核的实现,支持更大的卷积核尺寸,并使用多个OREPA模块来构建更复杂的卷积结构。

ConvBN类实现了卷积层与批归一化层的结合,提供了前向传播方法和部署转换方法。它在部署时将卷积和批归一化融合为一个卷积层,以提高推理效率。

OREPA_3x3_RepVGG类是一个特定的卷积模块,使用3x3卷积和1x1卷积的组合,支持可选的SE(Squeeze-and-Excitation)注意力机制。

最后,RepVGGBlock_OREPA类实现了完整的块结构,结合了前述的多个模块,提供了前向传播和权重融合的方法。该模块在推理时可以将多个卷积操作合并为一个高效的卷积层,适用于实际应用中的高效推理。

整体来看,该文件通过定义多个灵活的卷积模块和参数生成方法,旨在提高YOLOv8算法的性能和效率,适应不同的应用场景。

12.系统整体结构(节选)

整体功能和构架概括

该项目是一个基于YOLOv8算法的计算机视觉框架,主要用于目标检测、姿态估计和图像分割等任务。整个代码库的结构清晰,功能模块化,便于扩展和维护。主要包括以下几个部分:

  1. 模型定义与训练:提供了YOLO模型的定义、训练和验证功能,支持多种数据集和训练配置。
  2. 预测与后处理:实现了对输入图像的预测功能,并对模型输出进行后处理,以获取最终的检测结果。
  3. 用户界面:提供了简单的用户界面,方便用户启动和运行模型。
  4. 额外模块:实现了一些改进的卷积层和网络结构,以提高模型的性能和推理效率。
  5. 工具函数:提供了一些辅助功能,如数据加载、回调函数、可视化等,支持训练和推理过程中的监控和分析。

文件功能整理表

文件路径功能描述
D:\tools\20240809\code\ui.py提供一个简单的用户界面,用于运行YOLO模型的Streamlit应用。
D:\tools\20240809\code\ultralytics\engine\model.py定义YOLO模型的核心类,提供模型的加载、训练、预测和评估功能。
D:\tools\20240809\code\70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\models\yolo\pose\predict.py实现姿态检测的预测器,处理模型的预测结果并返回检测结果。
D:\tools\20240809\code\train.py管理YOLO模型的训练过程,包括数据集构建、模型设置、损失计算和可视化等功能。
D:\tools\20240809\code\70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\models\yolo\__init__.py组织YOLO相关功能的模块,提供清晰的接口以便用户使用不同的YOLO功能。
D:\tools\20240809\code\70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\nn\extra_modules\orepa.py实现OREPA模块和改进的卷积层结构,以提高YOLO模型的性能和推理效率。
code\ultralytics\models\sam\__init__.py组织SAM(Segment Anything Model)相关功能的模块,提供相应的接口。
code\utils.py提供一些通用的工具函数,支持数据处理、文件操作等功能。
70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\utils\callbacks\clearml.py实现与ClearML的集成,支持训练过程中的监控和管理。
70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\models\rtdetr\__init__.py组织RTDETR(Real-Time DEtection Transformer)相关功能的模块,提供相应的接口。
code\ultralytics\models\utils\__init__.py组织模型相关的工具函数,提供便捷的接口。
code\ultralytics\utils\callbacks\wb.py实现与Weights & Biases的集成,支持训练过程中的监控和管理。
70+种YOLOv8算法改进源码大全和调试加载训练教程(非必要)\ultralytics\utils\callbacks\hub.py实现与Ultralytics Hub的集成,支持模型的管理和版本控制。

以上表格总结了每个文件的主要功能,展示了该项目的模块化设计和各个组件之间的协作关系。

注意:由于此博客编辑较早,上面“11.项目核心源码讲解(再也不用担心看不懂代码逻辑)”中部分代码可能会优化升级,仅供参考学习,完整“训练源码”、“Web前端界面”和“70+种创新点源码”以“13.完整训练+Web前端界面+70+种创新点源码、数据集获取(由于版权原因,本博客仅提供【原始博客的链接】,原始博客提供下载链接)”的内容为准。

13.完整训练+Web前端界面+70+种创新点源码、数据集获取(由于版权原因,本博客仅提供【原始博客的链接】,原始博客提供下载链接)

19.png

参考原始博客1: https://gitee.com/qunshansj/drzwi478

参考原始博客2: https://github.com/VisionMillionDataStudio/drzwi478

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

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

相关文章

【Android 13源码分析】WindowContainer窗口层级-3-实例分析

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

Redis的AOF持久化、重写机制、RDB持久化、混合持久化

1、AOF持久化 1.1.AOF持久化大致过程 概括&#xff1a;命令追加&#xff08;append&#xff09;、文件写入、文件同步&#xff08;sync&#xff09; Redis 每执行一条写操作命令&#xff0c;就把该命令以追加的方式写入到一个文件里&#xff0c;然后重启 Redis 的时候&#…

Pytest配置文件pytest.ini如何编写生成日志文件?

1、新建pytest.ini文件 [pytest] log_clitrue log_leveLNOTSET log_format %(asctime)s %(levelname)s %(message)s %(filename)s %(funcName)s %(lineno)d log_date_format %Y-%m-%d %H:%M:%Slog_file ./logdata/log.log log_file_level info log_file_format %(asctime…

实时(按帧)处理的低通滤波C语言实现

写在前面&#xff1a; 低通滤波采用一般的FIR滤波器&#xff0c;因为本次任务&#xff0c;允许的延迟较多&#xff0c;或者说前面损失的信号可以较多&#xff0c;因此&#xff0c;涉及一个很高阶的FIR滤波器&#xff0c;信号起始段的信号点可以不处理&#xff0c;以及&#xf…

召回01 基于物品是协同过滤 ItemCF

相似度&#xff0c;类似机器学习里面常用的cosine相似度

python AssertionError: Torch not compiled with CUDA enabled

查看&#xff1a;torch import torch# 输出带CPU&#xff0c;表示torch是CPU版本的 print(ftorch的版本是&#xff1a;{torch.__version__}) # print(ftorch是否能使用cuda&#xff1a;{torch.cuda.is_available()}) 修改一下代码&#xff0c;将cuda改成cpu 最后运行正常&…

【React源码解析】深入理解react时间切片和fiber架构

时间切片 假如React一个更新需要耗时200ms&#xff0c;我们可以将其拆分为40个5ms的更新&#xff08;后续会讲到如何拆分&#xff09;&#xff0c;然后每一帧里只花5ms来执行更新。那么&#xff0c;每一帧里不就剩余16.7 - 5 11.7ms的时间可以进行用户事件&#xff0c;渲染等…

13 Midjourney从零到商用·进阶篇:灯光、角度与风格等精细控制方法

在前面我们了解了提示词的书写&#xff0c;那么如何利用提示词来精确控制生成画面的灯光、角度与风格 呢&#xff1f;在本篇文章中我么一起来探讨一下。 一、灯光 在摄影中&#xff0c;对灯光的要求都是非常高的。灯光能对人物、动物、物体、场景等进行修饰。每一种微小的的灯光…

链接升级:Element UI <el-link> 的应用

链接升级&#xff1a;Element UI 的应用 一 . 创建文字链接1.1 注册路由1.2 创建文字链接 二 . 文字链接的属性2.1 文字链接的颜色2.2 是否显示下划线2.3 是否禁用状态2.4 填写跳转地址2.5 加入图标 在本篇文章中&#xff0c;我们将深入探索Element UI中的<el-link>组件—…

本地不能訪問linux的kafka服務

1.本地使用kafka客戶端工具連接kafka服務&#xff0c;提示連接失敗 2. 本地使用telnet ip port命令也失敗 3.查看zookeeper和kafka服務是否正常 ps -ef | grep zookeeper ps -ef | grep kafka 3.關閉操作系統的防火墻(僅限于測試使用) 3.1.禁用防火墙 systemctl stop firew…

先有正态分布,还是先有高斯函数?

正态分布&#xff08;也称为高斯分布&#xff09;是由德国数学家卡尔弗里德里希高斯在研究天文学中的误差分布时提出的。而高斯函数通常指的是正态分布的概率密度函数&#xff0c;它是描述正态分布特性的一个数学表达式。因此&#xff0c;可以明确地说&#xff0c;是先有正态分…

eureka.client.service-url.defaultZone的坑

错误的配置 eureka: client: service-url: default-zone: http://192.168.100.10:8080/eureka正确的配置 eureka: client: service-url: defaultZone: http://192.168.100.10:8080/eureka根据错误日志堆栈打断电调试 出现两个key&#xff0c;也就是defaultZone不支持snake-c…

Vue: watch5种监听情况

目录 一.watch的性质与作用 1.watch 的性质包括&#xff1a; 2.watch 常用于以下场景&#xff1a; 二.监视ref定义的基本类型数据 三.监视ref定义的对象类型数据 四.监视reactive定义的对象类型数据 五.监视ref或reactive定义的对象类型数据中的某个属性 六.监视上述的…

c++题目_【模板】最小生成树Prim

题目描述 这是一道最小生成树Prim的模板题&#xff0c;本题与【模板】最小生成树Kruskal&#xff0c;仅仅只有nn和mm的大小不同 给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出orz 输入 第一行输入2个正整数n,mn,m&#xff0c;代表…

【自然语言处理】实验三:新冠病毒的FAQ问答系统

目录 前言 1.新建data_process.py 1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件 1.2功能模块2&#xff1a;进行问题/问题列表处理&#xff08;正则化&#xff0c;分词&#xff09; 1.3功能模块3&#xff1a;处理输入的问题 1.4功能模块4&#xff1a;计算输入问题与问题…

Java | Leetcode Java题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; class Solution {public boolean canCross(int[] stones) {int n stones.length;boolean[][] dp new boolean[n][n];dp[0][0] true;for (int i 1; i < n; i) {if (stones[i] - stones[i - 1] > i) {return false;}}for (int i 1…

redis windows安装包下载路径

https://github.com/tporadowski/redis/releases 通过网盘分享的文件&#xff1a;Redis-x64-5.0.14.1.zip 链接: https://pan.baidu.com/s/12XQOfKB75yajJ0fJLzl4rQ?pwd1234 提取码: 1234

C++数据结构-树的概念及分类介绍(基础篇)

1.什么是树 树是数据结构中的一种&#xff0c;其属于非线性数据结构结构的一种&#xff0c;我们前文所提到的数据结构多数都是线性的&#xff0c;这也是较为简单的数据结构&#xff0c;而接下来的树与图均属于非线性数据结构&#xff0c;也是概念极多的一类。 树是由结点或顶…

软件设计师容易考吗?

一、软考软件设计师难吗 软考软件设计师考试对于不同的人来说&#xff0c;难度可能有所差异。然而&#xff0c;总体来说&#xff0c;软考软件设计师考试是相对较难的考试&#xff0c;需要考生具备扎实的软件设计理论知识和实践经验。 从各地2024年上半年软考合格人数的公布情…

Python | Leetcode Python题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; CONV "0123456789abcdef" class Solution:def toHex(self, num: int) -> str:ans []# 32位2进制数&#xff0c;转换成16进制 -> 4个一组&#xff0c;一共八组for _ in range(8):ans.append(num%16)num // 16if not num:b…