YOLOv8-v12的评估指标转为COCO指标详细过程【附源码】

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发8.【基于深度学习的行人跌倒检测系统
9.【基于深度学习的PCB板缺陷检测系统10.【基于深度学习的生活垃圾分类目标检测系统
11.【基于深度学习的安全帽目标检测系统12.【基于深度学习的120种犬类检测与识别系统
13.【基于深度学习的路面坑洞检测系统14.【基于深度学习的火焰烟雾检测系统
15.【基于深度学习的钢材表面缺陷检测系统16.【基于深度学习的舰船目标分类检测系统
17.【基于深度学习的西红柿成熟度检测系统18.【基于深度学习的血细胞检测与计数系统
19.【基于深度学习的吸烟/抽烟行为检测系统20.【基于深度学习的水稻害虫检测与识别系统
21.【基于深度学习的高精度车辆行人检测与计数系统22.【基于深度学习的路面标志线检测与识别系统
23.【基于深度学习的智能小麦害虫检测识别系统24.【基于深度学习的智能玉米害虫检测识别系统
25.【基于深度学习的200种鸟类智能检测与识别系统26.【基于深度学习的45种交通标志智能检测与识别系统
27.【基于深度学习的人脸面部表情识别系统28.【基于深度学习的苹果叶片病害智能诊断系统
29.【基于深度学习的智能肺炎诊断系统30.【基于深度学习的葡萄簇目标检测系统
31.【基于深度学习的100种中草药智能识别系统32.【基于深度学习的102种花卉智能识别系统
33.【基于深度学习的100种蝴蝶智能识别系统34.【基于深度学习的水稻叶片病害智能诊断系统
35.【基于与ByteTrack的车辆行人多目标检测与追踪系统36.【基于深度学习的智能草莓病害检测与分割系统
37.【基于深度学习的复杂场景下船舶目标检测系统38.【基于深度学习的农作物幼苗与杂草检测系统
39.【基于深度学习的智能道路裂缝检测与分析系统40.【基于深度学习的葡萄病害智能诊断与防治系统
41.【基于深度学习的遥感地理空间物体检测系统42.【基于深度学习的无人机视角地面物体检测系统
43.【基于深度学习的木薯病害智能诊断与防治系统44.【基于深度学习的野外火焰烟雾检测系统
45.【基于深度学习的脑肿瘤智能检测系统46.【基于深度学习的玉米叶片病害智能诊断与防治系统
47.【基于深度学习的橙子病害智能诊断与防治系统48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统66.【基于深度学习的安检X光危险品检测与识别系统
67.【基于深度学习的农作物类别检测与识别系统68.【基于深度学习的危险驾驶行为检测识别系统
69.【基于深度学习的维修工具检测识别系统70.【基于深度学习的维修工具检测识别系统
71.【基于深度学习的建筑墙面损伤检测系统72.【基于深度学习的煤矿传送带异物检测系统
73.【基于深度学习的老鼠智能检测系统74.【基于深度学习的水面垃圾智能检测识别系统
75.【基于深度学习的遥感视角船只智能检测系统76.【基于深度学习的胃肠道息肉智能检测分割与诊断系统
77.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统78.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统
79.【基于深度学习的果园苹果检测与计数系统80.【基于深度学习的半导体芯片缺陷检测系统
81.【基于深度学习的糖尿病视网膜病变检测与诊断系统82.【基于深度学习的运动鞋品牌检测与识别系统
83.【基于深度学习的苹果叶片病害检测识别系统84.【基于深度学习的医学X光骨折检测与语音提示系统
85.【基于深度学习的遥感视角农田检测与分割系统86.【基于深度学习的运动品牌LOGO检测与识别系统
87.【基于深度学习的电瓶车进电梯检测与语音提示系统88.【基于深度学习的遥感视角地面房屋建筑检测分割与分析系统
89.【基于深度学习的医学CT图像肺结节智能检测与语音提示系统90.【基于深度学习的舌苔舌象检测识别与诊断系统
91.【基于深度学习的蛀牙智能检测与语音提示系统92.【基于深度学习的皮肤癌智能检测与语音提示系统

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

引言

在学术界与工业界,COCO指标因其标准化和多粒度评价能力​(如小目标检测AP_s、中等目标AP_m等)被广泛采纳为通用基准。文本将详细介绍如何将YOLO模型在验证集上的评估结果转成COCO格式评估结果的详细过程与步骤。
YOLO原始评估结果如下:
在这里插入图片描述

转换COCO格式评估结果如下:
在这里插入图片描述

1.YOLO转换COCO格式标签

首先我们需要将有原始验证集中的YOLO格式标签文件转为COCO需要的Json格式标签文件,转换代码如下:

# --coding:utf-8--
# 声明文件编码为utf-8

import os  # 导入os模块,用于操作文件和目录
import cv2  # 导入OpenCV库,用于图像处理
import json  # 导入json模块,用于处理JSON格式数据
from tqdm import tqdm  # 导入tqdm模块,用于显示进度条
import argparse  # 导入argparse模块,用于解析命令行参数

classes = ['Pothole']  # 定义类别列表,当前只有一个类别:'Pothole'

# 创建ArgumentParser对象,用于解析命令行参数
parser = argparse.ArgumentParser()
parser.add_argument('--image_path', default='datasets/PotholeData/val/images', type=str, help="path of images")  # 图片路径,默认值为'datasets/PotholeData/val/images'
parser.add_argument('--label_path', default='datasets/PotholeData/val/labels', type=str, help="path of labels .txt")  # 标签路径,默认值为'datasets/PotholeData/val/labels'
parser.add_argument('--save_path', type=str, default='datasets/PotholeData/val/val.json', help="if not split the dataset, give a path to a json file")  # 保存路径,默认值为'datasets/PotholeData/val/val.json'
arg = parser.parse_args()  # 解析命令行参数

def yolo2coco(arg):
    print("Loading data from ", arg.image_path, arg.label_path)  # 打印加载数据的路径信息

    # 确保图片路径和标签路径存在
    assert os.path.exists(arg.image_path), f"Image path {arg.image_path} does not exist"
    assert os.path.exists(arg.label_path), f"Label path {arg.label_path} does not exist"

    originImagesDir = arg.image_path  # 图片路径
    originLabelsDir = arg.label_path  # 标签路径

    # 获取图片目录下的所有文件名
    indexes = os.listdir(originImagesDir)

    # 初始化COCO格式的数据结构
    dataset = {'categories': [], 'annotations': [], 'images': []}

    # 添加类别信息到COCO格式中
    for i, cls in enumerate(classes, 0):
        dataset['categories'].append({'id': i, 'name': cls, 'supercategory': 'mark'})

    ann_id_cnt = 0  # 初始化标注ID计数器

    # 遍历图片目录中的每个文件
    for k, index in enumerate(tqdm(indexes)):
        txtFile = f'{index[:index.rfind(".")]}.txt'  # 获取对应的标签文件名
        stem = index[:index.rfind(".")]  # 获取文件名(不带扩展名)

        try:
            im = cv2.imread(os.path.join(originImagesDir, index))  # 读取图片
            height, width, _ = im.shape  # 获取图片的高度、宽度
        except Exception as e:
            print(f'{os.path.join(originImagesDir, index)} read error.\nerror:{e}')  # 如果读取失败,打印错误信息
            continue  # 跳过该图片

        # 如果没有对应的标签文件,则跳过
        if not os.path.exists(os.path.join(originLabelsDir, txtFile)):
            continue

        # 添加图片信息到COCO格式中
        dataset['images'].append({
            'file_name': index,
            'id': stem,
            'width': width,
            'height': height
        })

        # 读取标签文件内容
        with open(os.path.join(originLabelsDir, txtFile), 'r') as fr:
            labelList = fr.readlines()  # 按行读取标签内容

        # 遍历标签文件中的每一行
        for label in labelList:
            label = label.strip().split()  # 去除空格并分割字段
            x = float(label[1])  # 归一化中心点x坐标
            y = float(label[2])  # 归一化中心点y坐标
            w = float(label[3])  # 归一化宽度
            h = float(label[4])  # 归一化高度

            # 将YOLO格式的(x, y, w, h)转换为COCO格式的(x1, y1, x2, y2)
            H, W, _ = im.shape
            x1 = (x - w / 2) * W
            y1 = (y - h / 2) * H
            x2 = (x + w / 2) * W
            y2 = (y + h / 2) * H

            # 计算实际的宽度和高度
            width = max(0, x2 - x1)
            height = max(0, y2 - y1)

            # 添加标注信息到COCO格式中
            dataset['annotations'].append({
                'area': width * height,  # 目标区域面积
                'bbox': [x1, y1, width, height],  # 边界框坐标
                'category_id': int(label[0]),  # 类别ID
                'id': ann_id_cnt,  # 标注ID
                'image_id': stem,  # 图片ID
                'iscrowd': 0,  # 是否为人群目标
                'segmentation': [[x1, y1, x2, y1, x2, y2, x1, y2]]  # 分割信息(矩形顶点)
            })
            ann_id_cnt += 1  # 更新标注ID计数器

    # 将COCO格式的数据保存为JSON文件
    with open(arg.save_path, 'w') as f:
        json.dump(dataset, f)
        print('Save annotation to {}'.format(arg.save_path))

if __name__ == "__main__":
    yolo2coco(arg)  # 主程序入口,调用yolo2coco函数

修改一下上述代码中的类别信息classes = ['Pothole'],原始验证集的图片与标签路径,保存后的json文件路径。

parser.add_argument('--image_path', default='datasets/PotholeData/val/images', type=str, help="path of images")  
parser.add_argument('--label_path', default='datasets/PotholeData/val/labels', type=str, help="path of labels .txt") 
parser.add_argument('--save_path', type=str, default='datasets/PotholeData/val/val.json', help="if not split the dataset, give a path to a json file") 

然后运行该代码,就可以生成coco格式的json标签文件。
在这里插入图片描述

2.生成YOLO评估结果

运行以下命令,将YOLO的评估结果保存为Json格式文件:

from ultralytics import YOLO
import matplotlib
matplotlib.use('TkAgg')

if __name__ == '__main__':
    model = YOLO('models/best.pt')
    model.val(data='datasets/PotholeData/data.yaml',
              split='val',
              save_json=True,
              project='modelval'
              )

运行代码后,会在modelval/val的目录下生成predictions.json文件,用于存储模型在验证集上预测的结果信息。

在这里插入图片描述

3. 生成COCO评估结果

有了上述原始标签的val.json与预测结果信息的predictions.json标签文件之后,我们就可以使用pycocotools生成COCO格式的评估结果,代码如下:

注:运行前需安装pycocotools库,命令:pip install pycocotools

import argparse
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval


def parse_opt():
    parser = argparse.ArgumentParser()
    parser.add_argument('--anno_json', type=str, default='datasets/PotholeData/val/val.json', help='training model path')
    parser.add_argument('--pred_json', type=str, default='modelval/val/predictions.json', help='data yaml path')
    return parser.parse_known_args()[0]


if __name__ == '__main__':
    opt = parse_opt()
    anno_json = opt.anno_json
    pred_json = opt.pred_json
    anno = COCO(anno_json)  # 初始化标注的json文件
    pred = anno.loadRes(pred_json)  # 初始化预测的json文件
    eval = COCOeval(anno, pred, 'bbox')
    eval.evaluate()
    eval.accumulate()
    eval.summarize()

我们只需要将上述代码中的原始标签val.json文件路径与预测结果的predictions.json修改为你自己的路径,然后运行程序即可得到COCO格式的评估结果,如下图:
在这里插入图片描述


在这里插入图片描述

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值