专栏导航:点击此处跳转
🚀 YOLOv8
🔨 官方仓库下载
目前YOLOv8代码并没有固定大版本,仍在一直高频率更新,按照以下命令可安装最新版本
git clone https://github.com/ultralytics/ultralytics.git
若GitHub
下载过慢则使用Gitee
下载
git clone https://gitee.com/monkeycc/ultralytics.git
说明:YOLOv8项目实则只需保留ultralytics
一个文件夹即可。
💥 旧版本下载
以YOLOv8-8.0.224版本举例:
说明:这里使用旧版本的主要原因是为了后续的剪枝项目,YOLOv8较新版本无法兼容。
📣 版本查看
ultralytics/__init__.py
# Ultralytics YOLO 🚀, AGPL-3.0 license
__version__ = '8.0.227'
from ultralytics.models import RTDETR, SAM, YOLO
from ultralytics.models.fastsam import FastSAM
from ultralytics.models.nas import NAS
from ultralytics.utils import SETTINGS as settings
from ultralytics.utils.checks import check_yolo as checks
from ultralytics.utils.downloads import download
__all__ = '__version__', 'YOLO', 'NAS', 'SAM', 'FastSAM', 'RTDETR', 'checks', 'download', 'settings'
⚡️ 超参数设置
1. img-size
推荐使用默认的 640 ∗ 640 640*640 640∗640,无需做修改。如果数据集中有大量的小目标,可以适当增加数值,比如800、1024、1280等,有利于训练结果。但也会增加训练时间和显存需求。模型推理img-size值需与训练img-size值一致。
2. batch-size
批量大小Batchsize训练过程中需要调整的超参数之一。合适的批量大小可以充分利用GPU资源。建议使用硬件允许的最大值,需避免Batchsize值过小产生糟糕的统计结果。
PS:做实验的话不建议将Batchsize拉满,原因如下:
- 做对比实验需要保持Batchsize一致,但不同模型在Batchsize相同情况下往往存在所需显存不同,举个例子,YOLOv5训练时我将batchsize设置为128,这时显存刚好拉满,但是换成YOLOv7训练,如果你的batchsize设置为128,那显存必爆无疑。众所周知,YOLOv7训练所需要的显存要高得多。
- 如果你对网络进行修改,增加了很多模块,这常常会使得计算量FLOPs增加,那么就需要更多的显存来进行训练。
总结:实验需要保持Batchsize一致,不过这个值需要各位根据具体情况确定。
3. epochs
迭代次数是训练过程中需要调整的超参数之一。迭代次数要足够多以达到模型收敛。
默认300个,出现过拟合则减小该值,反之亦然。
PS:如果时从头开始训练,则可以在训练模型基线时将该值调大,然后观察训练loss大致在多少轮数收敛,那么再结合自身情况综合考虑确定轮数。
4. 🔥🔥🔥 cache
YOLOv8的训练参数里面有一个cache
,默认不开启,开启后默认是ram
,就是把解码后的图片保存在内存中。也可以是disk
,就会把解码后的图片保存在硬盘上,可以加快训练。
5. 🔥🔥 seeds
随机种子(seeds)设置用于控制随机性,从而使训练过程更加可重复和可控。模型训练过程通常包含随机性,例如数据增强、权重初始化和优化器等。这些随机因素会影响模型的训练结果,使得每次训练的结果可能不同。如果需要比较不同模型或参数设置的性能,或者需要在多次训练中保持结果的一致性,就需要使用随机种子来控制随机性。
PS:随机种子的设置,能确保每次运行时的随机数生成是可重复的。不过设置种子只能保证模型在相同的种子值下生成相同的随机数序列,但不能保证模型的训练结果完全相同。(少量数据集下训练结果是完全相同的)
6. workers
在YOLO中,workers
参数用于指定用于数据加载的工作进程数量。这些工作进程负责将数据从存储设备(如硬盘)加载到内存中,并进行预处理操作,例如图像缩放、数据增强等。默认值为8,一般不做修改,Windows下建议设置为0。
🔥 权重文件保存
在ultralytics/engine/trainer.py
进行相应的修改,值200
可根据需求任意更改:
# Save last, best and delete
torch.save(ckpt, self.last, pickle_module=pickle)
if self.best_fitness == self.fitness:
torch.save(ckpt, self.best, pickle_module=pickle)
# 保存权重文件
if self.best_fitness == self.fitness and self.epoch >= 200:
torch.save(ckpt, self.wdir / f'best{self.epoch}.pt', pickle_module=pickle)
strip_optimizer(self.wdir / f'best{self.epoch}.pt')
模型测试
训练完成后,weights
文件夹中必将有不少的best_xxx.pt
权重文件,训练完接着就是需要在测试集上进行模型性能测试,当然你可以一个一个指定执行,但是很耗时,这时候可以选择使用shell脚本进行自动化执行,新建一个test.sh
脚本文件,脚本如下(注意:需要修改data
值为自己数据集yaml文件路径):
#!/bin/bash
# 指定目标文件夹的路径
target_folder=$1
task=$2
data="data.yaml"
log_dir="log"
# 获取第一级文件夹名字
parent_folder=$(dirname "$target_folder" | awk -F'/' '{print $NF}')
echo "Found folder: $parent_folder"
# 使用 mkdir 命令创建文件夹,包括多级目录,如果不存在的话
# mkdir -p "$log_dir/$parent_folder"
mkdir -p "$log_dir/$parent_folder"
log_file="$log_dir/$parent_folder/$task.log"
rm -f "$log_file"
# -type f 表示查找文件,-name "*.pt" 表示查找文件名以 .pt 结尾的文件
file_list=$(find "$target_folder" -type f -name "*.pt")
# 重定向标准输出和标准错误到日志文件
exec > "$log_file" 2>&1
for file in $file_list; do
# 获取第一级和第二级文件夹名字
# parent_folder=$(dirname "$(dirname "$file")" | awk -F'/' '{print $NF}')
file_name=$(basename "$file" .pt)
echo "========================================"
echo "Found file: $file_name"
echo "========================================"
python test.py --weights "$file" --data "$data" --task $task
done
执行:
sh test.sh runs/train/exp/weights test
执行完会在根目录下生成log
文件夹,里面对应的log日志文件。