YOLOv6-4.0部分代码阅读笔记-eval.py

eval.py

tools\eval.py

目录

eval.py

1.所需的库和模块

2.def boolean_string(s): 

3.def get_args_parser(add_help=True): 

4.def run(data, weights=None, batch_size=32, img_size=640, conf_thres=0.03, iou_thres=0.65, task='val', device='', half=False, model=None, dataloader=None, save_dir='', name = '', shrink_size=640, letterbox_return_int=False, infer_on_rect=False, reproduce_640_eval=False, eval_config_file='./configs/experiment/eval_640_repro.py', verbose=False, do_coco_metric=True, do_pr_metric=False, plot_curve=False, plot_confusion_matrix=False, config_file=None,): 

5.def main(args): 

6.if __name__ == "__main__": 


1.所需的库和模块

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import argparse
import os
import os.path as osp
import sys
import torchROOT = os.getcwd()
if str(ROOT) not in sys.path:sys.path.append(str(ROOT))from yolov6.core.evaler import Evaler
from yolov6.utils.events import LOGGER
from yolov6.utils.general import increment_name
from yolov6.utils.config import Config

2.def boolean_string(s): 

# boolean_string 接受一个字符串参数,并检查这个字符串是否是 'False' 或 'True' 。如果是,它将返回 True 或 False ;如果不是,它将抛出一个 ValueError 异常,提示输入的字符串不是有效的布尔字符串。
def boolean_string(s):# 检查参数 s 是否不在集合 {'False', 'True'} 中。if s not in {'False', 'True'}:# 如果 s 不是 'False' 或 'True' ,函数将抛出一个 ValueError 异常,并附带消息 'Not a valid boolean string' 。raise ValueError('Not a valid boolean string')    # 不是有效的布尔字符串。# 如果 s 是 'True' ,返回 True ;否则(即 s 是 'False' ),返回 False 。return s == 'True'
# 这个函数可以用于确保传入的字符串是有效的布尔值,并且可以直接转换为 Python 的布尔类型。

3.def get_args_parser(add_help=True): 

def get_args_parser(add_help=True):# argparse.ArgumentParser 是 argparse 模块中定义的一个类,用于创建命令行参数解析器。# description='YOLOv6 PyTorch Evalating' 提供了一个描述性的字符串,这个字符串会在生成的帮助文档中显示,通常是对程序或脚本功能的简短描述。# add_help=add_help 是一个关键字参数,它接受一个布尔值,用于指定是否在解析器中自动添加。# --help 选项。如果设置为 True (默认值),用户可以通过在命令行中输入# --help 来获取帮助信息。 add_help 参数的值由函数 get_args_parser 的参数 add_help 决定。# 这行代码初始化了一个参数解析器对象 parser ,该对象后续可以添加更多的参数,并最终用于解析命令行输入的参数。例如,你可以使用 parser.add_argument 方法来添加特定的命令行参数,如 --data 、 --weights 等。parser = argparse.ArgumentParser(description='YOLOv6 PyTorch Evalating', add_help=add_help)# --data : 数据集配置文件的路径,默认为 ./data/coco.yaml 。parser.add_argument('--data', type=str, default='./data/coco.yaml', help='dataset.yaml path')# --weights : 模型权重文件的路径,默认为 ./weights/yolov6s.pt 。parser.add_argument('--weights', type=str, default='./weights/yolov6s.pt', help='model.pt path(s)')# --batch-size : 批处理大小,默认为 32。parser.add_argument('--batch-size', type=int, default=32, help='batch size')# --img-size : 推理时的图像尺寸(像素),默认为 640。parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')# --conf-thres : 置信度阈值,默认为 0.03。parser.add_argument('--conf-thres', type=float, default=0.03, help='confidence threshold')# --iou-thres : 非最大抑制(NMS)的 IoU 阈值,默认为 0.65。parser.add_argument('--iou-thres', type=float, default=0.65, help='NMS IoU threshold')# --task : 任务类型,可以是 val (验证)、 test (测试)或 speed (速度测试),默认为 val 。parser.add_argument('--task', default='val', help='val, test, or speed')# --device : 指定使用的 CUDA 设备,例如 0 或 0,1,2,3 ,也可以是 cpu 。parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')# --half : 是否使用半精度(fp16)推理,默认为 False 。parser.add_argument('--half', default=False, action='store_true', help='whether to use fp16 infer')# --save_dir : 评估结果的保存目录,默认为 runs/val/ 。parser.add_argument('--save_dir', type=str, default='runs/val/', help='evaluation save dir')# --name : 评估结果的保存名称,默认为 exp 。parser.add_argument('--name', type=str, default='exp', help='save evaluation results to save_dir/name')# --shrink_size : 测试时加载图像的缩放尺寸,默认为 0。parser.add_argument('--shrink_size', type=int, default=0, help='load img resize when test')# --infer_on_rect  : 是否在矩形图像上运行以提高速度,默认为 True ,类型为 boolean_string 。parser.add_argument('--infer_on_rect', default=True, type=boolean_string, help='default to run with rectangle image to boost speed.')# --reproduce_640_eval : 是否复现 640 推理结果,会覆盖一些配置,默认为 False 。parser.add_argument('--reproduce_640_eval', default=False, action='store_true', help='whether to reproduce 640 infer result, overwrite some config')# --eval_config_file : 复现 640 推理结果的配置文件路径,默认为 ./configs/experiment/eval_640_repro.py 。parser.add_argument('--eval_config_file', type=str, default='./configs/experiment/eval_640_repro.py', help='config file for repro 640 infer result')# --do_coco_metric : 是否使用 pycocotool 进行度量,默认为 True ,类型为 boolean_string 。parser.add_argument('--do_coco_metric', default=True, type=boolean_string, help='whether to use pycocotool to metric, set False to close')# --do_pr_metric : 是否计算精确度、召回率和 F1 分数,默认为 False ,类型为 boolean_string 。parser.add_argument('--do_pr_metric', default=False, type=boolean_string, help='whether to calculate precision, recall and F1, n, set False to close')# --plot_curve : 是否在保存目录中保存曲线图,默认为 True ,类型为 boolean_string 。parser.add_argument('--plot_curve', default=True, type=boolean_string, help='whether to save plots in savedir when do pr metric, set False to close')# --plot_confusion_matrix : 是否保存混淆矩阵图,默认为 False 。parser.add_argument('--plot_confusion_matrix', default=False, action='store_true', help='whether to save confusion matrix plots when do pr metric, might cause no harm warning print')# --verbose : 是否在每个类别上打印度量信息,默认为 False 。parser.add_argument('--verbose', default=False, action='store_true', help='whether to print metric on each class')# --config-file : 实验描述文件,优先级低于 reproduce_640_eval ,默认为空字符串。parser.add_argument('--config-file', default='', type=str, help='experiments description file, lower priority than reproduce_640_eval')# args = parser.parse_args() 这行代码会解析命令行参数,并将解析后的参数存储在 args 变量中,以便后续使用。args = parser.parse_args()# 检查命令行参数中是否有 config_file 被提供。if args.config_file:# 使用 assert 语句来确保指定的配置文件存在。如果文件不存在, assert 会抛出一个 AssertionError 并打印出错误消息,其中包含配置文件的路径。assert os.path.exists(args.config_file), print("Config file {} does not exist".format(args.config_file))    # 配置文件 {} 不存在。# def fromfile(filename):# -> 这段代码定义了 Config 类的一个静态方法 fromfile ,它的作用是从文件中读取配置并创建一个 Config 类的实例。使用从文件中读取的配置字典 cfg_dict 和文件内容 cfg_text ,以及文件名 filename 来创建一个新的 Config 类实例,并返回这个实例。# -> return Config(cfg_dict, cfg_text=cfg_text, filename=filename)cfg = Config.fromfile(args.config_file)# 检查加载的配置对象 cfg 是否有一个名为 eval_params 的属性。if not hasattr(cfg, 'eval_params'):# 如果 cfg 没有 eval_params 属性,使用日志记录器 LOGGER 记录一条信息,表明配置文件中没有评估参数配置。# 配置文件没有评估参数配置。LOGGER.info("Config file doesn't has eval params config.")# 如果 cfg 有 eval_params 属性,执行以下操作。else:# 将 eval_params 属性的值赋给变量 eval_params 。eval_params=cfg.eval_params# 遍历 eval_params 字典中的每个键值对。for key, value in eval_params.items():# 检查当前的键 key 是否不在命令行参数 args 的属性字典中。if key not in args.__dict__:# 无法识别配置 {key},继续。# 如果 key 不在 args 中,记录一条日志信息,表明配置项不被识别,并继续下一个循环迭代。LOGGER.info(f"Unrecognized config {key}, continue")continue# 检查 value 是否是一个列表。if isinstance(value, list):# 如果 value 是列表,并且列表的第二个元素(索引为 1)不是 None ,则将该值赋给 args 的对应属性。if value[1] is not None:args.__dict__[key] = value[1]# 如果 value 不是列表。else:if value is not None:# 如果 value 不是 None ,则将该值赋给 args 的对应属性。args.__dict__[key] = value# 加载参数以重现 640 评估结果。# load params for reproduce 640 eval result# 检查是否设置了 reproduce_640_eval 参数。如果为真,则执行以下代码块。if args.reproduce_640_eval:# 使用 assert 语句确保评估配置文件存在。如果文件不存在,则打印错误信息并停止执行。assert os.path.exists(args.eval_config_file), print("Reproduce config file {} does not exist".format(args.eval_config_file))    # 重现配置文件{}不存在。# 从评估配置文件中加载参数,并将其存储在 eval_params 变量中。eval_params = Config.fromfile(args.eval_config_file).eval_params# os.path.splitext(path)# os.path.splitext() 是 Python 的 os.path 模块中的一个函数,用于将文件名分割成文件名和扩展名两部分。这个函数返回一个元组,其中包含两个元素:第一个是文件名(不包含扩展名),第二个是文件的扩展名(包括点 . )。# path :需要被分割的文件路径字符串。# 函数执行后返回的结果是一个元组 (root, ext) :# root :文件名,不包含扩展名。# ext :文件的扩展名,包括点 . 。# 从 args.weights 参数中提取模型文件名(不包含扩展名),用于识别模型。eval_model_name = os.path.splitext(os.path.basename(args.weights))[0]# 检查提取的模型名称是否在评估参数中。if eval_model_name not in eval_params:# 如果模型名称不在评估参数中,则将其设置为"default"。eval_model_name = "default"# 从评估参数中获取 shrink_size 参数,并设置到 args 中。args.shrink_size = eval_params[eval_model_name]["shrink_size"]# 从评估参数中获取 infer_on_rect 参数,并设置到 args 中。args.infer_on_rect = eval_params[eval_model_name]["infer_on_rect"]#force params#args.img_size = 640# 设置置信度阈值为0.03。args.conf_thres = 0.03# 设置交并比(IoU)阈值为0.65。args.iou_thres = 0.65# 设置任务为验证(validation)。args.task = "val"# 设置是否执行COCO评估指标。args.do_coco_metric = True# 使用日志记录器记录 args 的当前状态。LOGGER.info(args)# 返回更新后的 args 对象。return args

4.def run(data, weights=None, batch_size=32, img_size=640, conf_thres=0.03, iou_thres=0.65, task='val', device='', half=False, model=None, dataloader=None, save_dir='', name = '', shrink_size=640, letterbox_return_int=False, infer_on_rect=False, reproduce_640_eval=False, eval_config_file='./configs/experiment/eval_640_repro.py', verbose=False, do_coco_metric=True, do_pr_metric=False, plot_curve=False, plot_confusion_matrix=False, config_file=None,): 

# 装饰了一个 @torch.no_grad() 装饰器,这意味着在这个函数内部执行的所有PyTorch操作都不会计算梯度,这对于推理(inference)阶段非常有用,因为它可以减少内存消耗并加快计算速度。
@torch.no_grad()
# 1.data : 要处理的数据集或数据路径。
# 2.weights : 模型的权重文件路径。
# 3.batch_size : 批处理大小,即每次推理时处理的图像数量。
# 4.img_size : 输入图像的大小。
# 5.conf_thres : 置信度阈值,用于过滤低置信度的检测结果。
# 6.iou_thres : 交并比(IoU)阈值,用于非极大值抑制(NMS)。
# 7.task : 任务类型,例如验证('val')或其他。
# 8.device : 指定运行模型的设备,如CPU或GPU。
# 9.half : 是否使用半精度(FP16)进行推理。
# 10.odel : 预加载的模型实例。
# 11.dataloader : 用于加载数据的数据加载器。
# 12.save_dir : 保存结果的目录。
# 13.name : 结果文件的名称。
# 14.shrink_size : 用于缩放图像的尺寸。
# 15.letterbox_return_int : 是否返回整数坐标的图像尺寸。
# 16.infer_on_rect : 是否在矩形区域上进行推理。
# 17.reproduce_640_eval : 是否复现640分辨率的评估。
# 18.eval_config_file : 评估配置文件的路径。
# 19.verbose : 是否打印详细信息。
# 20.do_coco_metric : 是否计算COCO指标。
# 21.do_pr_metric : 是否计算精确度-召回率(PR)指标。
# 22.plot_curve : 是否绘制性能曲线图。
# 23.plot_confusion_matrix : 是否绘制混淆矩阵图。
# 24.config_file : 模型配置文件的路径。
def run(data,weights=None,batch_size=32,img_size=640,conf_thres=0.03,iou_thres=0.65,task='val',device='',half=False,model=None,dataloader=None,save_dir='',name = '',shrink_size=640,letterbox_return_int=False,infer_on_rect=False,reproduce_640_eval=False,eval_config_file='./configs/experiment/eval_640_repro.py',verbose=False,do_coco_metric=True,do_pr_metric=False,plot_curve=False,plot_confusion_matrix=False,config_file=None,):# 运行评估过程。# 该函数是评估的主要过程,支持图像文件和包含图像的目录。# 它有“ val ”、“ train ”和“ speed ”任务。# 任务“ train ”在训练阶段处理评估。# 任务“ val ”纯粹处理评估并返回 model.pt 的 mAP。# 任务“ speed ”处理 model.pt 推理速度的评估。""" Run the evaluation processThis function is the main process of evaluation, supporting image file and dir containing images.It has tasks of 'val', 'train' and 'speed'. Task 'train' processes the evaluation during training phase.Task 'val' processes the evaluation purely and return the mAP of model.pt. Task 'speed' processes theevaluation of inference speed of model.pt."""# task# def check_task(task): -> 定义了一个名为 check_task 的静态方法,它用于检查传入的 task 参数是否为支持的任务类型('train', 'val', 'test', 'speed')。这个方法不依赖于类的实例,因此被标记为 @staticmethod 。Evaler.check_task(task)# 如果 task 参数的值为'train',则进入这个条件分支。if task == 'train':# 在'train'任务中,保存目录 save_dir 保持不变,即直接使用传入的 save_dir 值。save_dir = save_direlse:# def increment_name(path):# -> 目的是为给定的文件路径或目录路径生成一个新的路径,该路径包含一个递增的数字后缀,以确保新路径是唯一的,即不与现有文件或目录冲突。函数返回新生成的唯一路径。# -> return path# 对于非'train'任务,首先使用 osp.join(save_dir, name) 将传入的 save_dir 和 name 组合成一个新的路径。# 然后,调用 increment_name 函数(这个函数没有在代码中给出,可能是一个自定义函数),它可能的作用是为路径添加一个递增的后缀,以确保路径的唯一性。# 最后,将 increment_name 函数的返回值转换为字符串,并赋值给 save_dir 。save_dir = str(increment_name(osp.join(save_dir, name)))# 这行代码使用 os.makedirs 函数创建 save_dir 指定的目录。参数 exist_ok=True 表示如果目录已经存在,则不会抛出异常。os.makedirs(save_dir, exist_ok=True)# 检查阈值,根据任务重新加载设备/一半/数据。# check the threshold value, reload device/half/data according task# 这行代码调用了 Evaler 类中的 check_thres 方法,用于检查置信度阈值 conf_thres 和交并比阈值 iou_thres 是否有效,并可能根据任务 task 进行特定的验证。# def check_thres(conf_thres, iou_thres, task): -> 用于检查在不同任务下置信度阈值( conf_thres )和交并比阈值( iou_thres )是否设置为推荐值。这个方法是 Evaler 类的一部分,并且不依赖于类的实例。Evaler.check_thres(conf_thres, iou_thres, task)# 这行代码调用 Evaler 类中的 reload_device 方法,传入当前的设备 device 、模型 model 和任务 task 。这个方法可能用于根据模型和任务类型重新配置设备,例如,如果指定了GPU设备,它会确保模型被加载到正确的GPU上。# def reload_device(device, model, task): -> 用于根据模型和任务类型配置设备(CPU或GPU)。这个方法是 Evaler 类的一部分,并且不依赖于类的实例。device = Evaler.reload_device(device, model, task)# 这行代码设置了一个布尔值 half ,表示是否使用半精度(FP16)进行推理。如果设备不是CPU(即 device.type != 'cpu' )并且传入的 half 参数为 True ,则 half 被设置为 True ,否则为 False 。这通常用于在支持FP16的GPU上加速推理过程。half = device.type != 'cpu' and half# 这行代码检查 data 参数是否为字符串类型,如果是,则调用 Evaler 类中的 reload_dataset 方法重新加载数据集,传入数据路径 data 和任务 task 。# 如果 data 不是字符串(可能是已经加载的数据集对象),则直接使用 data 。这个方法可能用于根据任务类型加载特定的数据集。# def reload_dataset(data, task='val'):# -> 它用于从 YAML 文件中加载数据集配置,并根据任务类型( task )返回相应的数据集路径。这个方法是 Evaler 类的一部分,并且不依赖于类的实例。返回加载的数据集配置。# -> return datadata = Evaler.reload_dataset(data, task) if isinstance(data, str) else data# init    初始化。# 这行代码创建了 Evaler 类的一个实例,命名为 val  。# 构造函数 Evaler 接受多个参数,这些参数用于配置评估过程,包括# data数据集路径 、 batch_size批处理大小 、 img_size图像尺寸 、 conf_thres置信度阈值 、 iou_thres交并比阈值 、 device设备 、 half是否使用半精度 、 save_dir保存目录 、# shrink_size缩放尺寸 、 infer_on_rect是否在矩形区域推理 、 verbose是否详细输出 、 do_coco_metric是否计算 COCO 指标 、do_pr_metric 是否计算 PR 指标 、 plot_curve是否绘制曲线图 和 plot_confusion_matrix混淆矩阵图 。val = Evaler(data, batch_size, img_size, conf_thres, \iou_thres, device, half, save_dir, \shrink_size, infer_on_rect,verbose, do_coco_metric, do_pr_metric, plot_curve, plot_confusion_matrix)# def init_model(self, model, weights, task): # -> 定义了 Evaler 类中的一个名为 init_model 的方法,它用于初始化和配置模型,特别是在非训练(非'train')任务中。返回配置好的模型实例。# -> return modelmodel = val.init_model(model, weights, task)# def init_data(self, dataloader, task):# -> 定义了 Evaler 类中的一个名为 init_data 的方法,它用于初始化和配置数据加载器(dataloader),特别是在非训练(非'train')任务中。返回配置好的数据加载器实例。# -> return dataloaderdataloader = val.init_data(dataloader, task)# eval# 将模型设置为评估模式。这是必要的,因为某些模型组件(如Dropout和BatchNorm)在训练和评估时的行为不同。model.eval()# 调用 predict_model 函数来对验证集( dataloader )进行预测。这个函数返回 :# 返回预测结果 pred_result 、可视化输出 vis_outputs 和 可视化路径 vis_paths 。# def predict_model(self, model, dataloader, task):# -> 定义了 Evaler 类中的一个名为 predict_model 的方法,它用于对整个数据集进行预测,并获取预测结果和推理时间。# -> 返回预测结果 pred_results 、可视化输出 vis_outputs 和 可视化路径 vis_paths 。# -> return pred_results, vis_outputs, vis_pathspred_result, vis_outputs, vis_paths = val.predict_model(model, dataloader, task)# 使用预测结果( pred_result )调用 eval_model 函数来评估模型的性能。这个函数根据不同的任务类型( task ),评估模型的速度和/或 mAP(平均精度)。# def eval_model(self, pred_results, model, dataloader, task):# -> 定义了一个名为 eval_model 的方法,它是 Evaler 类的一部分,用于评估模型的性能。这个方法根据不同的任务类型( task ),评估模型的速度和/或 mAP(平均精度)。# -> 返回计算出的mAP@0.5和mAP@0.5:0.95的结果。如果循环外有其他情况,返回0.0作为默认结果。# -> return (map50, map)    return (0.0, 0.0)eval_result = val.eval_model(pred_result, model, dataloader, task)# 返回评估结果( eval_result )、可视化输出( vis_outputs )和可视化路径( vis_paths )。return eval_result, vis_outputs, vis_paths

5.def main(args): 

def main(args):# 调用 run 函数,并将 args 对象解包为关键字参数。# vars(args) 将 args 对象转换为字典。# ** 是 Python 中的解包操作符,它将字典的项作为关键字参数传递给 run 函数。run(**vars(args))

6.if __name__ == "__main__": 

# 这是一个特殊的Python变量,当Python文件被直接运行时, __name__ 的值为 "__main__" 。如果文件是被导入到另一个文件中, __name__ 的值将是文件名。这个条件判断用来确定当前脚本是否应该执行下面的代码。
if __name__ == "__main__":# 调用 get_args_parser 函数来获取命令行参数。这个函数预期会解析命令行输入,并返回一个包含这些参数的对象。args = get_args_parser()main(args)

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

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

相关文章

Vue项目中点击按钮后浏览器屏幕变黑,再次点击恢复的解决方法

情况说明 点击按钮后出现以下情况,浏览器屏幕变暗,再次点击则恢复正常。 解决方法: 找到你的全局样式文件,我的是gloable.css,添加以下代码: .v-modal {display: none; }重启服务器即可解决。

05栈和队列/代码随想录

六、栈和队列 6.1数据结构的应用 用栈实现队列 力扣232 很简单&#xff0c;添加的时候正常加在弹入栈&#xff0c;删除的时候把元素放到弹出栈&#xff0c;直接调用java集合实现的Stack class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackout;public M…

51c大模型~合集18

我自己的原文哦~ https://blog.51cto.com/whaosoft/11621494 #SpatialBot 空间大模型&#xff1a;上交、斯坦福、智源、北大、牛津、东大联合推出&#xff01; 大模型走向空间智能、具身智能之路&#xff01; 智源&#xff0c;斯坦福&#xff0c;北大&#xff0c;牛津&…

国外白帽故事 | 攻破大学数据库系统,暴露数千学生记录

引言 在这篇文章中&#xff0c;我将分享我是如何攻破一个大型大学解决方案门户服务器的&#xff0c;这个服务器服务于许多大学客户&#xff0c;并且涉及数千名学生的数据。 目标 这是一个由印度许多大学和学院使用的门户网站&#xff0c;用于管理学生记录、成绩单、出勤记录…

苍穹外卖05-Redis相关知识点

目录 什么是Redis&#xff1f; redis中的一些常用指令 value的5种常用数据类型 各种数据类型的特点 Redis中数据操作的常用命令 字符串类型常用命令&#xff1a; 哈希类型常用命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在java中操作Redis 环境…

【MySQL】数据的增删查改

文章目录 1. 插入数据(Create)1.1 全列插入1.2 指定列插入1.3 多行数据插入1.4 插入否则更新1.5 替换 2. 读取数据(Retrieve)2.1 select列2.2 where条件2.3 结果排序2.4 筛选分页结果 3. 修改数据(Update)4. 删除数据(delete)4.1 删除数据4.2 截断表 5. 插入查询的结果6. 分组与…

【案例分享】借助 iSpring,创造客户真正欣赏的专业在线培训体验

Safety Bee Training是一家领先的认证在线学习提供商&#xff0c;专门提供职业健康、安全和环境项目。它也是中东和亚洲唯一一家提供经 NASP 等国际认证机构认可的课程的培训提供商。它已经培训了超过 28,000 名学习者&#xff0c;并且正在不断扩大其课程范围&#xff0c;以提供…

【连续多届检索,ACM出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 会议官网&#xff1a;www.icbar.net 2024 4th International Conference on Big Data, Artificial I…

界面设计软件:10款设计师必备工具

UI界面设计软件是设计师们不可或缺的工具&#xff0c;它们提供了一系列功能和直观的操作界面&#xff0c;助力设计师迅速打造精美且用户友好的界面。面对众多UI设计软件&#xff0c;有的提供预设模板和图标库&#xff0c;有的更侧重于原型和交互设计。如何选择最适合自己的UI设…

TCP(上):成熟可靠的传输层协议

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! TCP&#xff08;传输控制协议&#xff09;是位于传输层的通信协议&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议。主要负责在不可靠的网络环境中提供可靠的端到端字节流传输服务。TCP是…

如何在Windows中检查是否安装了GPU

文章目录 1. 系统设备管理器1.1 打开设备管理器1.2 查找显示适配器 2. 命令行工具2.1 打开命令提示符2.2 执行WMIC命令 3. DirectX诊断工具3.1 运行DirectX诊断工具3.2 查看显示信息 在Windows操作系统中&#xff0c;了解您的电脑是否配备了图形处理单元&#xff08;GPU&#x…

网络技术----wireshark抓包出现1500以上的大包原因分析

网络技术----wireshark抓包出现1500以上的大包原因分析 背景描述原因分析TSO&#xff08;TCP segment offload&#xff0c;TSO&#xff09;linux中关闭/开启TSO功能&#xff1a;其他类似TSO的机制 wireshark抓包来源 背景描述 我们在使用抓包工具的过程中&#xff0c;经常发现…

3.3 软件需求:面对对象分析模型

面对对象分析模型 1、对象2、面对对象的软件开发模型3、用例图建模基础3.1 用例图基本符号参与者用例系统执行关联 3.2 用例建模过程3.3 用例图初步3.4 用例图进阶关联Association泛化Inheritance包含Include扩展Extend示例 1、对象 在现实世界中有意义的&#xff0c;与所要解…

跑批为什么这么难

业务系统产生的明细数据通常要经过加工处理&#xff0c;按照一定逻辑计算成需要的结果&#xff0c;用以支持企业的经营活动。这类数据加工任务一般会有很多个&#xff0c;需要批量完成计算&#xff0c;在银行和保险行业常常被称为跑批&#xff0c;其它像石油、电力等行业也经常…

深⼊理解指针(3)【数组与指针】

目录 1. 数组名的理解 2. 使⽤指针访问数组 3. ⼀维数组传参的本质 4. 冒泡排序 5. ⼆级指针 6. 指针数组 7. 指针数组模拟⼆维数组 一 数组名的理解 由上图可知我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址…

ubuntu【桌面】 配置NAT模式固定IP

DHCP分配导致虚拟机IP老变&#xff0c;SSH老要重新配置&#xff0c;设成静态方便些 一、设NAT模式 1、设为NAT模式 2、看模式对应的虚拟网卡 - VMnet8 3、共享主机网卡网络到虚拟网卡 - VMnet8 二、为虚拟网卡设置静态IP 记住这个IP IP不要与网关重复 这里网关注意要与虚拟…

最强攻略密码 | 腾讯云双十一活动爆款直击底价

前言 每年双十一&#xff0c;腾讯云都会推出一系列的优惠活动&#xff0c;吸引着大量的消费者和开发者参与。作为国内领先的云计算服务商之一&#xff0c;腾讯云不仅提供强大的云计算基础设施服务&#xff0c;还涉及云存储、大数据分析、人工智能等多个领域&#xff0c;而双十…

c# 动态lambda实现二级过滤(多种参数类型)

效果 调用方法 实体类&#xff08;可以根据需求更换&#xff09; public class ToolStr50 {public bool isSelected { get; set; }public string toolStr1 { get; set; }public string toolStr2 { get; set; }public string toolStr3 { get; set; }public string toolStr4 { …

5万加购上线即断货,双11洗衣机品类打破增长难关

距离2024年双11结束仅剩最后几天。据网经社报告&#xff0c;目前各电商平台累计销售额已超8000亿元。 其中&#xff0c;家电品类已超1000亿元的销额位居前列&#xff0c;市场占有率达15.7%。天猫平台数据显示&#xff0c;预售日开售后1小时&#xff0c;大家电整体成交同比增长7…

[全网最细数据结构完整版]第六篇:3分钟带你吃透栈并模拟实现

目录 1->栈的概念和结构 1.1栈的概念 1.2栈的结构 2->栈的实现 2.1定义关于栈的结构体和各种函数 2.2栈的初始化 STInit 函数 2.3栈的销毁 STDestroy 函数 2.4栈的插入操作 STPush 函数 2.5栈的判断是否为空操作 STEmpty 函数 2.6栈的删除操作 STPop 函数 2.7…