目标检测笔记(五):查看通过COCOEvaluator生成的coco_instances_results.json文件的详细检测信息,包含AP、AR、MR和DR等

简介: 本文介绍了如何使用COCO评估器通过Detectron2库对目标检测模型进行性能评估,生成coco_instances_results.json文件,并利用pycocotools解析该文件以计算AP、AR、MR和DR等关键指标。

COCO评估器

COCO(Common Objects in Context)是一个被广泛使用的计算机视觉领域的数据集,其中包含了多个场景、多种对象以及不同光照和背景下的图像。COCO数据集中的每一张图片都标注了物体的类别、位置和大小等信息,这些信息可以用于训练和评估目标检测、语义分割等计算机视觉任务的模型。

COCO数据集中的图片和标注信息可以被用于训练和评估机器学习算法,但是为了保证算法的准确性,我们需要一个评估指标来量化算法的性能。COCO评估器(COCOEvaluator)就是一个用于计算目标检测和语义分割等算法性能的工具。它工作原理是将机器生成的结果与真实的标注信息进行比较,从而计算出各种指标,如精确度(precision)、召回率(recall)等,以评估算法的性能表现。

COCOEvaluator不仅可以计算单个类别的指标,还可以计算多个类别的指标,为算法的优化提供方向。此外,COCOEvaluator还可以根据不同的评估要求,如IoU(Intersection over Union)匹配、边框等,灵活地评估算法的性能。

验证集测试

首先注册数据集
mydata.py

from detectron2.data.datasets import register_coco_instances
register_coco_instances("MY_train", {}, "./dataSet/train.json", "./dataSet/images/train")
register_coco_instances("MY_test", {}, "./dataSet/test.json", "./dataSet/images/test")

然后通过import mydata导入注册的数据集,通过指定cfg和weights的文件,然后运行这个验证集测试代码即可生成对应的coco_instances_results.json


import mydata
from detectron2.config import get_cfg
import os
from detectron2.engine.defaults import DefaultPredictor
from detectron2.evaluation import COCOEvaluator, inference_on_dataset
from detectron2.data import build_detection_test_loader


DATASET_STR = "MY_test"

def get_max_path(output_dir_base):
    # 获取文件夹的文件数
    file_count = len(os.listdir(output_dir_base))
    return file_count+1

if __name__ == "__main__":
    save_path_root = "../output/val"
    os.makedirs(save_path_root, exist_ok=True)
    max_dir_num = get_max_path(save_path_root)

    cfg = get_cfg()
    # cfg.merge_from_file(
    #     r"../cfg/mask_rcnn_R_50_FPN_3x.yaml"
    # )
    # cfg.MODEL.WEIGHTS = "../output/train/1/model_final.pth"
    cfg.merge_from_file(
        r"../cfg/faster_rcnn_R_101_FPN_3x.yaml"
    )
    cfg.MODEL.WEIGHTS = "../weights/model_final.pth"

    print('loading from: {}'.format(cfg.MODEL.WEIGHTS))
    cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7   # set the testing threshold for this model
    cfg.MODEL.ROI_HEADS.NUM_CLASSES = 4
    cfg.DATASETS.TEST = (DATASET_STR, )
    predictor = DefaultPredictor(cfg)
    cfg.OUTPUT_DIR = os.path.join(save_path_root, str(max_dir_num)) # 将output放在主目录下,每次验证都会往后创建新的文件夹来保存训练好的信息。
    print("保存文件的路径:{}".format(cfg.OUTPUT_DIR))
    evaluator = COCOEvaluator(DATASET_STR, cfg, False, output_dir=cfg.OUTPUT_DIR)
    val_loader = build_detection_test_loader(cfg, DATASET_STR)
    print(inference_on_dataset(predictor.model, val_loader, evaluator))

这时候我们若想要通过这个json文件来得到我们的检测指标,各类AP和AR指标以及MR(错误率)和DR(检测率),就可以通过下面这个代码(只需要指定COCO数据集的标签json文件(和验证的代码一样的json文件),然后再指定coco_instances_results.json的路径即可。

from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
import json, os

# 加载coco_instances_results.json文件中的预测结果
root = "../output/val/8/" # 这里修改为你得到的val文件路径
ins_path = os.path.join(root, 'coco_instances_results.json') # 对应的coco_instance的名称
ins_path_S = ins_path.split("/")
print(ins_path)
with open(ins_path, 'r') as f:
    results = json.load(f)

# 加载COCO数据集的注释文件
annFile = 'dataSet/test.json' # 这里加载你的验证集的json数据集
cocoGt = COCO(annFile)

# 加载预测结果到COCO格式中
cocoDt = cocoGt.loadRes(results)

# 初始化COCO评估器
cocoEval = COCOeval(cocoGt, cocoDt, 'bbox')

# 运行评估计算AP
cocoEval.evaluate()
cocoEval.accumulate()
cocoEval.summarize()

# 输出平均精度(AP)
print("Average Precision (AP): {:.2f}".format(cocoEval.stats[0]))
# 输出漏检率和检测率指标
print("Miss Rate (MR): {:.2f}".format(1 - cocoEval.stats[8]/cocoEval.stats[2]))
print("Detection Rate (DR): {:.2f}".format(cocoEval.stats[8]/cocoEval.stats[2]))
# 将输出结果保存到txt文件中
with open('{}/COCO_AP_MR_DR_AR.txt'.format(root), 'w') as f:
    f.write("Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[0]))
    f.write("Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[1]))
    f.write("Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[2]))
    f.write("Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[3]))
    f.write("Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[4]))
    f.write("Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[5]))
    f.write("\n")
    f.write("Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = {:.3f}\n".format(cocoEval.stats[6]))
    f.write("Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = {:.3f}\n".format(cocoEval.stats[7]))
    f.write("Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[8]))
    f.write("Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[9]))
    f.write("Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[10]))
    f.write("Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = {:.3f}\n".format(cocoEval.stats[11]))
    f.write("\n")
    f.write("Miss Rate (MR): {:.2f}\n".format(1 - cocoEval.stats[8]/cocoEval.stats[2]))
    f.write("Detection Rate (DR): {:.2f}\n".format(cocoEval.stats[8]/cocoEval.stats[2]))

print("AP、MR、DR和AR指标已保存到{}/COCO_AP_MR_DR_AR.txt文件中。".format(root))

运行之后即可在coco_instances_results.json的当前路径生成对应的txt文件。
在这里插入图片描述

目录
相关文章
|
2月前
|
XML JSON API
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。
|
4月前
|
开发工具 git 索引
怎么取消对project.private.config.json这个文件的git记录
通过以上步骤,您可以成功取消对 `project.private.config.json`文件的Git记录。这样,文件将不会被包含在未来的提交中,同时仍保留在您的工作区中。
114 28
|
8月前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
141 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
7月前
|
存储 JSON 监控
公司用什么软件监控电脑:JSON 在监控信息交互中的应用探索
在现代企业管理中,电脑监控软件广泛应用于保障信息安全和提升工作效率。JSON(JavaScript Object Notation)因其简洁和易读性,在监控信息的收集、传输和处理中扮演着关键角色。本文介绍了 JSON 在监控数据结构、信息传输及服务器端处理中的具体应用,展示了其在高效监控系统中的重要性。
75 0
|
8月前
|
JSON 数据格式 计算机视觉
Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)
本文介绍了如何使用OpenCV和Python根据JSON标注文件获取并绘制目标区域,同时可将裁剪的图像单独保存。通过示例代码,展示了如何读取图片路径、解析JSON标注、绘制标注框并保存裁剪图像的过程。此外,还提供了相关的博客链接,供读者进一步学习。
200 0
|
1月前
|
SQL JSON 数据格式
SPL 处理多层 JSON 数据比 DuckDB 方便多了
esProc SPL 处理多层 JSON 数据比 DuckDB 更便捷,尤其在保留 JSON 层次与复杂计算时优势明显。DuckDB 虽能通过 `read_json_auto()` 将 JSON 解析为表格结构,但面对深层次或复杂运算时,SQL 需频繁使用 UNNEST、子查询等结构,逻辑易变得繁琐。而 SPL 以集合运算方式直接处理子表,代码更简洁直观,无需复杂关联或 Lambda 语法,同时保持 JSON 原始结构。esProc SPL 开源免费,适合复杂 JSON 场景,欢迎至乾学院探索!
|
3月前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
3月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult<T>`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码"0"和消息"操作成功!",有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
191 0
|
3月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 "",Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
85 0
|
3月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
225 0