YOLOv8添加输出各类别训练过程指标

场景:当前YOLOv8训练过程中输出的是针对所有类别的各项指标,具体数据保存在 results.csv 这个文件中。有时候,我们想要得到具体类别训练过程中的指标情况,此时就没有办法了,使用val.py 也只是输出最终的一个各类指标,无法得到训练过程的指标数据,针对这一需求,进行修改,最终可以得到每一类各项指标的一个csv文件,方便后续作图和实验对比

具体修改后效果如下:

各个类别训练过程的指标被保存到相应的result_xxx.csv 文件中

版本环境

YOLOv8 8月份版本,最新版本在测

修改

trainer.py

1 添加一个 save_metrics_per_class 函数,放到save_metrics函数后面

def save_metrics_per_class(self, box):

    """Saves training metrics per class to a CSV file."""

    # ap ap50 p r 提示作用
    keys = ['ap', 'ap50', 'p', 'r']
    n = 4 + 1  # number of cols

    for i in box.ap_class_index:
        cur_class = self.model.names[box.ap_class_index[i]]
        save_path = self.save_dir.joinpath("result_" + cur_class + ".csv")
        vals = [box.ap[i], box.ap50[i], box.p[i], box.r[i]]
        s = '' if save_path.exists() else (('%23s,' * n % tuple(['epoch'] + keys)).rstrip(',') + '\n')  # header

        with open(save_path, 'a') as f:
            f.write(s + ('%23.5g,' * n % tuple([self.epoch] + vals)).rstrip(',') + '\n')

2 validate函数修改

def validate(self):
    """
        Runs validation on test set using self.validator. The returned dict is expected to contain "fitness" key.
        """
    # metrics = self.validator(self) 原始版本
    metrics, box = self.validator(self)
    fitness = metrics.pop('fitness', -self.loss.detach().cpu().numpy())  # use loss as fitness measure if not found
    if not self.best_fitness or self.best_fitness < fitness:
        self.best_fitness = fitness
    # return metrics, fitness 原始版本
    return metrics, fitness, box

找到

if self.args.val or final_epoch:
    self.metrics, self.fitness = self.validate()

修改为

if self.args.val or final_epoch:
    self.metrics, self.fitness, box = self.validate()

validator.py

找到 stats = self.get_stats()

改为 stats,box = self.get_stats()

找到 return {k: round(float(v), 5) for k, v in results.items()}

改为 return {k: round(float(v), 5) for k, v in results.items()}, box

val.py

get_stats()

找到 return self.metrics.results_dict

改为 return self.metrics.results_dict,self.metrics.box

save_metrics_per_class 函数

image-20231114191804472

可以看到支持的指标有 all_ap (可用来计算其他ap指标),ap,ap50,f1,p,r

我在函数中使用的是 ap,ap50,p,r

注意:添加指标,使用的是 . 而不是 [“xxxx”] 如 box.ap[i] 而不是 box[‘ap’][i]

def save_metrics_per_class(self, box):

    """Saves training metrics per class to a CSV file."""

    # ap ap50 p r 提示作用
    keys = ['ap', 'ap50', 'p', 'r']
    n = 4 + 1  # number of cols

    for i in box.ap_class_index:
        cur_class = self.model.names[box.ap_class_index[i]]
        save_path = self.save_dir.joinpath("result_" + cur_class + ".csv")
        vals = [box.ap[i], box.ap50[i], box.p[i], box.r[i]]
        s = '' if save_path.exists() else (('%23s,' * n % tuple(['epoch'] + keys)).rstrip(',') + '\n')  # header

        with open(save_path, 'a') as f:
            f.write(s + ('%23.5g,' * n % tuple([self.epoch] + vals)).rstrip(',') + '\n')

最后

在 trainer.py 找到
self.save_metrics(metrics={**self.label_loss_items(self.tloss), **self.metrics, **self.lr})
在后面添加调用

self.save_metrics_per_class(box)

即可

其他

增加训练过程各类指标打印(可选,默认开启是有条件的)

val.py 找到 print_results() 函数 在

LOGGER.info(pf % (‘all’, self.seen, self.nt_per_class.sum(), *self.metrics.mean_results())) 后面

添加

for i, c in enumerate(self.metrics.ap_class_index):
    LOGGER.info(pf % (self.names[c], self.seen, self.nt_per_class[c], *self.metrics.class_result(i)))

有问题,欢迎留言、进群讨论或私聊:【群号:392784757】

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于图像分类任务,YOLOv8(You Only Look Once v8)并不是一个常用的模型,它更多地被用于目标检测任务。YOLOv8YOLO系列模型的最新版本,它采用了一种基于单阶段检测的方法,能够实现实时目标检测。 如果你要进行图像分类训练,可以考虑使用其他经典的模型,如ResNet、VGG、Inception等。这些模型在图像分类任务上表现出色,并且有很多预训练模型可供使用。 对于使用YOLOv8进行目标检测的训练,你需要先准备训练数据集,包括标注好的图像和对应的类别标签。然后,你需要根据数据集的情况进行模型配置和参数设置。YOLOv8的代码实现可以参考开源项目Darknet或YOLOv5。 具体的训练流程可以分为以下几个步骤: 1. 数据准备:包括图像收集、标注和划分训练集与验证集。 2. 模型配置:根据数据集的类别数目、图像尺寸等参数,配置YOLOv8网络结构。 3. 权重初始化:可以使用预训练模型的权重进行初始化,或者从头开始训练。 4. 训练:使用训练数据集进行模型训练,通过迭代优化网络权重。 5. 模型评估:使用验证集评估模型的性能,如计算精度、召回率等指标。 6. 模型调优:根据评估结果进行模型调优,如调整超参数、数据增强等。 7. 模型保存与部署:保存训练好的模型权重,并根据需要进行模型部署和推理。 需要注意的是,YOLOv8是一个相对复杂的模型,训练过程可能需要较长时间和大量计算资源。在开始训练之前,建议先了解相关的深度学习知识,并确保有足够的数据和计算资源支持训练过程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值