我已经在大约10个类上训练了来自Tensorflow Object Detection APIfaster_rcnn_inception_resnet_v2_atrous_coco
的对象检测模型。当我运行model_main.py
文件来评估模型时,它似乎只给出了所有 10 个类的平均平均精度 (AP( 和平均召回率 (AR(,如下所示:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.331
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.479
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.395
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.600
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.407
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.333
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.358
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.544
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.548
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.600
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.545
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.551
但是,如果我想只评估 1 个特定类的性能,而不是所有 30 个检测到的类,我该怎么办?
在检测后添加以下代码以过滤感兴趣的对象 -
objectOfInterest = 1 # Interested object class number as per label file
box = np.asarray(boxes)
cls = np.asarray(classes).astype(np.int32)
scr = np.asarray(scores)
bl = (cls == objectOfInterest)
classes = np.extract(boolar,cls)
scores = np.extract(boolar,scr)
boxes = np.extract(boolar,box)
迟到总比没有好 - 来自这篇文章
1. 使用不同的评估配置
只需将模型的*.config
文件中的metrics_set
值更改为"pascal_voc_detection_metrics"
。
TensorFlow Object Detection API 支持各种评估指标,详见此处的文档。PASCAL VOC 2010 检测指标为每个类别提供 AP 分数。
2. 编辑 pycotools 包中的cocoeval.py
文件
此方法涉及将 8 行代码粘贴到cocoeval.py
文件中。这篇文章对此进行了很好的解释和记录。