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

如何使用Ultralytics训练自己的yolo5 yolo8 yolo10 yolo11等目标检测模型

Ultralytics正在以惊人的速度吸收优秀的CV算法,之前Ultralytics定位于YOLOV8,但逐渐地扩展到支持其他版本的YOLO,最新版本的ultralytics全面支持yolo5 yolo7 yolo8 yolo9 yolo10 yolo11,包含模型的训练、验证、预测、部署等。毫无疑问,Ultralytics也会支持后续的YOLO版本,比如yolo12、yolo13......本文介绍如何用Ultralytics训练自己的yolo5 yolo8 yolo9 yolo10 yolo11模型,我们开门见山,直接步入正题。

前言:借助Ultralytics框架在自己的数据集上训练yolo5 yolo8 yolo9 yolo10 yolo11等模型首先需要配置好Ultralytics的环境,如果不会配置Ultralytics环境可以参考本人主页的另一篇文章

提醒:使用GPU训练会大幅度加快训练,有英伟达GPU的一定要配置GPU训练环境,没有英伟达显卡的只能采用CPU训练,但是一般不建议。 (GPU、CPU训练环境的配置具体见上面的文章链接)

第一章节:准备好数据集

配置好Ultralytics环境之后,需要准备好YOLO格式的数据集(也称txt格式),该数据集可以通过数据集标注软件 labelme、labelimg对图片进行拉框标注得到。具体标注教程见本人主页的另外一篇文章

经过标注软件标注好的yolo数据集的格式通常为:

class_id        x                y            w           h

class_id: 类别的id编号
x: 目标的中心点x坐标(横向) /图片总宽度
y: 目标的中心的y坐标(纵向) /图片总高度
w:目标框的宽度/图片总宽度
h: 目标框的高度/图片总高度

下图为一张图片按照yolo格式进行标注的txt标注文件 

在进行训练之前,还需要对数据集进行划分,一般是按照7:2:1的比例划分训练集(train)、验证集(val)、测试集(test) 或者按照8:2的比例划分训练集与验证集。

提醒:用Ultralytics训练自己的模型必须至少要把数据集划分出训练集与验证集,可以不划分测试集,训练集与验证集不可或缺,否则不能数据集进行模型训练。我这里只划分训练集与验证集,并且训练集与验证集应该是下面的目录结构

train
├── images
└── labels

val
├── images
└── labels

下面以葡萄叶片病虫害数据集为例,给出训练集、验证集目录结构的参考示例

注意,这里以葡萄叶片病虫害数据集为例,其他的数据集,比如什么安全帽数据集、机动车数据集.......只要数据集格式为YOLO目标检测数据集格式,那么数据集训练教程都跟这里的葡萄叶片病虫害数据集训练教程是一模一样的。

 

 

在训练之前,我们不仅要把数据集划分成训练集、验证集,还需要给出类别标签yaml文件,该文件是Ultralytics在训练过程中所必须的。也就是说,一个完整的,可以直接用于模型训练的数据集应该具有以下目录结构:

data.yaml的内容如下图所示: 

其中train、val指定训练集与验证集的路径地址(最好写成绝对路径) 

nc代表该数据集有几个类别,我这里的葡萄叶片病虫害数据集有四个类别

names代表具体的类别名称。可以以数组的形式给出,但请注意类别名称需要以英文或数字呈现,不能含有任何特殊字符或者中文字符。

提醒:yaml文件是必须的,如果你拿到的数据集不含这个文件,那么你要按照上面的格式自己手动写了,书写时需要严格按照yaml文件的格式(冒号后面是有一个空格的)

第二章节:开始训练

搞深度学习,绝大部分都是在linux系统上进行炼丹的。考虑到有的读者可能对Linux不熟悉,本章节首先给出win系统训练教程,然后再给出linux系统训练步骤。

注意:在训练的过程中,有英伟达显卡的一定要用GPU训练,用CPU训练是特别缓慢的。

2.1 训练参数

只要安装好了ultralytics,模型训练就变得非常简单。训练方式有多种,可以通过py程序训练(自己写几行Python代码),也可以在命令行训练(无需书写任何python代码)。

我们这里以py程序训练为例:

无论是在win系统还是linux系统,训练的代码基本都是一致的,只有极个别参数会因为系统的不同出现差异。

下面我以yolov8训练教程为例,其余yolo5 yolo9 yolo10 yolo11等是一样的步骤

from ultralytics import YOLO# 这里有三种训练方式,三种任选其一#第一种:根据yaml文件构建一个新模型进行训练,若对YOLO8网络进行了修改(比如添加了注意力机制)适合选用此种训练方式。但请注意这种训练方式是重头训练(一切参数都要自己训练),训练时间、资源消耗都是十分巨大的
model = YOLO('yolov8n.yaml')  # build a new model from YAML#第二种:加载一个预训练模型,在此基础之前上对参数进行调整。这种方式是深度学习界最最主流的方式。由于大部分参数已经训练好,我们仅需根据数据集对模型的部分参数进行微调,因此训练时间最短,计算资源消耗最小。
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)#第三种:根据yaml文件构建一个新模型,然后将预训练模型的参数转移到新模型中,然后进行训练,对YOLO8网络进行改进的适合选用此种训练方式,而且训练时间不至于过长
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # build from YAML and transfer weights# Train the model
#data参数指定数据集yaml文件(我这里data.yaml与train、val文件夹同目录)
#epochs指定训练多少轮
#imgsz指定图片大小
results = model.train(data='data.yaml', epochs=100, imgsz=640)

上面就是模型训练代码,那么简单吗,是不是搞错了?没错,在ultralytics框架的封装之下,训练代码就下面这三行。 

from ultralytics import YOLO

model = YOLO('yolov8n.pt') 

results = model.train(data='data.yaml', epochs=100, imgsz=640)

有人可能有疑问了。上述训练方式一的yolov8n.yaml是哪来的怎么得到,里面的内容又是什么?

回答:在ultralytics\cfg\models\v8目录下

可能又有人有疑问了, ultralytics\cfg\models\v8目录下明明只有yolov8.yaml,没有yolov8n.yaml呀。这一点后文再解答

任何获得?回答:可以从github上下载ultralytics源码得到,或者conda、pip安装ultralytics时,你的电脑本地也有ultralytcis源码,例如,我这里用conda建立了名为yolo8虚拟环境,在这个虚拟环境下pip install ultralytics安装了ultralytics源码,则源码在本地路径为:anaconda安装路径/envs/你自己建立的虚拟环境名/Lib/site-packages/ultralytics

上述训练方式二的yolov8n.pt预训练权重是哪里来的

回答:可以从ultralytics官方网站下载得到。地址:YOLOv8 - Ultralytics YOLO Docs

 model.train()函数可以指定的训练参数有很多,如下表所示: 

Key

Value

Description

model

None

path to model file, i.e. yolov8n.pt, yolov8n.yaml

data

None

path to data file, i.e. coco128.yaml

epochs

100

number of epochs to train for

time

None

number of hours to train for, overrides epochs if supplied

patience

50

epochs to wait for no observable improvement for early stopping of training

batch

16

number of images per batch (-1 for AutoBatch)

imgsz

640

size of input images as integer

save

True

save train checkpoints and predict results

save_period

-1

Save checkpoint every x epochs (disabled if < 1)

cache

False

True/ram, disk or False. Use cache for data loading

device

None

device to run on, i.e. cuda device=0 or device=0,1,2,3 or device=cpu

workers

8

number of worker threads for data loading (per RANK if DDP)

project

None

project name

name

None

experiment name

exist_ok

False

whether to overwrite existing experiment

pretrained

True

(bool or str) whether to use a pretrained model (bool) or a model to load weights from (str)

optimizer

'auto'

optimizer to use, choices=[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]

verbose

False

whether to print verbose output

seed

0

random seed for reproducibility

deterministic

True

whether to enable deterministic mode

single_cls

False

train multi-class data as single-class

rect

False

rectangular training with each batch collated for minimum padding

cos_lr

False

use cosine learning rate scheduler

close_mosaic

10

(int) disable mosaic augmentation for final epochs (0 to disable)

resume

False

resume training from last checkpoint

amp

True

Automatic Mixed Precision (AMP) training, choices=[True, False]

fraction

1.0

dataset fraction to train on (default is 1.0, all images in train set)

profile

False

profile ONNX and TensorRT speeds during training for loggers

freeze

None

(int or list, optional) freeze first n layers, or freeze list of layer indices during training

lr0

0.01

initial learning rate (i.e. SGD=1E-2, Adam=1E-3)

lrf

0.01

final learning rate (lr0 * lrf)

momentum

0.937

SGD momentum/Adam beta1

weight_decay

0.0005

optimizer weight decay 5e-4

warmup_epochs

3.0

warmup epochs (fractions ok)

warmup_momentum

0.8

warmup initial momentum

warmup_bias_lr

0.1

warmup initial bias lr

box

7.5

box loss gain

cls

0.5

cls loss gain (scale with pixels)

dfl

1.5

dfl loss gain

pose

12.0

pose loss gain (pose-only)

kobj

2.0

keypoint obj loss gain (pose-only)

label_smoothing

0.0

label smoothing (fraction)

nbs

64

nominal batch size

overlap_mask

True

masks should overlap during training (segment train only)

mask_ratio

4

mask downsample ratio (segment train only)

dropout

0.0

use dropout regularization (classify train only)

val

True

validate/test during training

plots

False

save plots and images during train/val

下面指出几个比较重要的训练参数

1. epochs 
epochs: 训练的轮数。这个参数确定了模型将会被训练多少次,每一轮都遍历整个训练数据集。训练的轮数越多,模型对数据的学习就越充分,但也增加了训练时间。

选取策略
默认是100轮数。但一般对于新数据集,我们还不知道这个数据集学习的难易程度,可以加大轮数,例如300,来找到更佳性能。

2.data

指定数据集的yaml文件,yaml文件中定义了训练集、验证集的路径;标签类别;标签类别个数等

3. patience
patience: 早停的等待轮数。在训练过程中,如果在一定的轮数内没有观察到模型性能的明显提升,就会停止训练。这个参数确定了等待的轮数,如果超过该轮数仍没有改进,则停止训练。

早停
早停能减少过拟合。过拟合(overfitting)指的是只能拟合训练数据, 但不能很好地拟合不包含在训练数据中的其他数据的状态。

4. batch
batch: 每个批次中的图像数量。在训练过程中,数据被分成多个批次进行处理,每个批次包含一定数量的图像。这个参数确定了每个批次中包含的图像数量。特殊的是,如果设置为**-1**,则会自动调整批次大小,至你的显卡能容纳的最多图像数量。

选取策略
一般认为batch越大越好。因为我们的batch越大我们选择的这个batch中的图片更有可能代表整个数据集的分布,从而帮助模型学习。但batch越大占用的显卡显存空间越多,所以还是有上限的。

5. imgsz
imgsz: 输入图像的尺寸。这个参数确定了输入图像的大小。可以指定一个整数值表示图像的边长,也可以指定宽度和高度的组合。例如640表示图像的宽度和高度均为640像素。
选取策略
如果数据集中存在大量小对象,增大输入图像的尺寸imgsz可以使得这些小对象从高分辨率中受益,更好的被检测出。

6. device 
device: 训练运行的设备。该参数指定了模型训练所使用的设备,例如使用 GPU 运行可以指定为 cuda device=0,或者使用多个 GPU 运行可以指定为 device=0,1,2,3,如果没有可用的 GPU,可以指定为 device=cpu 使用 CPU 进行训练。

7. workers
workers: 数据加载时的工作线程数。在数据加载过程中,可以使用多个线程并行地加载数据,以提高数据读取速度。这个参数确定了加载数据时使用的线程数,具体的最佳值取决于硬件和数据集的大小。
windows系统注意设置为0!!!windows系统下需设置为0,否则会报错!!!
RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase。

这是因为在linux系统中可以使用多个子进程加载数据,而在windows系统中不能。

 8. optimizer

optimizer: 选择要使用的优化器。优化器是深度学习中用于调整模型参数以最小化损失函数的算法。可以选择不同的优化器,如 ‘SGD’、‘Adam’、‘AdamW’、‘RMSProp’,根据任务需求选择适合的优化器。

更多训练参数,可参考ultralytics官网,受限于篇幅,这里不再一一介绍

像上面介绍的训练代码model.train(data='data.yaml', epochs=100, imgsz=640)

只指定了data,epochs,imgsz。如果你有指定其他训练参数的需要,可以参考上面的训练参数在train()函数中添加,比如训练指定优化器

model.train(data='data.yaml', epochs=100, imgsz=640,optimizer='SGD')

2.2 在win系统中进行训练

在上面的章节,简单介绍了一下使用python脚本训练模型的三种方式

from ultralytics import YOLO

# 这里有三种训练方式,三种任选其一

#第一种:根据yaml文件构建一个新模型进行训练,若对YOLO8网络进行了修改(比如添加了注意力机制)适合选用此种训练方式。但请注意这种训练方式是重头训练(一切参数都要自己训练),训练时间、资源消耗都是十分巨大的
model = YOLO('yolov8n.yaml')  # build a new model from YAML

#第二种:加载一个预训练模型,在此基础之前上对参数进行调整。这种方式是深度学习界最最主流的方式。由于大部分参数已经训练好,我们仅需根据数据集对模型的部分参数进行微调,因此训练时间最短,计算资源消耗最小。
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)

#第三种:根据yaml文件构建一个新模型,然后将预训练模型的参数转移到新模型中,然后进行训练,对YOLO8网络进行改进的适合选用此种训练方式,而且训练时间不至于过长
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # build from YAML and transfer weights

# Train the model
#data参数指定数据集yaml文件(我这里data.yaml与train、val文件夹同目录)
#epochs指定训练多少轮
#imgsz指定图片大小
results = model.train(data='data.yaml', epochs=100, imgsz=640)

2.3.1 加载预训练模型训练

在开始训练之前,文件参考目录如下:

我这里直接加载yolov8n预训练模型进行训练,上图中训练代码train.py内容如下:

from ultralytics import YOLO
model=YOLO('yolov8n.pt')
model.train(data='./data.yaml',imgsz=(640,640),workers=0,batch=32,epochs=60)

需要注意的是,目录下最好提前下载好预训练模型(我这里是yolov8n.pt),如果没有提前下载好,运行train.py还是会ultralytics官网下载,由于外网的缘故,此时可能会出现网络问题。

yolo8n.pt预训练权重下载地址:

YOLOv8 - Ultralytics YOLO Docs

 注意,yolo8默认自动开启混合精度训练,并且是使用yolo8n.pt进行的,也就是说即使使用yolo8s,m等预训练模型训练自己的数据集,由于混合精度训练的需要,都会加载yolo8n,但请不要错误认为原本想要用yolov8s.pt训练数据集但看到控制台下载、加载了yolov8n.pt,就认为一直是yolo8n去训练,加载哪个模型就是用哪个模型去训练。像model=YOLO(“yolov8s.pt)是加载的yolo8s,就是用yolo8s去训练的。

如果你想要加载yolo8s yolo8m这些除yolo8n外的预训练模型训练自己的数据集,比如我加载yolo8s.pt 训练自己的数据集,需要在项目目录下提前下载好yolo8n(混合精度需要) yolo8s(训练自己的数据集需要)这两个模型,如果缺少yolo8n只有yolo8s,那么在开始训练之前会下载yolo8n,看到了下载yolo8n 此时好多人都错误的认为配置不生效,一直是用yolo8n训练之类的,实际上你加载哪个模型就是用哪个模型去训练你的数据集,只不过是你的项目目录下缺少用于混合精度的yolo8n,所以要去下载。下面给出使用yolo8s预训练模型训练自己的数据集的参考代码和目录结构

from ultralytics import YOLO
model=YOLO('yolov8s.pt')
model.train(data='./data.yaml',imgsz=(640,640),workers=0,batch=32,epochs=60)

 2.3.2 加载yaml文件训练

在开始训练之前,文件参考目录如下:

 我这里选择使用yolo8s 进行训练,train.py训练代码参考如下:

from ultralytics import YOLO
model=YOLO('yolov8s.yaml')
model.train(data='./data.yaml',imgsz=(640,640),workers=0,batch=32,epochs=60)

其中,上图中yolov8s.yaml是从ultralytics\cfg\models\v8目录下的yolov8.yaml复制过来的,并把yolov8.yaml重命令为 yolov8s.yaml,也就是文件名加一个后缀s。在训练之前,ultralytics框架会根据这个后缀确定训练到底采用哪种网络,比如yolov8x.yaml是指定yolo8x网络训练,而不指定后缀(例如直接加载yolov8.yaml)默认还是采用8n网络训练。

2.3.3 加载yaml文件和预训练权重进行训练

在开始训练之前,文件参考目录如下:

我这里还是选择使用yolo8s 进行训练,用yaml文件定义一个新网络模型并把yolov8s.pt的权重转移到新网络中,train.py训练代码参考如下:

from ultralytics import YOLO
model = YOLO('yolov8s.yaml').load('yolov8s.pt')
model.train(data='./data.yaml',imgsz=(640,640),workers=0,batch=32,epochs=60)
 2.3.4 开始训练

不论上述哪种方式,我们在anaconda中切换到提前已经配置好的ultralytics环境(我这里在anaconda中建立的ultralytics环境名称为yolo8),然后python命令运行train.py

之后,控制台窗口会有一系列的日志输出

 此时,训练成功。经过一段时间等待之后,在目录下的runs文件夹下会自动生成训练过程记录,包含模型权重、混淆矩阵、PR曲线、loss曲线等

上面是以yolo8为例,下面再以yolo10为例,给出训练代码。

from ultralytics import YOLO# 这里有三种训练方式,三种任选其一#第一种:根据yaml文件构建一个新模型进行训练,若对YOLO10网络进行了修改(比如添加了注意力机制)适合选用此种训练方式。但请注意这种训练方式是重头训练(一切参数都要自己训练),训练时间、资源消耗都是十分巨大的
model = YOLO('yolov10n.yaml')  # build a new model from YAML#第二种:加载一个预训练模型,在此基础之前上对参数进行调整。这种方式是深度学习界最最主流的方式。由于大部分参数已经训练好,我们仅需根据数据集对模型的部分参数进行微调,因此训练时间最短,计算资源消耗最小。
model = YOLO('yolov10n.pt')  # load a pretrained model (recommended for training)#第三种:根据yaml文件构建一个新模型,然后将预训练模型的参数转移到新模型中,然后进行训练,对YOLO8网络进行改进的适合选用此种训练方式,而且训练时间不至于过长
model = YOLO('yolov10n.yaml').load('yolov10n.pt')  # build from YAML and transfer weights# Train the model
#data参数指定数据集yaml文件(我这里data.yaml与train、val文件夹同目录)
#epochs指定训练多少轮
#imgsz指定图片大小
results = model.train(data='data.yaml', epochs=100, imgsz=640)

说明:ultralytics最新版本的全面支持yolo5-yolo11,由于版本向下兼容,一般下载最新版本的ultralytics即可。ultralytics 8.0.x 8.1.x 8.2.x版本支持的yolo有所区别,比如ultralytics8.0.x一般支持yolo5 yolo8,具体ultralytics版本支持的yolo版本的差异,请去ultralytics官网查询

由于ultralytcis版本更新很快,这个框架在以惊人的速度吸收其他AI算法(如yolo-world、SAM等),后续版本的YOLO训练代码可能会有所差异,这里给出ultralytics网站地址:Models Supported by Ultralytics - Ultralytics YOLO Docs

官网的文档最具权威性与时效性,参考官方的教程,总不会出错。

同理 yolo9 yolo11等训练步骤也是类似的,利用了ultralytics框架训练不同版本的yolo仅仅是加载模型所有区别。具体yolo9 yolo11等训练代码,可以去ultralytics官网查看

2.3 在linux系统中进行训练

在linux系统中我们可以加大workers(数据加载时的工作线程数),从而加快训练速度,代码跟win系统基本保持一致,下面仅给出加载预训练模型的方式(其余加载yaml文件等方式不再给出示例),参考训练代码如下

from ultralytics import YOLO
model=YOLO('yolov8n.pt')
model.train(data='./data.yaml',imgsz=(640,640),workers=16,batch=32,epochs=60)

值得注意的是,无论是在win系统中还是linux系统中,都要根据自己电脑、服务器的算力去选择合适的workers和batch,设置过小训练速度慢,设置过大,会out of memory.

相关文章:

如何使用Ultralytics训练自己的yolo5 yolo8 yolo10 yolo11等目标检测模型

Ultralytics正在以惊人的速度吸收优秀的CV算法&#xff0c;之前Ultralytics定位于YOLOV8&#xff0c;但逐渐地扩展到支持其他版本的YOLO&#xff0c;最新版本的ultralytics全面支持yolo5 yolo7 yolo8 yolo9 yolo10 yolo11&#xff0c;包含模型的训练、验证、预测、部署等。毫无…...

Java技术栈 —— Andorid开发入门

Java技术栈 —— Andorid开发入门 一、搭建开发环境二、HelloWorld三、将Andorid项目打包成APK文件&#xff0c;并安装至手机上四、开发常见问题 一、搭建开发环境 不用Intellij&#xff0c;而是用Andorid Studio(免费)&#xff0c;这是专门给Andorid的IDE。 参考文章或视频链…...

Qt天气预报系统获取天气数据

Qt天气预报系统获取天气数据 1、获取天气数据1.1添加天气类头文件1.2定义今天和未来几天天气数据类1.3定义一个解析JSON数据的函数1.4在mainwindow中添加weatherData.h1.5创建今天天气数据和未来几天天气数据对象1.6添加parseJson定义1.7把解析JSON数据添加进去1.8添加错误1.9解…...

力扣 搜索二维矩阵

二分查找&#xff0c;闭区间与开区间的不同解法。 题目 乍一看&#xff0c;不是遍历一下找到元素就可以了。 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for (int[] ints : matrix) {for (int ans : ints) {if (ans target) return true;}}…...

JavaScript 操作符与表达式

Hi, 我是布兰妮甜&#xff0c;编写流畅、愉悦用户体验的程序员。JavaScript 是一种功能强大且灵活的编程语言&#xff0c;广泛应用于前端和后端开发。它提供了一系列丰富的操作符和表达式来处理数据、执行逻辑判断以及控制程序流程。理解这些概念对于编写高效、可读性强的代码至…...

深度学习 Pytorch 张量(Tensor)的创建和常用方法

1 张量的基本创建及其类型 和Numpy中的array一样&#xff0c;张量的本质也是结构化地组织了大量的数据。 并且在实际操作中&#xff0c;张量的创建和基本功能也与其非常类似。 1.1 张量(Tensor)函数创建方法 张量的最基本创建方法和Numpy中创建Array的格式一致。 # Numpy创建…...

在VMwareFusion中使用Ubuntu

在VMwareFusion使用Ubuntu 在VMwareFusion使用Ubuntu背景在VMwareFusion虚拟机里使用Ubuntu1、集成桌面工具2、主机和虚拟机之间共享剪贴板内容3、设置root用户密码4、设置静态ip4.1、静态ip和动态ip的区别4.2、查看当前ip4.2、linux网络配置文件所在位置4.3、基于ubuntu22.04.…...

%.*s——C语言中printf 函数中的一种格式化输出方式

在C语言中&#xff0c;%.*s 是 printf 函数中的一种格式化输出方式&#xff0c;用于控制字符串的输出长度。具体来说&#xff0c;%.*s 中的 * 表示输出宽度&#xff08;即最多输出的字符数&#xff09;是一个变量&#xff0c;这个变量的值在运行时通过 printf 函数的参数传递。…...

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

hydra破解密码

hydra九头蛇是常用的密码破解工具 1、破解centos ssh密码 hydra -l root -P password.txt ssh://192.168.1.107:2222 hydra -l root -P password.txt -s 2222 192.168.1.107 ssh2、破解ftp hydra -l allen -P e:\aa.txt ftp://127.0.0.1 hydra -l allen -P e:\aa.txt ftp:…...

JAVA之外观模式

外观模式&#xff0c;又称门面模式&#xff0c;是一种结构型设计模式&#xff0c;旨在为复杂的子系统提供一个统一且简化的接口。通过这一模式&#xff0c;客户端可以更加便捷地与子系统交互&#xff0c;而无需深入了解其内部结构和实现细节。外观模式不仅简化了客户端的使用&a…...

如何选择合适的服务器?服务器租赁市场趋势分析

服务器租赁市场概览 服务器租赁 market可以分为两种类型&#xff1a;按小时、按月和按年&#xff0c;每种模式都有其特点和适用场景&#xff0c;按小时租赁是最经济实惠的选择&#xff0c;适用于短期需求&#xff1b;按月租赁则适合中长期使用&#xff1b;而按年租赁则是最灵活…...

CentOS 下载软件时报Error: Failed to synchronize cache for repo ‘AppStream‘解决方法

下载软件时出现以下问题 直接把CentOS-AppStream.repo改个名字就行 cd /etc/yum.repos.d/ mv CentOS-AppStream.repo CentOS-AppStream.repo.bak就可以了 解决思路 把AI问遍&#xff0c;无人会&#xff0c;解决法 想要下载软件通通失败了&#xff0c;解决方法当然是问AI&am…...

鲍厚霖:引领AI广告创新,搭建中美合作桥梁

2024年是鲍厚霖和她领导的超能S咨询公司(Triple S AI)收获颇丰的一年。这一年中,她以卓越的战略眼光和创新能力,为中美教育、文化与技术的深度融合注入了新的活力。2025年,Triple S AI计划推出全新2.0版本平台,进一步深化人工智能驱动的营销与文化合作领域,推动产业变革与社会福…...

学习记录1

[SUCTF 2019]EasyWeb 直接给了源代码&#xff0c;分析一下 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if…...

【Gossip 协议】Golang的实现库Memberlist 库简介

Gossip 协议简介 Gossip 协议是一种分布式协议&#xff0c;用于在节点之间传播信息&#xff0c;常用于成员管理、故障检测、服务发现等场景。在这个协议中&#xff0c;每个节点定期与其他节点交换信息&#xff0c;最终保证所有节点达到一致的状态。它的工作原理类似于人群中的…...

LDD3学习7--硬件接口I/O端口(以short为例)

1 理论 1.1 基本概念 目前对外设的操作&#xff0c;都是通过寄存器。寄存器的概念&#xff0c;其实就是接口&#xff0c;访问硬件接口&#xff0c;有I/O端口通信和内存映射I/O (Memory-Mapped I/O)&#xff0c;I/O端口通信是比较老的那种&#xff0c;都是老的串口并口设备&am…...

openharmony电源管理子系统

电源管理子系统 简介目录使用说明相关仓 简介 电源管理子系统提供如下功能&#xff1a; 重启服务&#xff1a;系统重启和下电。系统电源管理服务&#xff1a;系统电源状态管理和休眠运行锁管理。显示相关的能耗调节&#xff1a;包括根据环境光调节背光亮度&#xff0c;和根…...

【Rust自学】13.4. 闭包 Pt.4:使用闭包捕获环境

13.4.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发&#xff0c;而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中&#xff0c;我们会讨论 Rust 的一…...

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容&#xff0c;MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令&#xff0c;你需要找到 mysql 可执行文件的路径。 在 macOS 上&#xff0c;mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此&#xff0c;完整的路径应该是&#xff1…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...