✅ Ultralytics YOLO COCO 评估脚本(pycocotools) | 获得COCO评价指标(小白友好+B 站教程详解)| 2025最新

Ultralytics YOLO COCO评估脚本详解
该文章已生成可运行项目,

✅ YOLO获取COCO指标(2):创建 COCO API 评估脚本(pycocotools) | 发论文必看! | Ultralytics | 小白友好教程

Ultralytics YOLO COCO 评估脚本 (coco_evaluate.py)

这是一个 Python 脚本,用于评估以 COCO JSON 格式提供的目标检测结果。它利用官方的 pycocotools 库来计算标准的 COCO 评估指标。

1. 描述

该脚本接收一个包含真实标注(Ground Truth)的 COCO JSON 文件和一个包含模型预测结果的 COCO 格式 JSON 文件作为输入。然后,它使用 pycocotools API 来执行评估过程,并最终将标准的 12 个 COCO 评估指标(包括 AP、AP50、AP75、AP across scales、AR across max detections、AR across scales 等)打印到控制台。

2. 依赖项

在运行此脚本之前,请确保已安装必要的 Python 库:

  • Python 3.x
  • pycocotools: 这是 COCO 官方提供的 API。
  • numpy: pycocotools 的依赖项。

你可以使用 pip 安装它们:

pip install numpy pycocotools

3. 使用方法

通过命令行运行此脚本。你需要提供标注文件和预测结果文件的路径。

python coco_evaluate.py --annotations <标注文件路径> --predictions <预测文件路径>

参数说明:

  • --annotations: 必需。指向 COCO 格式的 JSON 标注文件的路径(例如 instances_val2017.json)。
  • --predictions: 必需。指向包含模型预测结果的 JSON 文件的路径。此文件必须遵循 COCO 的结果提交格式(一个 JSON 列表,每个元素包含 image_id, category_id, bbox, 和 score)。

示例:

假设你的标注文件位于 data/coco/annotations/instances_val2017.json,预测结果文件位于 runs/detect/exp1/predictions.json,你可以这样运行:

python coco_evaluate.py --annotations data/coco/annotations/instances_val2017.json --predictions runs/detect/exp1/predictions.json

4. 输入文件格式

  1. 标注文件 (--annotations): 标准的 COCO JSON 格式文件,通常包含 info, licenses, images, annotations, categories 等字段。

  2. 预测文件 (--predictions): 一个 JSON 文件,其内容是一个列表(list)。列表中的每个元素是一个字典(dict),代表一个检测到的目标,必须包含以下键:

    • image_id: 对应标注文件中图像的 ID(整数)。
    • category_id: 检测到的目标的类别 ID(整数),必须与标注文件中的类别 ID 对应。
    • bbox: 检测到的边界框,格式为 [x, y, width, height],其中 x, y 是左上角坐标。
    • score: 模型对该检测结果的置信度分数(浮点数)。

    示例 predictions.json 的片段:

    [
      {
        "image_id": 42,
        "category_id": 18,
        "bbox": [258.15, 41.29, 348.26, 243.78],
        "score": 0.997
      },
      {
        "image_id": 73,
        "category_id": 1,
        "bbox": [61.87, 222.53, 410.64, 176.95],
        "score": 0.994
      },
      ...
    ]
    

5. 输出

脚本执行后,会将标准的 COCO 评估结果摘要打印到控制台(标准输出)。输出格式类似于:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.xxx
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.xxx
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.xxx
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.xxx
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.xxx
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.xxx
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.xxx
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.xxx
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.xxx
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.xxx
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.xxx
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.xxx

其中 0.xxx 会被实际计算出的指标值替换。

6. 注意

  • 确保提供的预测文件中的 category_id 与标注文件中的类别 ID 映射一致。
  • 脚本目前只评估 bbox(边界框检测),如果需要评估实例分割 (segm) 或关键点 (keypoints),需要修改 COCOeval 初始化时的 iouType 参数。

7. 完整代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""python coco_evaluate.py  --annotations path\instances_val2017.json  --predictions path\predictions.json"""


import argparse
import json
import os
from pathlib import Path

import numpy as np
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval


def evaluate_coco(pred_json, anno_json):
    """
    使用pycocotools评估COCO格式的检测结果
    
    参数:
        pred_json: 预测结果的JSON文件路径
        anno_json: COCO格式的标注文件路径
    
    返回:
        stats: 评估结果统计
    """
    print(f"\n正在评估 COCO 指标,使用 {pred_json}{anno_json}...")
    
    # 检查文件是否存在
    for x in [pred_json, anno_json]:
        assert os.path.isfile(x), f"文件 {x} 不存在"
    
    # 初始化COCO API
    anno = COCO(str(anno_json))  # 初始化标注API
    pred = anno.loadRes(str(pred_json))  # 初始化预测API (必须传递字符串,而非Path对象)
    
    # 进行bbox评估
    eval_bbox = COCOeval(anno, pred, 'bbox')
    eval_bbox.evaluate()
    eval_bbox.accumulate()
    eval_bbox.summarize()


def main():
    parser = argparse.ArgumentParser(description='评估COCO格式的目标检测结果')
    parser.add_argument('--annotations', type=str, required=True, help='COCO格式的标注文件路径')
    parser.add_argument('--predictions', type=str, required=True, help='预测结果的JSON文件路径')
    args = parser.parse_args()
    
    # 确保文件路径存在
    pred_json = Path(args.predictions)
    anno_json = Path(args.annotations)
    
    # 评估并打印结果
    stats = evaluate_coco(pred_json, anno_json)


if __name__ == '__main__':
    main() 
本文章已经生成可运行项目
<think>嗯,用户想知道YOLO模型评价指标,特别是mAP、precisionrecall这些。首先,我需要回忆一下YOLO模型相关的评估指标。根据提供的引用资料,YOLO常用的指标包括IOU、Precision、Recall、F1-score、AP、mAP等等。这些指标目标检测中非常重要,用来衡量模型的性能。 首先,IOU(交并比)是基础,用来判断预测框真实框的重合程度。用户可能对IOU的计算方式不太清楚,需要解释清楚。比如,IOU的计算公式是两个框的交集面积除以并集面积。当IOU超过某个阈值(比如0.5)时,才认为预测是正确的,这会影响后续的指标计算。 接下来是PrecisionRecall。Precision是查准率,即预测为正的样本中有多少是真实的正确;而Recall是查全率,即真实的正样本中有多少被正确预测出来。这两个指标有时候会有权衡,比如提高阈值可能会提高Precision但降低Recall,反之亦然。根据引用[4],Precision的计算是满足阈值的预测框除以所有预测框,Recall是满足阈值的预测框除以所有的真实标签。这里可能需要具体说明阈值的含义,比如置信度阈值或IOU阈值。 然后是AP(平均精度),这个通常在PR曲线下面积来计算。AP是针对单一类别的,而mAP则是所有类别AP的平均值,用来综合评估模型在所有类别上的表现。根据引用[2],mAP是多个类别准确率的均值。而引用[1]提到,YOLO中常用mAP@0.5或mAP@[0.5:0.95],前者是单一IOU阈值下的mAP,后者是在多个IOU阈值下的平均值,这需要解释清楚。 用户的问题可能还涉及到这些指标的实际应用,比如如何调整参数来优化这些指标。比如引用[4]提到调整置信度阈值会影响PrecisionRecall,进而影响APmAP。这时候可能需要举例说明,比如提高置信度阈值会减少预测框的数量,可能提高Precision但降低Recall。 另外,用户可能对PR曲线的作用不太了解,需要解释PR曲线如何展示模型在不同阈值下的表现,以及如何通过曲线下面积来计算AP。引用[3]指出,分析PR曲线可以帮助优化模型参数或选择模型,这部分可以作为应用场景来介绍。 在整理回答时,需要按照逻辑顺序逐步解释每个指标,确保用户能理解每个概念及其相互关系。可能需要先介绍IOU,再讲PrecisionRecall,接着是APmAP,最后讨论这些指标的应用调整方法。同时,结合引用中的具体例子,比如YOLO中常用的mAP@0.5,让回答更具体。 还需要注意用户可能的深层需求,比如他们可能在模型调优或结果分析中遇到问题,需要这些指标来诊断模型的表现。因此,在回答中可以提到如何根据这些指标调整模型参数,比如修改置信度阈值或IOU阈值,以及这些调整对结果的影响。 最后,生成的相关问题需要覆盖用户可能进一步想了解的内容,比如不同IOU阈值的影响、如何提高mAP、PR曲线的应用等,这样可以引导用户深入学习解决问题。</think>### YOLO模型评价指标解析 #### 1. **IOU(交并比)** IOU(Intersection over Union)用于衡量预测框与真实标注框的重叠程度,计算公式为: $$ \text{IOU} = \frac{\text{预测框} \cap \text{真实框}}{\text{预测框} \cup \text{真实框}} $$ - 若IOU ≥ 阈值(如0.5),则认为预测框正确。YOLO中常用`mAP@0.5`表示以IOU=0.5为阈值时的平均精度均值[^1]。 --- #### 2. **Precision(查准率)与Recall(查全率)** - **Precision**:正确预测的正样本占所有预测正样本的比例。 $$ \text{Precision} = \frac{\text{TP}}{\text{TP + FP}} $$ - **Recall**:正确预测的正样本占所有真实正样本的比例。 $$ \text{Recall} = \frac{\text{TP}}{\text{TP + FN}} $$ 其中,TP(True Positive)为预测正确的正样本,FP(False Positive)为误检,FN(False Negative)为漏检。 > 通过调整置信度阈值可平衡两者:阈值越高,Precision↑但Recall↓;反之则Precision↓且Recall↑[^4]。 --- #### 3. **AP(平均精度)与mAP(平均精度均值)** - **AP(Average Precision)**:针对单一类别,计算Precision-Recall曲线下面积。 - **mAP(mean Average Precision)**:所有类别AP的平均值,综合评估模型性能[^2]。 YOLO中常用两种形式: - `mAP@0.5`:IOU阈值为0.5时的mAP。 - `mAP@[0.5:0.95]`:IOU阈值从0.5到0.95(步长0.05)的平均mAP,要求更严格。 --- #### 4. **F1-score** 综合PrecisionRecall的调平均数: $$ \text{F1} = \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} $$ 用于平衡查准与查全的权衡[^3]。 --- #### 5. **应用与优化** - **优化方向**:通过调整置信度阈值或模型参数(如NMS阈值)优化Precision/Recall。 - **分析工具**:PR曲线直观展示模型性能,曲线越靠近右上角表示性能越好[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只云卷云舒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值