YOLOv5入门(六)目标检测性能评价指标与结果分析

本文详细解读了YOLOv5训练过程中的关键结果文件,包括模型权重(best.pt,last.pt)、混淆矩阵、F1曲线、mAP及其影响因素,以及FPS和IoU等评价指标。重点介绍了如何分析和优化模型性能,为模型评估和论文发表提供指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

       通过前面几篇文章,已经完成数据集制作、环境配置(服务器)和模型训练,本篇博客主要讲解训练yolov5的train.py生成的结果文件各个图片和其中指标的含义,以及在评估模型和发表论文时主要用到的参数~

下面的文章围绕以下这个结果文件讲述:

往期回顾

YOLOv5入门(一)利用Labelimg标注自己数据集

YOLOv5入门(二)处理自己数据集(标签统计、数据集划分、数据增强)

YOLOv5入门(三)使用云服务器autoDL、VSCode连接和WinSCP文件上传

YOLOv5入门(四)训练公共数据集KITTI实践

YOLOv5入门(五)训练自己的目标检测模型

目录

一、结果分析

1.1 weights(模型权重)

1.2 confusion_matrix(混淆矩阵)

1.3 F1_curve(F1曲线)

1.4 hpy.yaml

1.5 labels

1.6 labels_corrlogram

1.7 opt.yaml

1.8 P_curve

1.9 R_curve

1.10 PR_curve

1.11 result.csv

1.12events.out.tfevents.1714616288.autodl-container-bbd74aba75-e1ff89fb.2194.0

1.13 result.png

1.14 train_batchx

1.15 val_batchx_labels

1.16 val_batchx_pred

二、评价指标mAP

2.1 影响mAP因素

2.2 优化mAP方法

三、其他评价指标

3.1 FPS

3.2 IoU


一、结果分析

1.1 weights(模型权重)

以上两个文件就是我们训练好的权重:

best.pt:训练过程中在验证集上表现最好的模型权重。在训练过程中,每个epoch结束后都会对验证集进行一次评估,记录最好的模型权重

last.pt:模型训练最后一次迭代结束后的模型权重

二者区别:best.pt用于训练后对模型进行推理和部署;last.pt用于继续训练模型,包含最后一次训练迭代结束时的模型权重,可以从上一次训练结束的地方继续训练模型。


1.2 confusion_matrix(混淆矩阵)

 1.2.1 混淆矩阵介绍

        混淆矩阵,又称为可能性矩阵或错误矩阵。混淆矩阵是可视化工具,用于监督学习,在无监督学习一般叫做匹配矩阵。在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。

 1.2.2 混淆矩阵结构

True Positive (TP): 模型将实际为正类别的样本正确预测为正类别。

False Positive (FP):模型将实际为负类别的样本错误预测为正类别。

False Negative (FN):模型将实际为正类别的样本错误预测为负类别。

True Negative (TN):模型将实际为负类别的样本正确预测为负类别。

 1.2.3 混淆矩阵效果

1、混淆矩阵的每一行代表了预测类别,每一行的总数表示预测为该类别的数据的数目;
2、每一列代表了数据的真实归属类别,每一列的数据总数表示该类别的数据实例的数目;

 1.2.4 从混淆矩阵得到分类指标

(1)准确率(Accuracy)

含义:准确率用来表示模型的精度,即模型识别正确的个数/样本的总个数

Accuracy = (TP+TN)/(TP+FN+FP+TN)

(2)正确率/精确率(Precision)

含义:表示在模型识别为正类样本中,真正为正类的样本所占比例

Precision = TP/(TP+FP)

(3)召回率/查全率(Recall)

含义:表示模型正确识别出为正类的样本的数量占总的正类样本数量的比值。Recall越高,说明有更多的正类样本被模型预测正确,模型的效果越好。

Recall = TP/(TP+FN)

(4)平均精度(Average Precision,AP)

含义:AP衡量模型在每个类别上的好坏

(5)均值平均精确度(Mean Average Precision,mAP)

含义:mAP衡量在所有类型上的好坏,mAP取所有类别AP的平均值

mAP@0.5:当IoU为0.5时的mAP

mAP@0.5:0.95 当IoU为0.5:0.95:0.05时的mAP平均数

(6)F1-score

含义:分类问题的一个衡量指标,可以用于评估模型在检测出所有目标的情况下的精确性和完整性。F1-score综合考虑精确度与召回率的指标,最大值为1,最小值为0,公式如下:

F1 = 2 * (Precision * Recall) / (Precision + Recall)


1.3 F1_curve(F1曲线)

F1-Confidence Curve就是F1-Score随着Confience逐渐增高而变化的曲线。

横坐标:Confidence(置信度)

纵坐标:F1-Score

置信度含义:模型判定一个物体并不是百分百判定它是属于某个分类,而是会给予它一个概率,Confidence就是设置的阈值,如果超过这个概率那么就确定为某个分类。

1.4 hpy.yaml

保存我们训练时指定的参数,内容如下:

lr0: 0.01
lrf: 0.01
momentum: 0.937
weight_decay: 0.0005
warmup_epochs: 3.0
warmup_momentum: 0.8
warmup_bias_lr: 0.1
box: 0.05
cls: 0.5
cls_pw: 1.0
obj: 1.0
obj_pw: 1.0
iou_t: 0.2
anchor_t: 4.0
fl_gamma: 0.0
hsv_h: 0.015
hsv_s: 0.7
hsv_v: 0.4
degrees: 0.0
translate: 0.1
scale: 0.5
shear: 0.0
perspective: 0.0
flipud: 0.0
fliplr: 0.5
mosaic: 1.0
mixup: 0.0
copy_paste: 0.0

1.5 labels

labels图片代表每个检测到的目标的类别和边界框信息。

    1、第一个图是训练集的数据量,每个类别数;

    2、第二个图是框的尺寸和数量;

    3、第三个图是中心点相对于整幅图的位置;

    4、第四个图是目标相对于整幅图的高宽比例;


1.6 labels_corrlogram

含义:指的是一种图形,用于显示目标检测算法在训练过程中预测标签之间的相关性。

作用:体现中心点横纵坐标以及框的高度间的关系

表示中心点坐标x、y,以及框的高宽之间的关系。每行的最后一幅图代表的是x,y,宽和高的分布情况;

    1、第一行的图表明中心点横坐标x的分布情况,可以看到大部分集中在整幅图的中心位置;

    2、第二行的图表明中心点纵坐标y与横坐标x,y的分布情况

    3、第三行的图表明框的宽与横坐标x,y和款的宽的分布情况

    4、第四行的图表明框的高与横坐标x,y和框的宽、高的分布情况


1.7 opt.yaml

包含了数据集路径、权重路径,项目名称等一系列设置性参数

weights: yolov5s.pt
cfg: /root/yolov5-7.0/models/yolov5s_tls.yaml
data: /root/yolov5-7.0/data/traffic_lights.yaml
hyp:
  lr0: 0.01
  lrf: 0.01
  momentum: 0.937
  weight_decay: 0.0005
  warmup_epochs: 3.0
  warmup_momentum: 0.8
  warmup_bias_lr: 0.1
  box: 0.05
  cls: 0.5
  cls_pw: 1.0
  obj: 1.0
  obj_pw: 1.0
  iou_t: 0.2
  anchor_t: 4.0
  fl_gamma: 0.0
  hsv_h: 0.015
  hsv_s: 0.7
  hsv_v: 0.4
  degrees: 0.0
  translate: 0.1
  scale: 0.5
  shear: 0.0
  perspective: 0.0
  flipud: 0.0
  fliplr: 0.5
  mosaic: 1.0
  mixup: 0.0
  copy_paste: 0.0
epochs: 100
batch_size: 128
imgsz: 640
rect: false
resume: false
nosave: false
noval: false
noautoanchor: false
noplots: false
evolve: null
bucket: ''
cache: null
image_weights: false
device: ''
multi_scale: false
single_cls: false
optimizer: SGD
sync_bn: false
workers: 8
project: runs/train
name: exp
exist_ok: false
quad: false
cos_lr: false
label_smoothing: 0.0
patience: 100
freeze:
- 0
save_period: -1
seed: 0
local_rank: -1
entity: null
upload_dataset: false
bbox_interval: -1
artifact_alias: latest
save_dir: runs/train/exp3

1.8 P_curve

准确率(Precision)与置信度(confidence)之间的关系图


1.9 R_curve

召回率(Recall)和置信度(Confidence)之间的关系


1.10 PR_curve

        PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。PR曲线下围成的面积即AP,所有类别AP平均值即mAP


1.11 result.csv

        全部列从左往右依次为:训练轮数、训练集边界框损失、训练集置信度损失、训练集分类损失、精确率、召回率、均值平均精度mAP@0.5、均值平均精度mAP@0.5:0.95、验证集边界框损失、验证集目标检测损失、验证集分类损失、学习率

结果loss

    1、定位损失box_loss:预测框与标定框之间的误差(CIoU),越小定位越准

    2、置信度损失obj_loss:计算网络的置信度,越小判定为目标的能力越准

    3、分类损失cls_loss:计算,锚框与对应的标定分类是否正确,越小分类越准


1.12events.out.tfevents.1714616288.autodl-container-bbd74aba75-e1ff89fb.2194.0

        TensorBoard日志文件,用于记录训练过程中的各种指标,比如损失、准确率、其他统计数据,可以通过TensorBoard来可视化这些指标,以监控和分析模型的训练进度和性能。


1.13 result.png

(1)边界框损失(box_loss):预测框与标定框之间的误差,越小定位得越准;

(2)置信度损失(obj_loss):目标检测loss均值,越小判定目标的能力越准;

(3)分类损失(cls_loss):计算锚框与对应的标定分类是否正确,越小分类越准;

(4)mAP@0.5:0.95(mAP@[0.5:0.95])表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP;

(5)mAP@0.5: 表示阈值大于0.5的平均mAP


1.14 train_batchx

用于训练模型性能的标签:是YOLOv5模型训练集的图片,其中x表示训练集的批次编号。train_batchx中每个图片都有一个对应的标签,用于描述图像中的目标的位置和类别信息。


1.15 val_batchx_labels

验证集第x轮的实际标签:指验证集中一个batch的真实标签和框的信息,其中x为batch的编号。这些信息通常包括每个样本的分类标签和相应的边界框坐标。


1.16 val_batchx_pred

验证集第x轮的预测标签:指验证集中一个batch的预测标签和框的信息,其中x为batch的编号。这些信息通常包括每个样本的分类标签和相应的边界框坐标。

二、评价指标mAP

2.1 影响mAP因素

(1)模型的复杂度

        模型的复杂度越高,模型对数据集的拟合能力越强,模型在测试数据集上的性能也会越好。然而,模型过于复杂会导致模型训练时间过长,从而降低模型性能

(2)数据集的大小

        数据集越大,模型的性能越好。然而,数据集过大,模型的训练时间会增加,从而降低模型性能

(3)超参数选择

        超参数的选择会影响模型的拟合能力,从而影响模型在测试数据集上的性能

2.2 优化mAP方法

(1)数据增强

        通过对训练集加噪声、改变亮度、裁剪、平移、旋转、镜像、cutout等方法,增加样本量,从而提高模型的鲁棒性和泛化能力

(2)主干网络替换

        使用更加先进的模型结构,如ResNet、MobileNet等对模型进行改进,如增加层数、减小学习率

(4)特征融合的替换

        更换特征融合结构,如BiFPN、AFPN、EVC等,增加小目标层(适合小目标较多的数据集)

(5)添加注意力机制

        在特征提取、池化层、特征融合部分添加注意力机制,如SE、CBAM等

(6)损失函数

        选择合适的损失函数,如Focal Loss、EIoU Loss等,让模型关注难以识别的样本,提高模型的精度

(7)NMS和激化函数

三、其他评价指标

3.1 FPS

        FPS(每秒帧率):用于评估模型在给定硬件上的处理速度,即每秒可以处理的图片数量。该指标对于实现实时检测非常重要,因为只有处理速度快,才能满足实时检测的需求。简单来理解就是图像的刷新频率,也就是每秒多少帧,假设目标检测网络处理1帧要0.02s,此时FPS就是1/0.02=50。(轻量化提高FPS是发论文比较流行的一个方向)

FPS计算问题

(1)参数配置:

      data为自己数据集对应的yaml文件

      weights为训练自己数据集得到的权重

      batchsize设置为1

(3)运行val.py生成结果如下:

(3)FPS计算

pre-process:图像预处理时间,包括图像保持长宽比缩放和padding填充,通道变换(HWC->CHW)和升维处理等

inference:推理速度,指预处理之后的图像输入模型到模型输出结果的时间

NMS:后处理时间,对模型输出结果进行转换

FPS = 1000ms/pre-process+inference+NMS(1000ms除以三个时间之和)

3.2 IoU

        IoU(交并比):在目标检测中,用于衡量模型预测框与标注框之间的重叠程度。IoU值越大,表示两个框之间的相似度越高。通常,当IoU值大于0.5时,认为可以检测到目标物体,这个指标常用于评估模型在特定数据集上的检测准确度

IoU = 交集面积/并集面积

3.3 GFLOPs

1、FLOPS:注意S是大写,是“每秒所执行的浮点运算次数”的缩写。常被用来估算电脑的执行效能,尤其是在使用大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。

2、FLOPs:注意s是小写,是浮点运算次数,可以用来衡量算法/模型复杂度。常用当然还有GFLOPs和TFLOPs。

3、GFLOPs:每秒10亿次的浮点运算数,常作为GPU性能参数但不一定代表GPU的实际表现,因为还要考虑具体如何拆分多边形和像素、以及纹理填充,理论上该数值越高越好。1GFLOPs=10^9FLOPs。

注意事项:

      涨点一般看的是训练完权重之后运行val.py得到的map值,也可以看train的最大值。

(ultralytics-main) E:\BaiduNetdiskDownload\YOLOv8\ultralytics-main>yolo detect train data=datasets/coco128/luosi/luosi.yaml model=yolov8n.pt pretrained=ultralytics/yolov8n.pt epochs=20 batch=4 lr0=0.01 device=0 Transferred 355/355 items from pretrained weights Ultralytics 8.3.85 🚀 Python-3.8.8rc1 torch-2.1.0+cu121 CUDA:0 (NVIDIA GeForce GTX 1050 Ti, 4096MiB) engine\trainer: task=detect, mode=train, model=yolov8n.pt, data=datasets/coco128/luosi/luosi.yaml, epochs=20, time=None, patience=100, batch=4, imgsz=640, save=True, save_period=-1, cache=False, device=0, workers=8, project=None, na me=train2, exist_ok=False, pretrained=ultralytics/yolov8n.pt, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False , freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True , show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=None, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_ep ochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs\detect\train2 Overriding model.yaml nc=80 with nc=5 为什么报错
最新发布
04-02
### YOLOv8 训练中的 `nc` 参数覆盖问题 在使用 Ultralytics 提供的预训练权重进行 YOLOv8 的训练时,如果遇到类别数 (`nc`) 不匹配的问题,通常是因为模型加载了预训练权重,默认情况下这些权重适用于特定数量的类别(例如 COCO 数据集的 80 类)。当尝试将其应用于具有不同类别的自定义数据集时,可能会引发错误。 以下是关于如何解决此问题的具体说明: #### 错误原因分析 Ultralytics 预训练权重文件中包含了最终分类层的信息。如果目标数据集的类别数目不同于原始权重所支持的数据集,则会触发冲突。这种冲突表现为无法正确初始化网络的最后一层[^1]。 #### 解决方案 为了克服这一限制,可以采取以下方法之一来调整配置或操作流程: 1. **手动设置 `nc` 参数** 在调用训练脚本之前,在 YAML 文件或者命令行参数里显式指定新的类别总数。这可以通过修改配置文件实现: ```yaml # data.yaml example train: path/to/train/images/ val: path/to/val/images/ nc: 5 # Number of classes (example value, change as needed) names: ['class_1', 'class_2', 'class_3', 'class_4', 'class_5'] ``` 如果未提供该字段,程序可能默认采用旧版权重设定下的数值,从而造成不一致的情况发生[^2]。 2. **禁用预训练权重最后一层加载** 另一种方式是在启动训练过程前通过额外选项告知框架忽略原有检测头部分的迁移学习内容。具体做法如下所示: ```python from ultralytics import YOLO model = YOLO('yolov8n.pt') results = model.train( data='path_to_data/data.yaml', epochs=100, imgsz=640, pretrained=False # Disable loading the last layer's pre-trained weights. ) ``` 这样做能够有效防止因维度差异而导致崩溃现象的发生,同时保留其他各层已有的特征提取能力以便加速收敛速度[^3]。 3. **重新构建最后几层结构** 对于更高级的需求而言,还可以考虑完全替换掉原有的预测模块并随机初始化相应参数。不过这种方法相对复杂一些,仅推荐给熟悉 PyTorch 或 TensorFlow 架构设计原理的研究人员选用。 #### 示例代码片段 下面给出一段简单的 Python 脚本来展示上述第二种解决方案的实际应用情形: ```python from ultralytics import YOLO if __name__ == "__main__": # Load a pretrained model or create new one depending on your needs model = YOLO("yolov8s.pt") # Start Training with custom dataset and disable using previous head layers' params result = model.train(data="custom_dataset.yaml", epochs=50, batch=-1, name="experiment_name", device=[0], workers=8, exist_ok=True, pretrained=False) # Key argument to avoid mismatch issues during initialization phase. ```
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值