当前位置: 首页 > news >正文

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-build.py

build.py

ultralytics\data\build.py

目录

build.py

1.所需的库和模块

2.class InfiniteDataLoader(dataloader.DataLoader): 

3.class _RepeatSampler: 

4.def seed_worker(worker_id): 

5.def build_yolo_dataset(cfg, img_path, batch, data, mode="train", rect=False, stride=32, multi_modal=False): 

6.def build_grounding(cfg, img_path, json_file, batch, mode="train", rect=False, stride=32): 

7.def build_dataloader(dataset, batch, workers, shuffle=True, rank=-1): 

8.def check_source(source): 

9.def load_inference_source(source=None, batch=1, vid_stride=1, buffer=False): 


1.所需的库和模块

# Ultralytics YOLO 🚀, AGPL-3.0 licenseimport os
import random
from pathlib import Pathimport numpy as np
import torch
from PIL import Image
from torch.utils.data import dataloader, distributedfrom ultralytics.data.dataset import GroundingDataset, YOLODataset, YOLOMultiModalDataset
from ultralytics.data.loaders import (LOADERS,LoadImagesAndVideos,LoadPilAndNumpy,LoadScreenshots,LoadStreams,LoadTensor,SourceTypes,autocast_list,
)
from ultralytics.data.utils import IMG_FORMATS, PIN_MEMORY, VID_FORMATS
from ultralytics.utils import RANK, colorstr
from ultralytics.utils.checks import check_file

2.class InfiniteDataLoader(dataloader.DataLoader): 

# 这段代码定义了一个名为 InfiniteDataLoader 的类,它继承自 PyTorch 的 dataloader.DataLoader 类。这个类的目的是创建一个无限循环的数据加载器,即使数据集的大小是有限的,它也能够无限地产生数据批次。
class InfiniteDataLoader(dataloader.DataLoader):# 重用工作器的数据加载器。# 使用与原始数据加载器相同的语法。"""Dataloader that reuses workers.Uses same syntax as vanilla DataLoader."""# __init__ 方法。def __init__(self, *args, **kwargs):# 无限循环使用 worker 的 Dataloader,继承自 DataLoader。"""Dataloader that infinitely recycles workers, inherits from DataLoader."""# 调用父类的构造函数,传递所有传入的参数。super().__init__(*args, **kwargs)# 将 batch_sampler 属性替换为 _RepeatSampler 类的一个实例,这个实例会包装原始的 batch_sampler 。 _RepeatSampler 是一个自定义的采样器,用于实现无限循环的批次生成。object.__setattr__(self, "batch_sampler", _RepeatSampler(self.batch_sampler))# 调用父类的 __iter__ 方法来初始化迭代器,并将其赋值给实例变量 iterator 。self.iterator = super().__iter__()# __len__ 方法。def __len__(self):# 返回批量采样器的采样器的长度。"""Returns the length of the batch sampler's sampler."""# 返回 batch_sampler.sampler 的长度,这通常是数据集的大小。return len(self.batch_sampler.sampler)# 这段代码是 InfiniteDataLoader 类中的 __iter__ 方法的实现。这个方法使得 InfiniteDataLoader 可以被迭代,并且会无限次地产生数据批次。def __iter__(self):# 创建一个无限重复的采样器。"""Creates a sampler that repeats indefinitely."""# 这行代码创建了一个无限循环,因为 __len__ 方法返回的是 self.batch_sampler.sampler 的长度,# 而在 InfiniteDataLoader 中, self.batch_sampler 被替换成了 _RepeatSampler 实例,它应该能够无限地产生索引,使得 len(self) 实际上是无限的。for _ in range(len(self)):# yield# yield 是 Python 中的一个关键字,它用于在函数中创建一个生成器(generator)。当一个函数中包含 yield 语句时,这个函数就变成了一个生成器函数,它允许你逐个产生函数的值,而不是一次性返回所有值。# 与 return 的区别 :# return 语句用于从函数返回一个值,并结束函数的执行。# yield 语句用于从生成器函数返回一个值,但不结束函数的执行。函数的状态被保存,以便下一次从生成器请求值时继续执行。# yield 的这些特性使得它在需要迭代处理数据时非常有用,特别是在数据量大或数据生成成本高的情况下。# 在循环内部, yield 关键字用于产生 self.iterator 的下一个元素。由于 self.iterator 是通过调用父类的 __iter__ 方法获得的,它指向一个可以产生数据批次的迭代器。# next(self.iterator) 会获取下一个数据批次。# yield 关键字使得每次产生一个批次后,迭代器都会暂停,直到下一次请求下一个元素。这样可以在每次迭代中提供一个批次,而不一次性加载所有批次到内存中。yield next(self.iterator)# 这个方法的结果是, InfiniteDataLoader 可以作为一个无限循环的数据源,不断地产生数据批次,直到程序停止请求新的批次。这对于训练机器学习模型非常有用,因为它允许模型在有限的数据集上进行多次迭代,而不需要手动重置数据加载器。# 需要注意的是,这种方法可能会导致无限循环,如果不当使用可能会导致程序无法停止。因此,在使用 InfiniteDataLoader 时,应该确保在训练循环中有适当的停止条件。# reset 方法。def reset(self):# 重置迭代器。# 当我们想要在训练时修改数据集的设置时,这很有用。"""Reset iterator.This is useful when we want to modify settings of dataset while training."""# 重置迭代器为初始状态,这可能是为了在某些情况下重新开始迭代。self.iterator = self._get_iterator()
# 使用 InfiniteDataLoader 的好处是,它允许模型在训练时不断地遍历数据集,而不需要手动重置数据加载器。这在某些情况下可以简化代码,特别是在需要长时间训练模型的场景中。

3.class _RepeatSampler: 

# 这个 _RepeatSampler 类是一个自定义的采样器,它的作用是将传入的 sampler 包装起来,使其能够无限次地产生样本索引。
class _RepeatSampler:# 永远重复的采样器。"""Sampler that repeats forever.Args:sampler (Dataset.sampler): The sampler to repeat."""# __init__ 方法。def __init__(self, sampler):# 初始化一个无限重复给定采样器的对象。"""Initializes an object that repeats a given sampler indefinitely."""# 接受一个 sampler 对象作为参数,并将其存储在实例变量 self.sampler 中。这个 sampler 通常是 PyTorch 的 DataLoader 中用于生成批次索引的采样器。self.sampler = sampler# __iter__ 方法。这个方法使得 _RepeatSampler 可以被迭代,并且会无限次地产生样本索引。def __iter__(self):# 迭代“采样器”并产生其内容。"""Iterates over the 'sampler' and yields its contents."""# 创建了一个无限循环,这意味着采样器会不断地重复产生索引,直到程序显式地停止它。while True:# 会迭代 self.sampler 并产生其所有的元素,然后 yield 关键字会将这些元素返回给迭代 _RepeatSampler 的代码。# 当 self.sampler 的所有元素都被产生后, iter(self.sampler) 会自然结束,但由于外层有一个无限循环,所以会再次从头开始产生 self.sampler 的元素,从而实现无限重复。yield from iter(self.sampler)
# 这个采样器的实现非常简洁,但它非常强大,因为它允许 DataLoader 在有限的数据集上进行无限次迭代,这对于训练深度学习模型时进行多次 epoch 迭代非常有用。
# 使用 _RepeatSampler 的一个潜在问题是,如果不正确地管理迭代过程,可能会导致无限循环。因此,在使用 InfiniteDataLoader 和 _RepeatSampler 时,需要确保在训练过程中有适当的机制来控制迭代次数,例如通过设置一个最大迭代次数或者监听某些停止信号。

4.def seed_worker(worker_id): 

# seed_worker 函数是一个用于设置 PyTorch DataLoader 工作进程随机种子的函数。这个函数的目的是为了确保在多进程数据加载时,每个工作进程能够生成可复现的随机数序列。这对于确保实验的可重复性非常重要,尤其是在使用随机数据增强或其他需要随机性的操作时。
def seed_worker(worker_id):  # noqa# 设置数据加载器工作者种子https://pytorch.org/docs/stable/notes/randomness.html#dataloader。"""Set dataloader worker seed https://pytorch.org/docs/stable/notes/randomness.html#dataloader."""# 这行代码获取 PyTorch 的全局随机种子,并将其对 2**32 取模,以确保得到的种子是一个32位的整数。 torch.initial_seed() 返回的是当前进程的随机种子,这个种子是由 PyTorch 的随机数生成器生成的。worker_seed = torch.initial_seed() % 2**32# 这行代码设置 NumPy 的随机种子。NumPy 也用于生成随机数,特别是在数据预处理和增强时,因此确保它的随机性与其他库一致是很重要的。np.random.seed(worker_seed)# 这行代码设置 Python 标准库 random 模块的随机种子。这同样是为了确保在使用 random 模块时生成的随机数序列是可复现的。random.seed(worker_seed)
# 这个函数通常作为 DataLoader 的 worker_init_fn 参数传递,这样每个工作进程在开始工作之前都会调用这个函数来设置随机种子。例如:
# data_loader = DataLoader(dataset, num_workers=4, worker_init_fn=seed_worker)
# 这样设置后,每个工作进程都会在开始工作前调用 seed_worker 函数,确保每个进程的随机数生成是可复现的。

5.def build_yolo_dataset(cfg, img_path, batch, data, mode="train", rect=False, stride=32, multi_modal=False): 

# 这段代码定义了一个名为 build_yolo_dataset 的函数,它用于构建 YOLO(You Only Look Once)目标检测模型的数据集。这个函数根据提供的配置和参数,初始化并返回一个 YOLODataset 或 YOLOMultiModalDataset 实例。
# 1.cfg : 配置对象,包含了构建数据集所需的配置参数。
# 2.img_path : 图像文件的路径。
# 3.batch : 批处理大小,即每次迭代处理的图像数量。
# 4.data : 额外的数据,可能用于数据增强或其他目的。
# 5.mode : 模式,可以是"train"(训练)或其它值(验证/测试)。
# 6.rect : 是否使用矩形批次,这通常与批处理中的图像尺寸有关。
# 7.stride : 步长,用于确定网格单元的大小。
# 8.multi_modal : 是否是多模态数据集,如果是,将使用 YOLOMultiModalDataset 类,否则使用 YOLODataset 类。
def build_yolo_dataset(cfg, img_path, batch, data, mode="train", rect=False, stride=32, multi_modal=False):# 构建 YOLO 数据集。"""Build YOLO Dataset."""# 根据 multi_modal 参数的值,确定使用 YOLOMultiModalDataset 还是 YOLODataset 类。dataset = YOLOMultiModalDataset if multi_modal else YOLODataset# 创建数据集实例,传入必要的参数,包括图像路径、图像尺寸、批处理大小、是否进行数据增强等。# 返回创建的数据集实例。return dataset(# img_path : 图像文件的路径,这是数据集将要加载图像的地方。img_path=img_path,#  imgsz : 图像尺寸,这是YOLO模型输入图像的尺寸,通常是一个整数或一个元组,表示图像的宽度和高度。imgsz=cfg.imgsz,# batch_size : 批处理大小,这个参数定义了每次迭代中处理的图像数量。batch_size=batch,# augment : 数据增强标志,如果模式是"train"(训练模式),则为True,表示在训练时应用数据增强技术。augment=mode == "train",  # augmentation# hyp : 超参数,这里直接传递了配置对象 cfg ,包含学习率、迭代次数等超参数。hyp=cfg,  # TODO: probably add a get_hyps_from_cfg function# rect : 是否使用矩形批次,这通常与批处理中的图像尺寸有关,如果 cfg.rect 为True或者函数参数 rect 为True,则使用矩形批次。rect=cfg.rect or rect,  # rectangular batches# cache : 缓存设置,如果 cfg.cache 有值,则使用该值,否则为None,这可能用于控制是否缓存预处理后的图像。cache=cfg.cache or None,# single_cls : 是否是单类别检测,如果为True,则数据集中只包含一个类别。single_cls=cfg.single_cls or False,# stride : 步长,转换为整数,这个参数影响YOLO模型中的网格单元大小。stride=int(stride),# pad : 填充比例,如果是训练模式,则为0.0,否则为0.5,这个参数可能用于控制训练时的图像填充。pad=0.0 if mode == "train" else 0.5,# prefix : 日志前缀,使用 colorstr 函数格式化模式名称,这可能用于在日志输出中区分不同的模式。prefix=colorstr(f"{mode}: "),# task : 任务类型,从 cfg 中获取,可能用于区分不同的检测任务。task=cfg.task,#  classes  : 类别数量,从  cfg  中获取,表示数据集中包含的类别数量。classes=cfg.classes,# data : 额外的数据,可能用于数据增强或其他目的。data=data,# fraction : 数据集分割比例,如果是训练模式,则使用  cfg.fraction  的值,否则为1.0,这可能用于控制训练集的大小。fraction=cfg.fraction if mode == "train" else 1.0,)
# 这个函数是一个高级抽象,它允许用户通过配置文件来灵活地创建和定制YOLO数据集,以适应不同的训练和验证需求。

6.def build_grounding(cfg, img_path, json_file, batch, mode="train", rect=False, stride=32): 

# 这个函数 build_grounding 用于构建一个特定于“grounding”任务的YOLO数据集。Grounding通常指的是将语言描述与视觉实体联系起来的过程,这在多模态学习、视觉问答等领域中是一个常见的任务。
# 这个函数的参数和 build_yolo_dataset 函数类似,但是它创建的是 GroundingDataset 实例,这是一个专门为grounding任务定制的数据集类。
# 1.cfg : 配置对象,包含了构建数据集所需的配置参数。
# 2.img_path : 图像文件的路径,这是数据集将要加载图像的地方。
# 3.json_file : JSON文件的路径,通常包含与图像相关的标注信息,如bounding boxes、类别标签等。
# 4.batch : 批处理大小,即每次迭代处理的图像数量。
# 5.mode : 模式,可以是"train"(训练)或其它值(验证/测试)。
# 6.rect : 是否使用矩形批次,这通常与批处理中的图像尺寸有关。
# 7.stride : 步长,用于确定网格单元的大小。
def build_grounding(cfg, img_path, json_file, batch, mode="train", rect=False, stride=32):# 构建 YOLO 数据集。"""Build YOLO Dataset."""# 函数返回 GroundingDataset 实例。return GroundingDataset(# 图像文件的路径。img_path=img_path,# JSON文件的路径,包含标注信息。json_file=json_file,# 图像尺寸,这是YOLO模型输入图像的尺寸。imgsz=cfg.imgsz,# 批处理大小。batch_size=batch,# 数据增强标志,如果是训练模式,则为True。augment=mode == "train",  # augmentation# 超参数,这里直接传递了配置对象 cfg 。hyp=cfg,  # TODO: probably add a get_hyps_from_cfg function# 是否使用矩形批次。rect=cfg.rect or rect,  # rectangular batches# 缓存设置,如果 cfg.cache 有值,则使用该值,否则为None。cache=cfg.cache or None,# 是否是单类别检测。single_cls=cfg.single_cls or False,# 步长,转换为整数。stride=int(stride),# 填充比例,如果是训练模式,则为0.0,否则为0.5。pad=0.0 if mode == "train" else 0.5,# 日志前缀,使用 colorstr 函数格式化模式名称。# def colorstr(*input):# -> 返回值。函数通过遍历 args 中的每个元素(颜色或样式),从 colors 字典中获取对应的ANSI转义序列,并将其与传入的 string 字符串连接起来。最后,它还会添加一个 colors["end"] 序列,用于重置终端的颜色和样式到默认状态。# -> return "".join(colors[x] for x in args) + f"{string}" + colors["end"] prefix=colorstr(f"{mode}: "),# 任务类型,从 cfg 中获取。task=cfg.task,# 类别数量,从 cfg 中获取。classes=cfg.classes,# 数据集分割比例,如果是训练模式,则使用 cfg.fraction 的值,否则为1.0。fraction=cfg.fraction if mode == "train" else 1.0,)
# 这个函数的目的是创建一个配置好的 GroundingDataset 对象,该对象可以在grounding任务的训练或验证过程中使用。通过传递不同的参数,可以灵活地调整数据集的行为,以适应不同的训练需求。

7.def build_dataloader(dataset, batch, workers, shuffle=True, rank=-1): 

# 这段代码是一个 Python 函数,它定义了一个名为 build_dataloader 的函数,用于构建 PyTorch 的 DataLoader 或 InfiniteDataLoader 对象。这个函数通常用于机器学习或深度学习中,以便在训练或验证模型时加载数据集。
# 定义了一个函数 build_dataloader ,它接受五个参数。
# 1.dataset :数据集对象。
# 2.batch :批次大小。
# 3.workers :加载数据的工作线程数。
# 4.shuffle :是否在每个epoch开始时打乱数据,默认为True。
# 5.rank :分布式训练中的进程排名,默认为-1,表示非分布式训练。
def build_dataloader(dataset, batch, workers, shuffle=True, rank=-1):# 返回用于训练或验证集的 InfiniteDataLoader 或 DataLoader。"""Return an InfiniteDataLoader or DataLoader for training or validation set."""# 确保批次大小不会超过数据集的大小。batch = min(batch, len(dataset))# 获取当前系统中可用的 CUDA 设备数量。nd = torch.cuda.device_count()  # number of CUDA devices# 计算可用于数据加载的工作线程数,这个数字是 CPU 核心数 除以 CUDA 设备数 (或1,如果CUDA设备数为0)和传入的 workers 参数的最小值。nw = min(os.cpu_count() // max(nd, 1), workers)  # number of workers# 如果不是分布式训练( rank 为 -1),则不使用 sampler ;如果是分布式训练,则创建一个 DistributedSampler 对象,用于确保每个进程只处理数据集的一部分。sampler = None if rank == -1 else distributed.DistributedSampler(dataset, shuffle=shuffle)# torch.Generator(device='cpu')# 在PyTorch中, torch.Generator 是一个用于生成随机数的伪随机数生成器(PRNG)的类。它主要用于生成与特定种子或设备相关的随机数,以确保实验的可重复性。# 参数 :# device : 指定生成器所在的设备,可以是'cpu'或'cuda'设备。# 主要方法 :# manual_seed(seed) : 设置生成器的种子。 seed : 一个整数,用于初始化生成器。# seed() : 自动设置生成器的种子。 这将生成一个随机种子,确保每次运行代码时生成的随机数不同。# get_state() : 返回生成器的当前状态。# set_state(state) : 设置生成器的状态。 state : 一个张量,表示生成器的状态。# initial_seed() : 返回生成器的初始种子。# 注意事项 :# 当使用多个设备(如CPU和GPU)时,需要为每个设备创建一个独立的 Generator 实例,并设置不同的种子,以确保随机数的生成是独立的。# 在分布式训练或多线程环境中,正确管理生成器的状态非常重要,以避免随机数生成的冲突。# torch.Generator 提供了一种灵活的方式来控制随机数的生成,使得实验和模型训练更加可重复和可控。# 创建一个 PyTorch 随机数生成器对象。generator = torch.Generator()# 为随机数生成器设置种子值,这里 RANK 应该是一个变量,但在代码中没有定义,可能是一个外部定义的变量,用于确保在分布式训练中每个进程的随机性是不同的。generator.manual_seed(6148914691236517205 + RANK)# 返回一个 InfiniteDataLoader 对象,这个对象是 DataLoader 的一个变体,用于无限循环地加载数据集。return InfiniteDataLoader(# 数据集对象。dataset=dataset,# 批次大小。batch_size=batch,# 是否打乱数据。shuffle=shuffle and sampler is None,# 工作线程数。num_workers=nw,# 采样器对象。sampler=sampler,# 一个布尔值,表示是否将数据加载到 CUDA 固定内存中,以加快数据传输到 GPU 的速度。pin_memory=PIN_MEMORY,# 一个函数,用于决定如何将多个样本数据合并成一个批次。collate_fn=getattr(dataset, "collate_fn", None),# 每个工作线程启动时调用的函数,这里使用 seed_worker 函数来设置每个工作线程的随机种子。worker_init_fn=seed_worker,# 上面创建的随机数生成器对象。generator=generator,)
# 这个函数的设计目的是为了提供一个灵活且高效的数据加载器,支持批量加载、多线程和分布式训练。通过设置随机数生成器和采样器,它可以确保数据加载的随机性和分布式训练的正确性。

8.def check_source(source): 

# 这段代码定义了一个名为 check_source 的函数,其目的是检查输入的 source 参数,并返回与 source 类型相对应的标志值。这些标志值用于确定 source 是来自网络摄像头、屏幕截图、图像文件、内存中的图像、还是 PyTorch 张量。
# 参数。
# 1.source :输入源,可以是多种类型,包括字符串、整数、Path对象、图像文件、URL、列表、元组、PIL图像、NumPy数组或PyTorch张量。
def check_source(source):# 检查源类型并返回相应的标志值。"""Check source type and return corresponding flag values."""# 定义了五个布尔变量,初始值都为 False ,用于标记 source 的类型。 分别表示是否为 摄像头 、 屏幕截图 、 图像 、 内存中的数据 和 张量。webcam, screenshot, from_img, in_memory, tensor = False, False, False, False, False# 使用 isinstance 检查 source 是否为 字符串 、 整数 或 Path 对象 。如果是,将其转换为字符串,并进行进一步的检查。if isinstance(source, (str, int, Path)):  # int for local usb camerasource = str(source)# is_file 检查路径后缀是否在支持的图像或视频格式中。is_file = Path(source).suffix[1:] in (IMG_FORMATS | VID_FORMATS)# is_url 检查字符串是否以特定的URL协议开头。is_url = source.lower().startswith(("https://", "http://", "rtsp://", "rtmp://", "tcp://"))# str.isnumeric()# 在Python中, isnumeric() 是字符串( str )类的一个方法,用于检查字符串中的所有字符是否都是数字。如果所有字符都是数字,则返回 True ;否则返回 False 。这个方法不考虑字符的编码,只关注字符是否表示数字。# 返回值 :# bool 类型,表示字符串是否只包含数字。# 注意事项 :# isnumeric() 方法只检查字符是否为数字,不考虑字符的编码或数值大小。# 空字符串( "" )被认为是数字,这可能与直觉不符,但符合Unicode标准。# 该方法不考虑数字的格式,如负号或小数点,这些都会被视作非数字字符。# isnumeric() 方法常用于验证输入是否为纯数字字符串,例如在处理用户输入或解析数据时。# webcam 标记为 True 如果 source 是数字(代表本地USB摄像头)、以特定后缀结束或是一个URL但不是文件。webcam = source.isnumeric() or source.endswith(".streams") or (is_url and not is_file)# screenshot 标记为 True 如果 source 字符串等于 "screen" 。screenshot = source.lower() == "screen"# 如果 source 是一个URL且是一个文件,调用 check_file 函数 。if is_url and is_file:# def check_file(file, suffix="", download=True, download_dir=".", hard=True):# -> 检查文件的存在性,如果需要的话,下载该文件,并返回文件的路径。# ->  return file / return str(file) / return files[0] if len(files) else []  # return filesource = check_file(source)  # download# 如果 source 是 LOADERS 类型,则 in_memory 标记为 True 。elif isinstance(source, LOADERS):in_memory = True# 如果 source 是一个列表或元组,调用 autocast_list 函数,并标记 from_img 为 True 。elif isinstance(source, (list, tuple)):# def autocast_list(source): -> 用于将不同类型源的数据合并成一个包含 NumPy 数组或 PIL 图像的列表。返回包含处理后的图像数据的 files 列表。 -> return filessource = autocast_list(source)  # convert all list elements to PIL or np arraysfrom_img = True# 如果 source 是一个 Image.Image 对象或NumPy数组,标记 from_img 为 True 。elif isinstance(source, (Image.Image, np.ndarray)):from_img = True# 如果 source 是一个PyTorch张量,标记 tensor 为 True 。elif isinstance(source, torch.Tensor):tensor = True# 如果 source 不是上述任何类型,抛出一个 TypeError 异常。else:raise TypeError("Unsupported image type. For supported types see https://docs.ultralytics.com/modes/predict")    # 不支持的图像类型。有关支持的类型,请参阅 https://docs.ultralytics.com/modes/predict.# 函数返回处理后的  source  和 webcam (摄像头) , screenshot (屏幕截图) , from_img (图像) , in_memory (内存中的数据) , tensor (张量) 这五个布尔值。return source, webcam, screenshot, from_img, in_memory, tensor
# 这个函数的目的是为进一步的处理确定输入源的类型,并根据源的类型设置相应的标志值。这样,后续的代码就可以根据这些标志值来决定如何处理输入源。

9.def load_inference_source(source=None, batch=1, vid_stride=1, buffer=False): 

# 这段代码定义了一个名为 load_inference_source 的函数,它的作用是根据提供的 source 参数加载不同类型的数据源,并返回一个相应的 dataset 对象。这个函数支持多种数据源类型,包括张量、内存中的数据、视频流、屏幕截图、图像和视频文件。
# 参数说明。
# 1.source : 数据源,可以是文件路径、URL、图像或视频流、内存中的张量等。
# 2.batch : 用于加载图像和视频时的批量大小,默认为1。
# 3.vid_stride : 视频加载时的帧间隔,默认为1。
# 4.buffer : 是否对视频流进行缓冲,默认为False。
def load_inference_source(source=None, batch=1, vid_stride=1, buffer=False):# 加载用于对象检测的推理源并应用必要的转换。"""Loads an inference source for object detection and applies necessary transformations.Args:source (str, Path, Tensor, PIL.Image, np.ndarray): The input source for inference.batch (int, optional): Batch size for dataloaders. Default is 1.vid_stride (int, optional): The frame interval for video sources. Default is 1.buffer (bool, optional): Determined whether stream frames will be buffered. Default is False.Returns:dataset (Dataset): A dataset object for the specified input source."""# 检查数据源类型。# 调用 check_source 函数来确定 source 的类型,并返回 source 本身以及五个布尔值,分别表示是否为 摄像头 stream 、 屏幕截图 screenshot 、 图像 from_img 、 内存中的数据 in_memory 和 张量 tensor 。source, stream, screenshot, from_img, in_memory, tensor = check_source(source)# 确定数据源类型。# 根据 in_memory 的值,确定 source_type 。如果 in_memory 为True,则 source_type 直接从 source 对象中获取;否则,使用 SourceTypes 类来创建 source_type 。# class SourceTypes:# -> 这个类可以用于配置预测模型的输入源,或者在需要区分不同输入类型的场景中使用。# -> SourceTypes(stream=False, screenshot=False, from_img=False, tensor=False)source_type = source.source_type if in_memory else SourceTypes(stream, screenshot, from_img, tensor)# Dataloader# 加载数据集。# 如果 tensor 为True,则使用 LoadTensor 类来加载张量数据。if tensor:# class LoadTensor: -> 用于处理图像数据,特别是以张量(Tensor)形式存在的图像数据。 -> def __init__(self, im0) -> None:dataset = LoadTensor(source)# 如果 in_memory 为True,则直接使用 source 作为数据集。elif in_memory:dataset = source# 如果 stream 为True,则使用 LoadStreams 类来加载视频流数据。elif stream:# class LoadStreams: -> 用于加载和处理视频流。 -> def __init__(self, sources="file.streams", vid_stride=1, buffer=False):dataset = LoadStreams(source, vid_stride=vid_stride, buffer=buffer)# 如果 screenshot 为True,则使用 LoadScreenshots 类来加载屏幕截图数据。elif screenshot:# class LoadScreenshots: -> 用于捕获屏幕截图并将屏幕内容作为 NumPy 数组返回。 -> def __init__(self, source):dataset = LoadScreenshots(source)# 如果 from_img 为True,则使用 LoadPilAndNumpy 类来加载PIL图像和NumPy数组数据。elif from_img:# class LoadPilAndNumpy: -> 用于处理 PIL 图像和 NumPy 数组格式的图像数据。 -> def __init__(self, im0):dataset = LoadPilAndNumpy(source)# 否则,使用 LoadImagesAndVideos 类来加载图像和视频文件。else:# class LoadImagesAndVideos: -> 用于加载图像和视频文件,并初始化一个数据加载器。 -> def __init__(self, path, batch=1, vid_stride=1):dataset = LoadImagesAndVideos(source, batch=batch, vid_stride=vid_stride)# Attach source types to the dataset# setattr(object, name, value)# setattr 是 Python 内置的一个函数,用于将属性赋值给对象。这个函数可以用来动态地设置对象的属性值,包括那些在代码运行时才知道名称的属性。# object :要设置属性的对象。# name :要设置的属性的名称,它应该是一个字符串。# value :要赋给属性的值。# 功能 :# setattr 函数将 value 赋给 object 的 name 指定的属性。如果 name 指定的属性在 object 中不存在,则会创建一个新的属性。返回值 setattr 函数没有返回值。# 注意事项 :# 使用 setattr 时需要注意属性名称的字符串格式,因为属性名称会被直接用作对象的属性键。# setattr 可以用于任何对象,包括自定义类的实例、内置类型的对象等。# 如果需要删除对象的属性,可以使用 delattr 函数,其用法与 setattr 类似,但是用于删除属性而不是设置属性。# 附加数据源类型。将 source_type 附加到 dataset 对象上。setattr(dataset, "source_type", source_type)# 返回数据集。返回构建好的 dataset 对象。return dataset
# 这个函数的设计体现了模块化和灵活性,可以根据不同的数据源类型选择合适的加载方式,并确保数据源类型信息的传递和存储。

相关文章:

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-build.py

build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...

JAVA-动态代理

文章目录 概要两种主要方式JDK 动态代理Proxy 类作用:常用方法: InvocationHandler 接口作用: 目标对象、代理对象、被代理对象JDK 动态代理工作原理 cjlib 动态代理demo 对比 概要 Java 动态代理利用 Java 的反射机制,可以在运行…...

【前端】React_Next.js

定期更新,建议关注、收藏! 安装 要使用react的框架,都应当安装node.js conda install nodejs选择Next.js 并创建项目 npx create-next-applatest可以看到目录结构生成如下 作为网页中的一个子路由 想让其嵌入已经写好的项目中&#xf…...

深入理解malloc与vector:内存管理的对比

引言‌ 在编程中,内存管理是一个至关重要的环节。无论是C语言中的malloc函数,还是C标准库中的vector容器,它们都在内存分配和释放上扮演着关键角色。然而,它们的设计理念和用法有着显著的不同。本文将深入探讨malloc和vector的区…...

LeetCode题练习与总结:四数相加 Ⅱ --454

一、题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;n…...

AI绘画设计实战-Day1

AI绘画变现方向&#xff1a; 生成猫咪拟人化&#xff1b;老照片修复&#xff1b;生成奇幻场景&#xff0c;换上客户的脸&#xff1b;生成商品详情模特图&#xff1b;商品宣传图&#xff1b;建筑/室内设计方案&#xff1b; AI视频-变现方向&#xff1a; AI跳舞视频&#xff…...

【Windows】ImmGetContext函数不适合跨进程工作

1. 教授回复 ChatGPT-o1: ImmGetContext() is not designed to work across process boundaries. It is indicates that a thread should not access the input context created by another thread, which implies that the function is intended for use within the same proc…...

【Linux】进程间通信——System V共享内存

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…...

fastAPI快速使用

1. 安装: pip install fastapi 并且安装uvicorn来作为服务器&#xff1a; pip install uvicorn 最简单的 FastAPI 文件可能像下面这样&#xff1a; # main.pyfrom fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message&qu…...

ruoyi前后端不分离创建module

ruoyi创建module 1.创建表 2.在若依中创建module 3.注意选择maven 4.命名 5&#xff0e;把module加入到rouyi的pom.xml中 6.student 中加入common依赖 二.生成代码 2.1先创建目录 2&#xff0e;2导入创建的表 2.3 注意各种配置 2.4预览代码 2.5 生成代码 2.6…...

【AI日记】24.12.08 kaggle 比赛 Titanic-11

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容&#xff1a; 学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster学习机器学习&#xff08;pandas&#xff0c;numpy&#xff0c;sklearn&#xff0c;seaborn&#xff0c;matplotlib&a…...

处理后端返回的时间格式问题

今天在做项目的时候&#xff0c;发现后端返回的时间格式是“2024-12-08T06:11:46.00000:00”。 通过查阅资料&#xff0c;我发现这是后端返回的ISO 8601标准时间格式。这种格式在前端展示时可能不符合用户习惯&#xff0c;需要转换为更常见的“yyyy-MM-dd HH:mm:ss”格式&…...

【读书笔记·VLSI电路设计方法解密】问题33:ASIC芯片构建的主要步骤是什么

如问题32所述,ASIC芯片构建的主要步骤包括:RTL编写、功能验证、逻辑综合、布局布线、最终逻辑验证、时序验证、物理验证以及流片(Tapeout)。 RTL编写(RTL Coding) 这一阶段将设计意图从自然语言(如英文或中文)翻译为计算机可模拟的语言,以便进行仿真验证设计意图。此外…...

[机器学习] 监督学习之线性回归与逻辑回归

这里写目录标题 一、监督学习概述二、线性回归&#xff08;一&#xff09;模型表示&#xff08;二&#xff09;损失函数&#xff08;三&#xff09;梯度下降算法导入所需库生成模拟数据&#xff08;可替换为真实数据&#xff09;初始化参数并进行训练可视化损失函数随迭代次数的…...

十五、全局搜索正则表达式

一.grep简介 grep 全程Globally search a Regular Expression and Print&#xff0c;是一种强大的文本搜索工具&#xff0c;它能使用特 定模式匹配&#xff08;包括正则表达式&#xff09;搜索文本&#xff0c;并默认输出匹配行。Unix的grep家族包括grep和egrep 二.grep的工作…...

kali Linux 安装配置教程(图文详解)

目录 一、下载安装VMware二、下载kali镜像三、安装kali到虚拟机 一、下载安装VMware 点我查看 二、下载kali镜像 官网下载&#xff1a;https://www.kali.org/get-kali/#kali-platforms 演示下载的为下图左边的&#xff0c;实际我们直接下载右侧虚拟机的直接使用就行 右侧下…...

QT QTableWidget::setModel”: 无法访问 private成员

//严重性代码说明项目文件行禁止显示状态 //错误C2248 “QTableWidget::setModel”: 无法访问 private 成员(在“QTableWidget”类中声明) QSqlQueryModel* sql_model; ui.tableView_database->setModel(sql_model); //ok ui.tableWidget_database->setModel(sql_model)…...

C#怎么判断电脑是否联网

在 C# 中&#xff0c;可以通过几种方法检测计算机是否联网。以下是几种常用的方式&#xff1a; 1. 使用 System.Net.NetworkInformation.Ping 类 通过发送一个 Ping 请求到公共 DNS 服务器&#xff08;如 Google 的 DNS 8.8.8.8&#xff09;来检测是否联网。这是最常见的一种…...

丢垃圾视频时间检测 -- 基于状态机的实现

文章目录 OverviewKey PointsPseudo-code Overview 需要考虑的方面 状态定义和转换条件时序约束空间约束异常处理 状态机的设计需要考虑的场景&#xff1a; 没有人人进入人携带垃圾人离开但垃圾留下垃圾消失异常情况&#xff08;检测失败、多人多垃圾等&#xff09; Key P…...

EEG2Rep自监督脑电大模型文献阅读

原文网址&#xff1a; EEG2Rep: Enhancing Self-supervised EEG Representation... - Google 学术搜索https://scholar.google.com/scholar?hlzh-CN&as_sdt0%2C5&qEEG2Rep%3AEnhancingSelf-supervisedEEGRepresentationThroughInformativeMaskedInputs&btnG 1.文…...

【前端知识】React简单入门

React语法介绍 概述一、产生背景与发展历程二、主要特点三、技术细节四、应用场景与优势五、学习与实践 JSX语法一、JSX的基本概念二、JSX的基本使用三、JSX中的JavaScript表达式四、JSX的条件渲染五、JSX的列表渲染六、JSX的样式处理七、JSX的其他注意事项 基础语法一、基础概…...

高通---Camera调试流程及常见问题分析

文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中&#xff0c;经常会遇到各种状况&#xff0c;本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…...

电压电流声音信号采集与分析系统

基于Labview的电压电流与声音信号采集与分析系统可以同时采集&#xff1a;电压、电流与振动信号。该系统部件可以采集传感器的真实数据&#xff0c;而且可以对采集的信号进行时域与频域分析&#xff0c;并可以实时显示历史数据&#xff0c;保存历史数据。具体的功能如下&#x…...

MongoDB语法及MongoTemplate用法

文章目录 概念操作数据库语法数据库及文档操作文档操作 整合springboot的MongoTemplate用法springboot配置插入删除更新查询 概念 1.MongoDB 是一个文档数据库&#xff0c;数据以 BSON 方式存储&#xff08;类似于json&#xff09; 2.文档&#xff08;Document&#xff09;&am…...

【git reset】本地下载特定历史提交哈希值的github文件【未联网服务器】进行git reset操作

本地电脑下载git文件&#xff0c;并进行git reset操作 问题描述&#xff1a;解决方法&#xff1a;方法1&#xff1a;直接下载特定版本的github压缩包。方法二&#xff1a; 在本地windows电脑上安装git工具进行git reset版本回退&#xff0c;之后上传相应版本的压缩包到服务器上…...

【开源安全保护】如何安装JumpServer堡垒机

【开源安全保护】如何安装JumpServer堡垒机 什么是堡垒机 大家好&#xff0c;我是星哥&#xff0c;今天我以前来认识堡垒机 堡垒机&#xff08;Bastion Host&#xff09;&#xff0c;也称为跳板机&#xff08;Jump Server&#xff09;&#xff0c;是指在计算机网络中&#x…...

log4j漏洞复现--vulhub靶场

声明&#xff1a;学习过程参考了同站的B1g0rang大佬的文章 Web网络安全-----Log4j高危漏洞原理及修复(B1g0rang) CVE-2021-44228 RCE漏洞 Log4j 即 log for java(java的日志) &#xff0c;是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输…...

K8s面试系列:K8s常用 API 资源总结速记

写在前面 博文内容为 K8s 中常用的API 资源简单总结适合对K8s 有基本认知,温习,面试准备的小伙伴内容涉及:API 资源组成 ,SSA 和 CSA 资源操作方式,以及下面资源类别简单描述 工作负载:Deployments,StatefulSets,HorizontalPodAutoscaler (HPA)…服务: Service,Ingress,E…...

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车&#xff0c;搭载N62B48B发动机&#xff0c;累计行驶里程约为26万km。车主反映&#xff0c;发动机偶尔无法起动&#xff0c;故障频率较低&#xff0c;十几天出现1 次&#xff0c;且故障出现时起动机不工作。 故障诊断  接车后试车&#xff0c;…...

前端(三)html标签(2)

html标签(2) 文章目录 html标签(2)一、列表标签二、表格三、form表单 一、列表标签 html中的列表分为无序列表、有序列表和自定义列表。 <!--无序列表的使用--> <!--pycharm中可以用ul>li*3tab的快捷键快速生成无序列表--> <ul><li>秒杀</li&g…...

D91【python 接口自动化学习】- pytest基础用法

day91 pytest的setup&#xff0c;setdown详解&#xff08;三&#xff09; 学习日期&#xff1a;20241207 学习目标&#xff1a;pytest基础用法 -- pytest的setup&#xff0c;setdown详解&#xff08;三&#xff09; 学习笔记&#xff1a; setup、teardown详解&#xff08;三…...

云桌面:云计算桌面

目录 云桌面的定义和核心概念 技术架构详解 主流架构详解 管理成本分析 安全性措施 应用场景详解 云桌面的定义和核心概念 云桌面是一种通过云计算技术提供的虚拟桌面服务&#xff0c;它允许用户通过网络访问远程服务器上的虚拟机&#xff0c;这些虚拟机为用户提供了一个…...

Word处理表格的一些宏

目录 1、表格首行居中2、表格内容靠左上下居中&#xff08;排除首行&#xff09; 1、表格首行居中 说明&#xff1a; 遇到错误将进行捕获&#xff0c;然后继续处理下一个表格 宏&#xff1a; Sub 表格首行居中()Dim tbl As tableOn Error Resume Next 错误时继续执行下一个…...

Linux网络编程---本地套接字

1.概述 本地套接字 1&#xff1a;作用:本地的进程间通信 2.有关系的进程间通信 3.没有关系的进程间的通信 本地套结字实现流程和网络套结字实现相似&#xff0c;一般采用tcp 二.通信流程 本地套结字通信的流程:1.服务器端:1.1 int fd socket(AF_UNIX/AF_LOCAL,…...

C#自动验证发票真假的程序

C#自动验证发票真假的程序 using Microsoft.Azure.CognitiveServices.Vision.ComputerVision; using Microsoft.Azure.CognitiveServices.Vision.ComputerVision.Models; using System; using System.IO; using System.Threading.Tasks;namespace InvoiceValidation {class Pr…...

后端技术进阶知识总结

前端开发、后端开发、AI算法与应用等技术进阶知识总结 前言1.前端开发2.后端开发3.AI算法3.1 Studio级别的AI工具使用 前言 本文不记录基础性问题和详细解决方案。只记录key idea。 1.前端开发 2.后端开发 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&…...

opencv复习

目录 1.core 1.图像变换 1.1 affine仿射变换 1.2 透视变换 2.四元数&#xff08;旋转&#xff09; 2.1 轴角转四元数 2.2 旋转矩阵转四元数 2.3 欧拉角转旋转矩阵 2.4 四元数转旋转矩阵 2.5 四元数用eigen用的比较多 2. imgproc. Image Processing 2.1 bilateralF…...

【Unity高级】在编辑器中如何让物体围绕一个点旋转固定角度

本文介绍如何在编辑器里让物体围绕一个点旋转固定角度&#xff0c;比如上图里的Cube是围绕白色圆盘的中心旋转45度的。 目标&#xff1a; 创建一个在 Unity 编辑器中使用的旋转工具&#xff0c;使开发者能够在编辑模式下快速旋转一个物体。 实现思路&#xff1a; 编辑模式下…...

通过IP远程连接MySQL服务时不允许连接到这个MySQL服务器

当你在连接Mysql时报这个错误时 is not allowed to connect to this MySQL server&#xff0c;意思是 MySQL 服务器不允许来自 IP 地址的连接。这通常是由于 MySQL 服务器的访问控制列表&#xff08;ACL&#xff09;限制了特定主机的连接。 要解决这个问题&#xff0c;你需要授…...

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…...

wordpress网站使用Linux宝塔面板和SQL命令行导入导出超过50M限制的数据库

wordpress网站使用Linux宝塔面板添加mysql数据库&#xff0c;使用phpMyAdmin工具导入sql数据库文件&#xff0c;会有最大限制50M。即使把sql数据库文件压缩为gzip或zip压缩包&#xff0c;压缩包也超过50M&#xff0c;该怎么办&#xff1f;怎样导入超过50M数据库呢&#xff1f; …...

VCP-CLIP A visual context prompting modelfor zero-shot anomaly segmentation

GitHub - xiaozhen228/VCP-CLIP: (ECCV 2024) VCP-CLIP: A visual context prompting model for zero-shot anomaly segmentation 需要构建正样本&#xff0c;异常样本&#xff0c;以及对应的Mask...

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…...

杂谈随笔-关于unity开发游戏

最近有在做unity的游戏开发&#xff0c;都是自学&#xff0c;甚至没有完整的课程体系…… 在犹豫要不要出系列教程&#xff0c;帮助新手快速入门的同时算是巩固一下基础知识。 那这篇文章先谈谈我对于引擎开发游戏的一些小观点&#xff0c;算是做了这么十几个星期的微不足道的…...

base64转file文件对象

1.base64转file文件对象 //将base64转换为文件 dataURLtoFile(dataurl, filename) { var arr dataurl.split(,),mime arr[0].match(/:(.*?);/)[1],bstr atob(arr[1]),n bstr.length,u8arr new Uint8Array(n);while (n--) {u8arr[n] bstr.charCodeAt(n);}return new Fil…...

【jvm】为什么要有GC

目录 1. 自动内存管理2. 提升程序稳定性3. 优化性能4. 跨平台能力5. 分代回收策略 1. 自动内存管理 1.JVM中的GC机制负责自动管理内存&#xff0c;这意味着开发人员不需要手动分配和释放内存。2.这一特性大大简化了Java程序的内存管理&#xff0c;降低了内存泄漏和内存溢出等问…...

开发指南085-大号版elementUI

ElementUI有些地方显示实在太小&#xff0c;不方便操作&#xff0c;需要放大&#xff1a; 1、el-dialog的标题栏那个关闭符号 使用如下方法放大 ::v-deep .el-dialog__headerbtn { font-size: 40px; font-weight: 700; top: 0px; } 2、el-table-column 设置sor…...

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(下)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;?? 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xff1a;WebSt…...

Mac 录制电脑系统内的声音的具体方法?

1.第一步&#xff1a;下载BlackHole 软件 方式1&#xff1a;BlackHole官方下载地址 方式2&#xff1a; 百度云下载 提取码: n5dp 2.第二步&#xff1a;安装BlackHole 双击下载好的BlackHole安装包&#xff0c;安装默认提示安装。 3.第三步&#xff1a;在应用程序中找到音频…...