模型训练和相关报错可以看我的前文:

环境配置创建yolov8属于自己的数据集:

配置pytorch环境(anaconda+cudn+cudnn+pytorch)_cudn+pytorch-CSDN博客

训练数据集报错:

yolov8训练数据集报错处理-CSDN博客

模型训练时出现内存不足问题报错:

yolov8训练数据集报错(内存不足问题)_dataloader 的工作进程(worker)意外退出、-CSDN博客

1.完成模型训练后,测试图片:

# 六、模型测试
# 训练完模型之后,可以验证模型的检测效果,创建detec.py文件,内容如下:
from ultralytics import YOLO

# 加载训练好的模型
model = YOLO('runs/detect/train14/weights/best.pt') # 这里用你训练完以后保存的模型文件

# 推理单张图片
results = model('VOCdevkit/test/images/17.jpg')

# 显示推理结果
for result in results:
	result.show()

测试图片如下:

运行得到训练结果如下:

及:已完成模型训练,能够训练相关测试

2. 训练完成数据查看

训练完成后得到对应的runs文件夹(如图)训练 输出目录:

目录结构解释

  • runs/: 这是 YOLOv8 默认的输出目录,所有训练结果都会保存在这个目录下。

    • detect/: 这个子目录通常用于存放检测任务的结果。

      • train/: 这个子目录用于存放训练过程中生成的各种文件和结果。

        • train1/train142/: 这些是不同的训练实验目录,每个目录对应一次训练实验。目录名称通常包含训练配置的哈希或特定的标识符。

          • weights/: 存放该次训练过程中生成的模型权重文件。

            • best.pt: 在训练过程中在验证集上表现最好的模型权重。

            • last.pt: 训练过程中最后生成的模型权重。

          • args.yaml: 这个文件保存了该次训练实验的配置参数。

          • labels.jpglabels_correlogram.jpg: 这些是可视化文件,可能展示了标签分布或相关性图。

          • results.csv: 这个文件通常包含了训练过程中详细的结果数据,包括每个 epoch 的损失值等。

          • train_batch0.jpg 等: 这些是训练过程中生成的批次图像,用于可视化和调试。

        • train14/train142/: 这些目录结构类似,包含了各自的训练结果和配置。

日志文件位置

在目录结构中,日志文件可能指的是以下几种文件:

  1. args.yaml: 这个文件包含了训练的配置参数,可以视为配置日志,记录了训练时使用的各种设置。

  2. results.csv: 这个文件通常包含了训练过程中的详细结果,包括每个 epoch 的损失值、准确率等关键指标。这是最接近传统意义上的“日志文件”的文件,因为它记录了训练过程中的详细数据。

  3. labels.jpglabels_correlogram.jpg: 这些文件可能包含了关于标签分布的可视化信息,虽然不是传统日志,但对于分析训练数据的标签分布很有帮助。

如何使用日志文件

  • 分析训练过程:通过查看 results.csv 文件,你可以了解模型在每个 epoch 的表现,包括损失值的下降情况,从而分析模型的训练过程和性能。

  • 调试和优化:如果训练结果不理想,可以通过分析 args.yamlresults.csv 文件来调整训练参数和策略,进行模型的调试和优化。

  • 可视化:通过 labels.jpglabels_correlogram.jpg 文件,能够直观地看到标签的分布情况,这对于理解数据集的标签分布和进行数据预处理非常有帮助。

3. 提取损失值,并可视化展示损失曲线

        我们能够写一段简单的代码,提取日志文件中的损失值信息,使用Matplotlib绘制对应的损失函数值:

import matplotlib.pyplot as plt
import csv

# 日志文件路径
log_file = 'runs/detect/train14/results.csv'

# 初始化损失列表
train_box_losses = []
train_cls_losses = []
train_dfl_losses = []
val_box_losses = []
val_cls_losses = []
val_dfl_losses = []

# 打开并读取日志文件
try:
    with open(log_file, 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        next(reader, None)  # 跳过标题行
        for row in reader:
            train_box_losses.append(float(row['train/box_loss']))
            train_cls_losses.append(float(row['train/cls_loss']))
            train_dfl_losses.append(float(row['train/dfl_loss']))
            val_box_losses.append(float(row['val/box_loss']))
            val_cls_losses.append(float(row['val/cls_loss']))
            val_dfl_losses.append(float(row['val/dfl_loss']))

except FileNotFoundError:
    print(f"Error: The file '{log_file}' does not exist.")
except ValueError:
    print(f"Error: The file '{log_file}' contains invalid data.")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

# 绘制训练和验证损失曲线
plt.figure(figsize=(12, 6))
plt.plot(train_box_losses, label='Training Box Loss')
plt.plot(val_box_losses, label='Validation Box Loss')
plt.plot(train_cls_losses, label='Training Class Loss')
plt.plot(val_cls_losses, label='Validation Class Loss')
plt.plot(train_dfl_losses, label='Training DFL Loss')
plt.plot(val_dfl_losses, label='Validation DFL Loss')
plt.title('Training and Validation Loss Curve')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.grid(True)
plt.savefig('training_curve.png', dpi=300)
plt.show()

得到类似图示结果:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐