You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ultralytics YOLOv5的val.py测试时显示损失值?

解决val.py评估时展示分类与定位损失的方法

要让val.py在评估时输出分类损失和定位损失,核心是在验证流程中加入损失计算逻辑,并在最后输出统计结果。以下是针对主流目标检测框架(如YOLO系列)的具体修改步骤:

1. 定位val.py中的验证循环

找到val.py中遍历验证数据集的代码块,通常是类似for batch in dataloader:的循环结构,这是添加损失计算的核心位置。

2. 启用损失计算逻辑

默认情况下,val.py中模型处于eval()模式,部分模型在该模式下不会输出损失值。你需要:

  • 暂时将模型切换到train()模式(若模型仅在训练模式下返回损失)
  • 确保前向传播时传入真实标签,让模型计算损失

以YOLOv8为例,修改验证循环内的代码:

# 初始化损失累加变量
total_cls_loss = 0.0
total_box_loss = 0.0
total_batches = 0

for batch in dataloader:
    # 切换到训练模式以计算损失
    model.train()
    # 传入图片、标签,获取损失和预测结果
    loss, results = model(batch['img'], batch['batch_idx'], batch['cls'], batch['bbox'])
    # 切回评估模式,保证后续指标计算的准确性
    model.eval()
    
    # 累加损失值
    total_cls_loss += loss[0].item()  # 假设loss第一个元素为分类损失
    total_box_loss += loss[1].item()  # 假设loss第二个元素为定位损失
    total_batches += 1
    
    # 原有验证逻辑(如计算mAP等)保持不变
    ...

3. 计算并输出平均损失

在验证循环结束后,计算所有batch的平均损失,并在检测指标后打印:

# 计算平均损失
avg_cls_loss = total_cls_loss / total_batches
avg_box_loss = total_box_loss / total_batches

# 输出损失结果
print(f'\nAverage Classification Loss: {avg_cls_loss:.4f}')
print(f'Average Box Loss: {avg_box_loss:.4f}')

4. 特殊情况处理(模型不返回损失)

如果模型在train()模式下仍不直接返回损失,可手动计算:

import torch.nn.functional as F
from utils.general import bbox_iou

for batch in dataloader:
    results = model(batch['img'])
    pred_cls = results.pred[:, 5:]  # 预测类别分数
    true_cls = batch['cls']  # 真实类别标签
    cls_loss = F.cross_entropy(pred_cls, true_cls)
    
    pred_boxes = results.pred[:, :4]  # 预测框
    true_boxes = batch['bbox']  # 真实框
    box_loss = 1 - bbox_iou(pred_boxes, true_boxes, CIoU=True).mean()  # CIoU损失
    
    # 累加损失
    total_cls_loss += cls_loss.item()
    total_box_loss += box_loss.item()
    total_batches += 1

内容的提问来源于stack exchange,提问作者FjV_Atabay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:42:13