1.5.3 验证步骤
(1)下面代码定义了一个函数,用于读取并显示指定文件夹中的一组图像文件。图像列表包括混淆矩阵和各类曲线图,函数会将每张图像转换为RGB格式,并以固定尺寸显示,为模型训练的可视化提供直观效果。
import os
import cv2
import matplotlib.pyplot as plt
def display_images(post_training_files_path, image_files):
for image_file in image_files:
image_path = os.path.join(post_training_files_path, image_file)
img = cv2.imread(image_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 10), dpi=120)
plt.imshow(img)
plt.axis('off')
plt.show()
# 要显示的图像文件列表
image_files = [
'confusion_matrix_normalized.png',
'F1_curve.png',
'P_curve.png',
'R_curve.png',
'PR_curve.png',
'results.png'
]
# 图像所在目录的路径
post_training_files_path = '/working/runs/detect/train'
# 显示图像
display_images(post_training_files_path, image_files)
执行后会从指定目录 (/working/runs/detect/train) 中读取一组图像文件,包括混淆矩阵和各类性能曲线图,如图1-3所示。每张图像会被读取并转换为RGB格式,然后使用matplotlib展示出来。每张图像的显示尺寸被设置为10x10英寸,分辨率为120 DPI,且不会显示坐标轴。这样,用户可以直观地查看训练过程中的各项评估结果和模型性能曲线。
混淆矩阵图
F1 曲线(F1_curve.png)图
精度曲线(P_curve.png)图
召回率曲线(R_curve.png)图
PR 曲线(PR_curve.png)图
结果图(results.png)
图1-3 各种可视化图
各种可视化图的具体说明如下:
- 混淆矩阵(confusion_matrix_normalized.png)图:用于展示分类模型的性能,显示了实际类别和预测类别之间的对比。矩阵的每个单元格表示预测类别与实际类别的匹配情况。标准化的混淆矩阵便于比较各个类别的准确率。
- F1 曲线(F1_curve.png)图:F1分数是精度(Precision)和召回率(Recall)的调和平均,用于评估模型的综合表现。F1 曲线展示了随着训练过程中某些参数(如阈值)的变化,F1 分数的变化情况。
- 精度曲线(P_curve.png)图:精度曲线(Precision Curve)显示了模型在不同的阈值下的精度变化,精度是指预测为正类的样本中,实际为正类的比例。
- 召回率曲线(R_curve.png)图:召回率曲线(Recall Curve)展示了在不同阈值下模型的召回率变化,召回率是指所有实际为正类的样本中,被正确识别为正类的比例。
- PR 曲线(PR_curve.png)图:精度-召回率曲线(Precision-Recall Curve),展示了在不同阈值下,精度和召回率的权衡。此曲线常用于类别不平衡的情形下,评价模型在正类检测方面的表现。
- 结果图(results.png):展示训练过程中的整体性能结果,例如损失函数变化、mAP(平均精度均值)、训练和验证集上的精度、召回率等。
这些图像有助于全面评估模型的性能,尤其是在多类别任务中,对模型的每个方面进行细致的分析。
(2)下面代码用于读取训练过程中生成的results.csv文件,加载到pandas数据框中,并显示文件中的最后10行内容。这样可以查看训练结果的最后几条数据,如模型的性能指标、损失值或其他相关信息。
# 读取训练结果的CSV文件
Result_Final_model = pd.read_csv('working/runs/detect/train/results.csv')
# 显示CSV文件中的最后10行数据
Result_Final_model.tail(10)
执行后会输出:
epoch train/box_loss train/cls_loss train/dfl_loss metrics/precision(B) metrics/recall(B) metrics/mAP50(B) metrics/mAP50-95(B) val/box_loss val/cls_loss val/dfl_loss lr/pg0 lr/pg1 lr/pg2
20 21 0.55740 0.52881 0.94040 0.96343 0.81798 0.93275 0.79194 0.57663 0.45824 0.95732 0.000179 0.000179 0.000179
21 22 0.54938 0.50105 0.93599 0.92566 0.88105 0.94360 0.80859 0.56651 0.43104 0.95234 0.000161 0.000161 0.000161
22 23 0.53653 0.47742 0.93256 0.92601 0.87273 0.94378 0.80903 0.56020 0.42374 0.94359 0.000144 0.000144 0.000144
23 24 0.52901 0.45752 0.92159 0.94448 0.87110 0.94789 0.81055 0.56475 0.40938 0.95220 0.000127 0.000127 0.000127
24 25 0.52568 0.43794 0.92954 0.94604 0.88493 0.95295 0.82069 0.54540 0.38604 0.93454 0.000109 0.000109 0.000109
25 26 0.51426 0.42990 0.91126 0.94099 0.88593 0.95179 0.82002 0.54739 0.38483 0.93668 0.000092 0.000092 0.000092
26 27 0.50218 0.40930 0.90848 0.94543 0.89077 0.95616 0.82587 0.54801 0.37515 0.93724 0.000075 0.000075 0.000075
27 28 0.50789 0.39283 0.91260 0.92909 0.90408 0.95452 0.82420 0.54305 0.37637 0.93477 0.000057 0.000057 0.000057
28 29 0.49446 0.38381 0.90141 0.93868 0.90941 0.95800 0.82593 0.54046 0.35780 0.93587 0.000040 0.000040 0.000040
29 30 0.49017 0.38064 0.90189 0.94317 0.90490 0.95719 0.83020 0.53427 0.35107 0.93138 0.000023 0.000023 0.000023
(3)下面这段代码用于读取文件results.csv并使用seaborn绘制多个子图,展示模型训练过程中不同指标的变化情况。包括训练损失(box_loss, cls_loss, dfl_loss)、模型评估指标(precision, recall, mAP)、以及验证集的损失值(val/box_loss, val/cls_loss, val/dfl_loss)。每个子图都展示了不同的训练或验证指标随训练轮次(epoch)变化的趋势,帮助用户分析训练效果和模型性能。
# 读取 results.csv 文件并将列名去除空格
Result_Final_model.columns = Result_Final_model.columns.str.strip()
# 创建子图
fig, axs = plt.subplots(nrows=5, ncols=2, figsize=(15, 15))
# 使用 seaborn 绘制各个指标的变化曲线
sns.lineplot(x='epoch', y='train/box_loss', data=Result_Final_model, ax=axs[0,0])
sns.lineplot(x='epoch', y='train/cls_loss', data=Result_Final_model, ax=axs[0,1])
sns.lineplot(x='epoch', y='train/dfl_loss', data=Result_Final_model, ax=axs[1,0])
sns.lineplot(x='epoch', y='metrics/precision(B)', data=Result_Final_model, ax=axs[1,1])
sns.lineplot(x='epoch', y='metrics/recall(B)', data=Result_Final_model, ax=axs[2,0])
sns.lineplot(x='epoch', y='metrics/mAP50(B)', data=Result_Final_model, ax=axs[2,1])
sns.lineplot(x='epoch', y='metrics/mAP50-95(B)', data=Result_Final_model, ax=axs[3,0])
sns.lineplot(x='epoch', y='val/box_loss', data=Result_Final_model, ax=axs[3,1])
sns.lineplot(x='epoch', y='val/cls_loss', data=Result_Final_model, ax=axs[4,0])
sns.lineplot(x='epoch', y='val/dfl_loss', data=Result_Final_model, ax=axs[4,1])
# 为每个子图设置标题和坐标轴标签
axs[0,0].set(title='Train Box Loss')
axs[0,1].set(title='Train Class Loss')
axs[1,0].set(title='Train DFL Loss')
axs[1,1].set(title='Metrics Precision (B)')
axs[2,0].set(title='Metrics Recall (B)')
axs[2,1].set(title='Metrics mAP50 (B)')
axs[3,0].set(title='Metrics mAP50-95 (B)')
axs[3,1].set(title='Validation Box Loss')
axs[4,0].set(title='Validation Class Loss')
axs[4,1].set(title='Validation DFL Loss')
# 设置总标题并调整子图布局
plt.suptitle('Training Metrics and Loss', fontsize=24)
plt.subplots_adjust(top=0.8)
plt.tight_layout()
plt.show()
执行后会生成一个包含10个子图的可视化图,每个子图展示训练过程中的不同性能指标和损失函数随训练轮次(epoch)变化的情况。如图1-4所示,这些图表帮助用户分析模型的训练过程和表现,具体包括:
- 训练损失:Train Box Loss, Train Class Loss, Train DFL Loss。
- 训练评估指标:Metrics Precision (B), Metrics Recall (B), Metrics mAP50 (B), Metrics mAP50-95 (B)。
- 验证损失:Validation Box Loss, Validation Class Loss, Validation DFL Loss。
每个子图显示一个具体的指标或损失函数,并且随着训练轮次的增加,用户可以直观地看到模型在这些指标上的进展或改善情况。图表的标题会帮助区分每个子图的内容。
图1-4 包含10个子图的可视化图
标签:loss,axs,检测,YOLOv8,Result,model,交通标志,Final,png From: https://blog.csdn.net/asd343442/article/details/143889805