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文件。