YOLOv7-0.1部分代码阅读笔记-hubconf.py

hubconf.py

hubconf.py

目录

hubconf.py

1.所需的库和模块

2.def create(name, pretrained, channels, classes, autoshape): 

3.def custom(path_or_model='path/to/model.pt', autoshape=True): 

4.def yolov7(pretrained=True, channels=3, classes=80, autoshape=True): 

5.if __name__ == '__main__': 


1.所需的库和模块

"""PyTorch Hub modelsUsage:import torchmodel = torch.hub.load('repo', 'model')
"""from pathlib import Pathimport torchfrom models.yolo import Model
from utils.general import check_requirements, set_logging
from utils.google_utils import attempt_download
from utils.torch_utils import select_device# 设置依赖项。这行代码定义了一个名为 dependencies 的列表,其中包含了YOLOv7模型所需的依赖库。这里指定了 torch 和 yaml 两个库,意味着在安装YOLOv7时,这两个库是必需的。
dependencies = ['torch', 'yaml']
# 检查依赖项。
# 这行代码调用了 check_requirements 函数,它的作用是检查当前环境中是否安装了 requirements.txt  文件中列出的所有依赖项。
# Path(__file__).parent / 'requirements.txt'  这部分代码获取了当前文件( hubconf.py )的父目录路径,并将其与 requirements.txt 文件名组合,形成了完整的文件路径。
# exclude=('pycocotools', 'thop') 参数指定了两个不需要检查的依赖项,即 pycocotools 和 thop 。
# def check_requirements(requirements='requirements.txt', exclude=()): -> 其目的是检查当前环境中安装的依赖是否满足特定的要求,并在必要时自动更新这些依赖。这个函数可以接收一个包含依赖的文本文件或依赖列表,并排除一些不需要检查的包。
check_requirements(Path(__file__).parent / 'requirements.txt', exclude=('pycocotools', 'thop'))
# 设置日志记录。
# 这行代码调用了 set_logging 函数,用于设置日志记录的配置。这通常用于控制日志的输出级别和格式,以便在调试和运行时能够更好地追踪程序的行为。
# def set_logging(rank=-1): -> 它用于配置 Python 的日志记录系统。
set_logging()
# 这段代码用于确保在安装和运行YOLOv7模型时,所有必需的依赖项都已正确安装,并且日志系统被正确配置。

2.def create(name, pretrained, channels, classes, autoshape): 

# 这段代码定义了一个名为 create 的函数,它用于创建并配置一个YOLOv7模型。
# 1.name : 模型的名称,用于确定要加载的配置文件和预训练权重。
# 2.pretrained : 布尔值,指示是否加载预训练权重。
# 3.channels : 输入图像的通道数。
# 4.classes : 类别数,用于模型的输出层。
# 5.autoshape : 布尔值,指示是否自动调整模型输入形状以适应不同输入类型。
def create(name, pretrained, channels, classes, autoshape):# 创建指定模型。"""Creates a specified modelArguments:name (str): name of model, i.e. 'yolov7'pretrained (bool): load pretrained weights into the modelchannels (int): number of input channelsclasses (int): number of model classesReturns:pytorch model"""try:# pathlib.Path.rglob(pattern)# rglob 是 Python pathlib 模块中的 Path 类的一个方法,用于递归地搜索给定目录下所有匹配特定模式的文件路径。# 参数 :# pattern :一个字符串,表示要匹配的文件模式。这个模式遵循 Unix shell 的规则,例如 *.txt 会匹配所有以 .txt 结尾的文件。# 返回值 :# 返回一个生成器(generator),生成所有匹配模式的 Path 对象。# rglob 方法是一个非常方便的工具,用于文件搜索和目录遍历,它允许你以一种简洁的方式获取所有匹配特定模式的文件路径。# 配置文件路径。这行代码使用 Path(__file__).parent / 'cfg' 来找到模型配置文件所在的目录,并使用 rglob 函数搜索与模型名称匹配的 .yaml 文件。这里假设只有一个匹配的文件,因此直接取第一个结果。# Path(__file__).parent 是 Python 中 pathlib 模块的一个用法,它用于获取当前文件的父目录路径。# __file__ 是一个特殊的 Python 变量,它包含了当前文件的路径。例如,如果当前文件是 example.py ,那么 __file__ 的值可能是 /path/to/example.py 。# Path 是 pathlib 模块中的一个类,用于表示文件系统路径。 Path(__file__) 将 __file__ 的字符串路径转换为 Path 对象,这样可以更方便地进行路径操作。# parent 是 Path 对象的一个属性,它返回当前路径的父目录。例如,如果 Path(__file__) 是 /path/to/example.py ,那么 Path(__file__).parent 的值是 /path/to 。cfg = list((Path(__file__).parent / 'cfg').rglob(f'{name}.yaml'))[0]  # model.yaml path# 创建模型实例。使用找到的配置文件、输入通道数和类别数来创建一个 Model 实例。# class Model(nn.Module):# -> 这个类用于构建和初始化一个目标检测模型,根据配置文件或字典来定义模型结构,并进行相应的权重初始化和锚点调整。# -> def __init__(self, cfg='yolor-csp-c.yaml', ch=3, nc=None, anchors=None):  # model, input channels, number of classesmodel = Model(cfg, channels, classes)# 加载预训练权重(如果 pretrained 为 True )。if pretrained:# 定义预训练权重文件名。fname = f'{name}.pt'  # checkpoint filename# 下载权重文件(如果本地没有找到)。# def attempt_download(file, repo='WongKinYiu/yolov6'): -> 尝试下载一个文件,如果该文件不存在的话。这个函数特别设计用于从 GitHub 仓库下载预训练模型文件。attempt_download(fname)  # download if not found locally# torch.load(f, map_location=None, pickle_module=pickle, **pickle_load_args)# torch.load 是 PyTorch 中用于加载保存的 PyTorch 对象的函数。这个函数可以加载之前使用 torch.save 保存的文件,这些文件可以包含模型参数、优化器状态、张量等。# 参数说明 :# 1. f :要加载的文件名或文件对象。可以是一个字符串路径,也可以是一个文件对象。# 2. map_location :一个字符串或一个函数,指定如何映射存储位置。默认为  None  ,意味着使用默认存储位置。如果设置为 'cpu' ,那么所有张量都会映射到CPU上。# 如果设置为 'cuda:device_id' ,那么张量会被映射到指定的GPU上。也可以是一个函数,该函数接受一个存储位置字符串并返回一个新的存储位置字符串。# 3. pickle_module :用于序列化和反序列化的模块。默认为 Python 标准库中的 pickle 。# 4. **pickle_load_args :传递给 pickle.load 函数的其他参数。# 返回值 :# 加载的 PyTorch 对象,这可以是张量、模型、优化器状态等。# 加载权重文件。# 加载预训练权重。这行代码使用 torch.load 函数加载预训练模型的权重文件( fname ),并将其映射到CPU设备上。 map_location=torch.device('cpu') 参数确保即使权重文件是在GPU上训练的,也会被加载到CPU上。ckpt = torch.load(fname, map_location=torch.device('cpu'))  # load# model.state_dict()# 在PyTorch中, .state_dict() 方法是 torch.nn.Module 类的一个实例方法,用于返回一个包含模型所有参数和缓存的字典(state dictionary)。这个字典通常用于保存和加载模型的权重。# 参数 : 无参数。# 返回值 : 返回一个包含模型中所有参数和缓存的字典。# 获取模型当前状态字典。这行代码获取当前模型的状态字典( state_dict ),这是一个包含模型所有参数的字典。msd = model.state_dict()  # model state_dict# 获取预训练权重的状态字典。这行代码从加载的预训练权重( ckpt )中提取模型部分,并将其转换为浮点数( float() ),然后获取其状态字典。csd = ckpt['model'].float().state_dict()  # checkpoint state_dict as FP32# 过滤状态字典。这行代码创建一个新的状态字典,只包含形状与当前模型参数匹配的预训练权重。这是为了避免形状不匹配的问题,可能会导致模型加载失败。# 这行代码是一个字典推导式(dictionary comprehension),它用于创建一个新的字典 csd ,这个字典只包含那些在 模型的状态字典 msd 和 预训练权重的状态字典 csd 中形状相匹配的键值对。# csd.items() :这会返回预训练权重的状态字典 csd 中的所有键值对。# for k, v in csd.items() :这是一个循环,它遍历 csd 中的每一项,其中 k 是键(通常是层的名称), v 是值(通常是参数的张量)。# if msd[k].shape == v.shape :这是一个条件语句,它检查模型的状态字典 msd 中对应键 k 的参数形状是否与预训练权重 v 的形状相同。# {k: v for ...} :这是一个字典推导式,它基于上述条件构建一个新的字典。# 这行代码的作用是过滤掉那些形状不匹配的参数,只保留形状相匹配的参数。这样做的目的是为了确保在加载预训练权重时,只有那些形状匹配的权重会被加载到模型中,避免因为形状不匹配而导致的错误。# 例如,如果预训练模型的最后一层是一个具有1000个输出的全连接层,而当前模型的最后一层是一个具有800个输出的全连接层,那么这两个层的权重形状不匹配,预训练模型的最后一层权重就不会被加载到当前模型中。# 这样可以确保模型的每一层都能正确地接收到预训练权重,同时避免因形状不匹配而导致的运行时错误。csd = {k: v for k, v in csd.items() if msd[k].shape == v.shape}  # filter# model.load_state_dict(state_dict, strict=True)# 在PyTorch中, .load_state_dict() 方法是 torch.nn.Module 类的一个实例方法,用于将参数和缓存加载到模型中。这个方法通常与 .state_dict() 方法配合使用,后者用于获取模型的状态字典。# 参数 :# state_dict : 一个包含模型参数的字典。# strict (默认为 True ) :一个布尔值,指示是否严格匹配状态字典中的参数和模型中的参数。如果 strict=True ,则状态字典中的每个键必须与模型中的参数名匹配,并且形状也必须相同。如果 strict=False ,则允许状态字典中存在模型中没有的键,这些键将被忽略。# 返回值 : 无返回值。# 加载过滤后的状态字典。这行代码将过滤后的状态字典加载到当前模型中。 strict=False 参数允许模型中有不在状态字典中的参数,这在模型结构有所改变时非常有用。model.load_state_dict(csd, strict=False)  # load# 设置类别名称。if len(ckpt['model'].names) == classes:# 如果预训练模型中的类别名称数量与当前模型的类别数相匹配,这行代码会将预训练模型的类别名称设置为当前模型的类别名称。model.names = ckpt['model'].names  # set class names attribute# 自动调整模型输入形状。if autoshape:# 如果 autoshape 参数为 True ,这行代码会调用 autoshape 方法,自动调整模型以适应不同的输入类型,如文件、URI、PIL图像、OpenCV图像或NumPy数组,并进行非极大值抑制(NMS)。# def autoshape(self):# -> 它用于在模型中添加一个名为 autoShape 的模块。 autoShape 模块可能是用来调整模型输入形状的,以确保模型可以接收不同尺寸的输入。返回包装后的模型 m 。# -> autoShape 的类,它是一个用于目标检测模型的包装器(wrapper),旨在使模型能够接受不同格式的输入(如OpenCV、NumPy、PIL图像或PyTorch张量),并包括预处理、推理和非极大值抑制(NMS)。# -> return mmodel = model.autoshape()  # for file/URI/PIL/cv2/np inputs and NMS# 选择设备。这行代码选择设备(GPU或CPU),优先选择GPU。# def select_device(device='', batch_size=None): -> 它用于选择并配置 PyTorch 模型将使用的计算设备,可以是 CPU 或者一个或多个 GPU。返回一个 torch.device 对象,表示选择的设备。 -> return torch.device('cuda:0' if cuda else 'cpu')device = select_device('0' if torch.cuda.is_available() else 'cpu')  # default to GPU if available# 返回模型。将模型移动到选定的设备上,并返回模型实例。return model.to(device)# 捕获异常。这行代码使用 except 语句来捕获任何类型的异常( Exception 是所有内置非系统退出异常的基类)。变量 e 被用来存储捕获到的异常实例,这样你就可以访问异常的属性,比如错误消息。except Exception as e:# 创建错误信息。这行代码创建了一个字符串变量 s ,其中包含了一条错误信息,提示用户缓存可能已过期,并建议用户尝试使用 force_reload=True 参数来强制重新加载数据。s = 'Cache maybe be out of date, try force_reload=True.'# 重新抛出异常。这行代码使用 raise 语句重新抛出一个异常。这里,它创建了一个新的 Exception 实例,并将之前创建的错误信息 s 作为参数传递给它。# from e 部分是一个特殊的语法,它将原始异常 e 作为新异常的“原因”(cause),这样在异常的链中就保留了原始异常的信息。raise Exception(s) from e# 这种异常处理方式有几个优点 :# 提供更清晰的错误信息 :通过添加自定义的错误信息,可以帮助用户更好地理解问题所在,并提供可能的解决方案。# 保留原始异常信息 :通过使用 from e 语法,可以在新抛出的异常中保留原始异常的信息,这对于调试是非常有用的。# 避免沉默失败 :通过重新抛出异常,可以确保异常不会被沉默处理,从而避免程序在错误状态下继续执行。# 这种方式在处理可能发生多种异常的代码块时特别有用,因为它可以捕获所有异常,并以一种统一和可控的方式处理它们。
# 这个函数提供了一个灵活的方式来创建和配置YOLOv7模型,支持加载预训练权重、自动调整输入形状,并确保模型在可用的GPU或CPU上运行。

3.def custom(path_or_model='path/to/model.pt', autoshape=True): 

# 这段代码定义了一个名为 custom 的函数,它用于加载和配置一个自定义的PyTorch模型。这个函数提供了灵活性,可以接受不同形式的输入,包括模型文件的路径、已加载的模型字典或直接是一个 nn.Module 对象。
# 1.path_or_model :可以是模型文件的路径(字符串),已加载的模型字典,或者是 nn.Module 对象。
# 2.autoshape :布尔值,指示是否自动调整模型输入形状以适应不同输入类型。
def custom(path_or_model='path/to/model.pt', autoshape=True):# 自定义模式。"""custom modeArguments (3 options):path_or_model (str): 'path/to/model.pt'path_or_model (dict): torch.load('path/to/model.pt')path_or_model (nn.Module): torch.load('path/to/model.pt')['model']Returns:pytorch model"""# 加载模型。这行代码检查 path_or_model 参数是否为字符串类型。如果是,它将使用 torch.load 从指定路径加载模型;如果不是,它将直接使用传入的 path_or_model 对象。model = torch.load(path_or_model) if isinstance(path_or_model, str) else path_or_model  # load checkpoint# 处理模型字典。if isinstance(model, dict):# 如果加载的模型是一个字典,这个代码块会检查是否存在 ema (指数移动平均)模型,并优先加载它。如果没有 ema ,则加载普通的 model 。model = model['ema' if model.get('ema') else 'model']  # load model# 创建模型实例。这行代码使用模型的配置文件创建一个新的 Model 实例,并将模型移动到其参数所在的设备(可能是CPU或GPU)。hub_model = Model(model.yaml).to(next(model.parameters()).device)  # create# 加载状态字典。这行代码将加载的模型状态字典(转换为浮点数以确保兼容性)加载到新创建的模型实例中。hub_model.load_state_dict(model.float().state_dict())  # load state_dict# 设置类别名称。这行代码将加载的模型的类别名称设置为新模型实例的类别名称。hub_model.names = model.names  # class names# 自动调整模型输入形状。if autoshape:# 如果 autoshape 参数为 True ,这行代码会调用 autoshape 方法,自动调整模型以适应不同的输入类型,并进行非极大值抑制(NMS)。hub_model = hub_model.autoshape()  # for file/URI/PIL/cv2/np inputs and NMS# 选择设备。这行代码选择设备(GPU或CPU),优先选择GPU。# def select_device(device='', batch_size=None): -> 它用于选择并配置 PyTorch 模型将使用的计算设备,可以是 CPU 或者一个或多个 GPU。返回一个 torch.device 对象,表示选择的设备。 -> return torch.device('cuda:0' if cuda else 'cpu')device = select_device('0' if torch.cuda.is_available() else 'cpu')  # default to GPU if available# 返回模型。最后,将模型移动到选定的设备上,并返回模型实例。return hub_model.to(device)
# 这个函数提供了一个灵活的方式来加载和配置PyTorch模型,支持从不同来源加载模型,并确保模型可以在正确的设备上运行。

4.def yolov7(pretrained=True, channels=3, classes=80, autoshape=True): 

# 这个 yolov7 函数是一个简单的封装函数,它调用了另一个名为 create 的函数来生成一个 YOLOv7 模型的实例。这个函数的目的是提供一个简洁的接口,使得用户可以轻松地创建一个预配置的 YOLOv7 模型。
# 1.pretrained :布尔值,指示是否加载预训练权重。默认值为 True 。
# 2.channels :输入图像的通道数。默认值为 3 ,适用于彩色图像。
# 3.classes :类别数,用于模型的输出层。默认值为 80 ,这通常是 COCO 数据集中的类别数。
# 4.autoshape :布尔值,指示是否自动调整模型输入形状以适应不同输入类型。默认值为 True 。
def yolov7(pretrained=True, channels=3, classes=80, autoshape=True):# create 函数会处理模型的创建和配置,包括加载预训练权重、设置类别名称、自动调整输入形状等。return create('yolov7', pretrained, channels, classes, autoshape)
# 这个函数可以被用来快速创建一个 YOLOv7 模型实例,适用于需要使用 YOLOv7 进行对象检测的场景。
# 例如,如果你想要在 COCO 数据集上进行对象检测,并且想要使用预训练权重,你可以直接调用这个函数 : model = yolov7(pretrained=True, classes=80)。这将创建一个预训练的 YOLOv7 模型,类别数设置为 80,适用于 COCO 数据集。

5.if __name__ == '__main__': 

# 这段代码是一个Python脚本的主执行部分,它展示了如何使用自定义的 custom 函数或 create 函数来加载一个YOLOv7模型,并进行推理测试。
if __name__ == '__main__':# 模型加载。# 这行代码调用 custom 函数来加载一个自定义的YOLOv7模型,模型权重文件名为 yolov7.pt 。model = custom(path_or_model='yolov7.pt')  # custom example# 这行代码被注释掉了,但它展示了如何使用 create 函数来加载一个预训练的YOLOv7模型。# model = create(name='yolov7', pretrained=True, channels=3, classes=80, autoshape=True)  # pretrained example# 验证推断。# Verify inference# 导入依赖库。# 导入NumPy库,用于处理数组和矩阵运算。import numpy as np# 导入PIL库中的Image模块,用于图像处理。from PIL import Image# 创建测试图像。创建一个包含一个全零图像的列表,图像尺寸为640x480,3个通道(RGB)。imgs = [np.zeros((640, 480, 3))]# 模型推理。使用加载的模型对测试图像进行推理,结果存储在 results 变量中。results = model(imgs)  # batched inference# 打印推理结果。调用 results 对象的 print 方法来打印推理结果。results.print()# 保存推理结果。调用 results 对象的 save 方法来保存推理结果,通常这会保存检测到的边界框、类别和置信度等信息。results.save()
# imgs 列表中使用的是全零图像,这通常用于测试模型的推理性能,而不是实际的图像分析。
# 在实际应用中,你需要将 imgs 替换为包含实际图像的列表,例如通过 Image.open 加载的图像列表。

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

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

相关文章

智慧环保之环境网格化监测解决方案

1. 引言 智慧环保网格化监测解决方案,旨在通过先进的信息技术手段,实现环境质量的全面、精准、实时监测,为环境治理提供科学依据和决策支持。 2. 背景与挑战 当前,环境污染问题日益严峻,治理难度不断加大。传统监测手…

vue2+3 —— Day5/6

自定义指令 自定义指令 需求&#xff1a;当页面加载时&#xff0c;让元素获取焦点&#xff08;一进页面&#xff0c;输入框就获取焦点&#xff09; 常规操作&#xff1a;操作dom “dom元素.focus()” 获取dom元素还要用ref 和 $refs <input ref"inp" type&quo…

2024 RISC-V 中国峰会 演讲幻灯片和视频回放 均已公开

目录 一、幻灯片地址&#xff1a; 二、演讲视频&#xff1a; 一、幻灯片地址&#xff1a; RVSC2024/slides at main cnrv/RVSC2024 GitHub 二、演讲视频&#xff1a; RISC-V国际基金会的个人空间-RISC-V国际基金会个人主页-哔哩哔哩视频 参考&#xff1a; 1、RISC-V 中…

sudu问题 --> 添加用户到系统配置文件里面

我们重新创建一个用户lisi 密码&#xff1a;lisixxxxxxxx 重新连接&#xff0c;输入用户&#xff0c;输入密码 是不行的 我们输入exit退出 打开文件 再切换身份&#xff0c;切换为超级管理员root 输入密码 再打开 我们打开后设置行号在50行左右可以看到我们的目标 我们再进行…

C++: string(二)

✨✨ 欢迎大家来到我的文章✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 分类专栏&#xff1a;c 我的主页&#xff1a;tyler s blog 文章目录 一 string的成员函数1 insert2 resize3assign4erase5replace6 find(1) find(2)rfind…

【无人机设计与控制】基于MATLAB的四旋翼无人机PID双闭环控制研究

摘要 本文基于MATLAB/Simulink环境&#xff0c;对四旋翼无人机进行了PID双闭环控制设计与仿真研究。通过分析四旋翼无人机的动力学模型与运动学模型&#xff0c;建立了姿态和位置双闭环控制系统&#xff0c;以实现无人机的稳定飞行与精确轨迹跟踪。仿真实验验证了该控制策略的…

DimensionX 部署笔记

目录 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; DimensionX 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; 可以生成&#xff0c;从左向右旋转的&#xff0c;也可以生成从上往下旋转的&#xff1a; import torch from diffusers import CogVideoXImageToVideo…

如何利用SAP低代码平台快速构建企业级应用?

SAP作为全球领先的企业管理软件解决方案提供商&#xff0c;一直致力于为企业提供全面且高效的业务管理工具。随着技术的快速发展&#xff0c;传统的开发方式已经无法满足企业在快速变化的市场环境下的需求。低代码开发平台应运而生&#xff0c;它通过简化应用程序的创建过程&am…

拉取docker镜像应急方法

发现许多docker hub镜像网址速度也慢得发指啦&#xff0c;如果想速度快点&#xff0c;可以考虑买个按量计费的公有云服务器&#xff0c;用他们的内网镜像&#xff0c;然后再导出&#xff0c;然后传到本地。 开通服务器 可以考虑个开通最低配的&#xff0c;这里我用的是腾讯的…

Ubuntu下的Eigen库的安装及基本使用教程

一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4&#xff0c;除了C标准库以外&#xff0c;不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试&#xff0c;并自动安装。如果使用Eigen库&#xff0c;只需包特定模块的的头文件即可。 基本功能 Eigen适用范…

Ansible一键部署Kubernetes集群

一、环境准备 主机 ip地址 角色 k8s-master 192.168.252.141 master k8s-node1 192.168.252.142 node k8s-node2 192.168.252.143 node 二、实战 Ansible部署 主节点安装Ansible yum -y install epel-release yum -y install ansible ansible --version 开启记…

Comfy UI Manager 自定义节点管理

在 Stable Diffusion Web UI 中&#xff0c;可以通过插件的方式&#xff0c;扩展更多的功能&#xff0c;如&#xff1a;tagger提示词反推、ControlNet 等。 同样的在 Comfy UI 中有类似的功能实现&#xff0c;不过在 Comfy UI 中叫做自定义节点。 通过安装自定义节点的方式&a…

第二十周:机器学习

目录 摘要 ABSTRACT 一、吴恩达机器学习exp2——逻辑回归 1、logistic函数 2、数据预处理 3、损失函数 4、梯度下降 5、设定评价指标 6、决策边界 7、正则化 二、动手深度学习pytorch——数据预处理 1、数据集读取 2、缺失值处理 3、转换为张量格式 总结 摘要…

从人-物到人-机再到人-AI

从 人-物 到 人-机 再到 人-AI &#xff0c;这一演化过程展现了人类与技术、工具的互动方式随着时代的发展而发生的深刻变化。这一变化不仅是技术进步的体现&#xff0c;更是社会、文化以及工作方式的根本转变。以下是这一演变的主要特点及其背后的影响&#xff1a; 1. 人-物时…

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中&#xff0c;我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API&#xff0c;包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库&#xff0c;并创建user 表 …

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别&#xff08;ASR&#xff09;项目&#xff0c;由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型&#xff0c;通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别&#xff08;large-v2 为 70 倍实时&#xf…

【C++ 算法进阶】算法提升十六

目录 背包问题变种 &#xff08;动态规划&#xff09;题目题目分析 连续可组成数字题目题目分析 min-patches题目 最小补丁问题题目分析代码 逆序对个数 &#xff08;归并排序&#xff09;题目题目分析 约瑟夫环问题 &#xff08;公式&#xff09;题目题目分析 背包问题变种 &a…

链表的基本操作

链表&#xff0c;由若干个结点组成&#xff0c;每个结点包含数据域和指针域。结点结构如下图所示&#xff1a; 一般来讲&#xff0c;链表中只会有一个结点的指针域为空&#xff0c;该结点为尾结点&#xff0c;其他结点的指针域都会存储一个结点的内存地址。链表中也只会有一个结…

C#高级:Winform中的自定义窗体输入

目录 一、多样式输入&#xff08;无封装&#xff09; 1.代码 2.效果 二、单输入框封装 1.使用 2.封装 3.效果 三、组合框批量输入封装 1.使用 2.封装 3.效果 一、多样式输入&#xff08;无封装&#xff09; 1.代码 private async void button1_Click(object send…

memblock内存分配器

一、简述 memblock 是 Linux 内核中的一个内存管理子系统&#xff0c;主要用于在系统启动早期阶段管理物理内存。它在内核初始化期间负责管理内存&#xff0c;直到更复杂的内存管理子系统&#xff08;如伙伴系统&#xff09;接管。 二、工作原理 初始化&#xff1a;在内核启…