在 Ultralytics YOLOv5 中的测试数据集上运行验证 (val.py) 时如何显示损失?

问题描述 投票:0回答:1

我想展示当我使用

val.py
在我的测试数据集上评估模型时它的分类和定位损失。但是,val.py 似乎仅显示对象检测指标。有解决方法吗?

基本上,我想显示训练期间的损失,如下面的代码片段所示:

enter image description here

将 val.py 运行到测试数据集时的输出,如下所示:

enter image description here

任何帮助将不胜感激。

object-detection yolov5
1个回答
0
投票

我想这可能适合你 final result

在 val.py 上,有以下几行可以获取已写入的损失[我从 ultralytics 获得的 git 版本上的第 212-214 行]:

    if compute_loss:
        loss += compute_loss(train_out, targets)[1]  # box, obj, cls

但是,计算损失必须在批次的 for 循环之前初始化。为此,从

ComputeLoss
文件导入
utils.py
并将
model.model
作为参数传递。之所以如此,是因为在
val.py
模型中是一个分布式对象,如果不这样做就会引发错误。我修改了原始文件的第 191-198 行,即定义进度条的行。我添加了
compute_loss
初始化和进度条的损失

s = ('%22s' + '%11s' * 9) % ('Class', 'Images', 'Instances', 'P', 'R', 'mAP50', 'mAP50-95','box_loss','obj_loss','class_loss')
tp, fp, p, r, f1, mp, mr, map50, ap50, map = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
dt = Profile(), Profile(), Profile()  # profiling times
loss = torch.zeros(3, device=device)
jdict, stats, ap, ap_class = [], [], [], []
callbacks.run('on_val_start')
pbar = tqdm(dataloader, desc=s, bar_format='{l_bar}{bar:10}{r_bar}{bar:-10b}')  # progress bar

compute_loss = ComputeLoss(model.model)

for batch_i, (im, targets, paths, shapes) in enumerate(pbar):

现在,对于可变损失,您可以得到每批次累计的 3 个损失。 当 for 循环结束时,我在打印结果之前添加了 get loss 行 [原始文件的 281-285]:

# Get Loss
box_loss = loss.cpu().numpy()[0]*batch_size/len(dataloader)
obj_loss = loss.cpu().numpy()[1]*batch_size/len(dataloader)
cls_loss = loss.cpu().numpy()[2]*batch_size/len(dataloader)

# Print results
pf = '%22s' + '%11i' * 2 + '%11.3g' * 7  # print format
LOGGER.info(pf % ('all', seen, nt.sum(), mp, mr, map50, map, box_loss, obj_loss, cls_loss))
if nt.sum() == 0:
    LOGGER.warning(f'WARNING: no labels found in {task} set, can not compute metrics without labels ⚠️')

我乘以批量大小并除以数据加载器长度,得到每张图像的平均损失,因为损失项是整个数据集处理过程中累积的总损失。

希望它也适合你。

© www.soinside.com 2019 - 2024. All rights reserved.