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格式的评估结果,如下图:
在这里插入图片描述


在这里插入图片描述

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

<think>嗯,用户遇到了FileNotFoundError,提示找不到yolov12.yaml文件。首先,我需要确认错误信息中的路径是否正确。用户提到的路径是'yolov12-main/ultralytics/cfg/models/v12/yolov12.yaml',可能的问题有几个方面。 首先,检查文件实际存放的位置。用户可能下载了YOLOv12的代码库,但目录结构可能有所不同。比如,有些项目会把模型配置文件放在不同的子目录下,或者用户可能解压文件时路径发生了变化。建议用户使用命令行工具如find或者tree来查找文件是否存在,或者直接在文件管理器中浏览目录结构。 其次,确认当前工作目录是否正确。用户在运行训练脚本时,可能没有切换到正确的项目路径下。引用[2]中提到,训练示例需要先进入yolov12项目所在的路径,所以用户需要检查是否执行了cd命令到正确的目录。如果当前目录不对,相对路径就会出错,导致找不到文件。 另外,可能是文件名或路径拼写错误。比如,目录名是否是v12而不是v12?或者文件名是否有大小写问题?需要仔细核对每一层目录的名称是否正确。有时候,一个字母的大小写错误或者多余的字符都会导致路径错误。 如果确认文件确实不存在,用户可能需要重新下载或克隆项目仓库,确保所有文件都被正确下载。有时候,部分文件可能在下载过程中遗漏,或者仓库的结构有所更新,导致旧路径失效。这时候,查看官方文档或仓库的README文件会有帮助,确认最新的文件结构。 还有可能是用户自定义的模型配置文件没有正确创建。引用[1]提到,在同目录下创建一个用于自己数据集训练的模型文件,比如yolov12-LSKNet.yaml。如果用户修改了配置文件名或路径,但训练命令中没有更新对应的model参数,也会出现找不到文件的错误。需要检查训练命令中的model=参数是否指向了正确的文件路径。 此外,用户的环境配置可能有问题。引用[3]提到在Anaconda环境中运行,如果环境变量没有正确设置,或者符号链接存在问题,也可能导致路径解析错误。确保激活了正确的conda环境,并且路径中的项目目录正确无误。 最后,建议用户使用绝对路径来排除相对路径的问题。例如,在训练命令中指定完整的文件路径,这样可以避免因工作目录不正确导致的路径错误。同时,检查文件权限,确保有读取该文件的权限,虽然这种情况较少见,但也不排除可能性。 总结下来,解决步骤应该是:1. 确认文件是否存在;2. 检查路径拼写和工作目录;3. 重新下载项目或修复文件结构;4. 核对训练命令中的参数;5. 使用绝对路径或修复环境配置。通过这些步骤,用户应该能够定位并解决FileNotFoundError的问题。</think>### 逐步解决方案 #### 1. **确认文件路径存在性** - **操作**: 在终端中逐层检查路径 `yolov12-main/ultralytics/cfg/models/v12/` 是否存在。 ```bash # 逐层检查目录(从外层到内层) ls yolov12-main ls yolov12-main/ultralytics ls yolov12-main/ultralytics/cfg ls yolov12-main/ultralytics/cfg/models ls yolov12-main/ultralytics/cfg/models/v12 ``` - **预期结果**: 如果最终目录中未找到 `yolov12.yaml`,说明文件缺失或路径错误[^1]。 #### 2. **修复路径或文件** - **情况1**: 文件存在但路径拼写错误 - **操作**: 核对路径中的目录名和文件名(例如 `v12` 是否应为 `V12`,或 `yolov12.yaml` 是否拼写错误)。 - **情况2**: 文件缺失 - **操作**: 从官方仓库重新下载配置文件: ```bash # 克隆仓库(假设官方仓库地址正确) git clone https://github.com/ultralytics/yolov12.git # 或手动下载并解压到正确路径 ``` #### 3. **调整训练命令的工作目录** - **问题**: 如果当前工作目录不在 `yolov12-main` 的父目录下,相对路径会失效[^2]。 - **操作**: 确保执行训练命令前切换到项目根目录: ```bash cd /完整路径/yolov12-main # 替换为你的实际路径 yolo detect train data=... model=ultralytics/cfg/models/v12/yolov12.yaml # 使用相对路径 ``` #### 4. **使用绝对路径替代** - **操作**: 在训练命令中直接指定文件的绝对路径: ```bash yolo detect train data=... model=/完整路径/yolov12-main/ultralytics/cfg/models/v12/yolov12.yaml ``` #### 5. **检查环境配置** - **操作**: 确认Anaconda环境已激活且项目文件未损坏[^3]: ```bash conda activate yolov12 # 激活环境 tree yolov12-main/ultralytics/cfg/models # 查看目录结构 ``` --- ### 相关问题 1. 如何修复YOLO训练中的路径权限错误? 2. 如何在Anaconda环境中正确配置YOLOv12的依赖项? 3. YOLOv12模型配置文件需要哪些关键参数? : 引用自站内关于YOLOv12模型配置文件的说明。 : 引用自站内提供的训练示例命令。 : 引用自站内Anaconda环境配置的注释。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿_旭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值