如何通过TensorFlow目标检测API获取预训练模型准确率与混淆矩阵
TensorFlow目标检测API计算准确率、生成混淆矩阵方案
官方自带的评估脚本默认只会输出COCO标准的AP/AR指标,不会直接给准确率和混淆矩阵——毕竟目标检测是定位+分类的联合任务,没有分类任务那种开箱即用的全局准确率定义,得自己写个小脚本跑验证集统计,步骤很简单:
前置说明
你现在用的评估命令调用的是官方model_main_tf2.py脚本,输出的AP/AR是目标检测领域的通用指标,其中你这个结果里AP@IoU=0.5 = 1.0已经说明在0.5的IoU阈值下,模型的车牌检测几乎没有错检、漏检,mAP偏低是高IoU阈值下框的定位精度不够拉低了平均值。
要统计准确率和混淆矩阵,首先要固定匹配规则:预测框和真实框的IoU超过设定阈值(车牌场景选0.5即可)才算定位有效,之后再统计分类匹配情况。
具体实现步骤
- 第一步:加载训练好的模型
用TF目标检测API自带的工具加载配置和训练好的权重,参考代码:import tensorflow as tf from object_detection.builders import model_builder from object_detection.utils import config_util, label_map_util # 加载模型配置 configs = config_util.get_configs_from_pipeline_file("你的pipeline_config.config文件路径") detection_model = model_builder.build(model_config=configs["model"], is_training=False) # 加载训练好的 checkpoint ckpt = tf.compat.v2.train.Checkpoint(model=detection_model) ckpt.restore("你的checkpoint目录下最新的ckpt文件路径").expect_partial() # 加载类别映射 category_index = label_map_util.create_category_index_from_labelmap("你的label_map.pbtxt路径", use_display_name=True) - 第二步:遍历验证集做推理
逐张读取验证集的图片、对应真实标注框和类别,输入模型得到预测结果,先过滤掉置信度低于你设定阈值(一般选0.5)的低置信度预测框。 - 第三步:框匹配统计
对每张图的真实框和预测框两两计算IoU,优先匹配IoU最大的框对:- 匹配成功的框对,记录对应的「真实类别-预测类别」标签对
- 没匹配上的真实框记为漏检,预测类别记为「背景」
- 没匹配上的预测框记为误检,真实类别记为「背景」
- 第四步:计算指标、生成混淆矩阵
- 准确率计算:目标检测场景一般没有统一的准确率定义,你可以根据需求自定义:如果要算检测精确率,就用「定位+分类都正确的样本数 / 所有模型输出的预测框总数」;如果要算全局准确率,就用「正确检测数 /(正确检测数+漏检数+误检数)」即可。
- 混淆矩阵生成:把所有统计得到的真实标签、预测标签整理成两个列表,直接调用
sklearn.metrics.confusion_matrix就能生成统计结果,搭配seaborn的heatmap可以直接做可视化。如果你是单类别车牌检测,混淆矩阵只会有3类结果:车牌检对、车牌漏检、背景误检成车牌。
你当前使用的评估命令参考:
command = "python {} --model_dir={} --pipeline_config_path={} --checkpoint_dir={}".format(TRAINING_SCRIPT, paths['CHECKPOINT_PATH'],files['PIPELINE_CONFIG'], paths['CHECKPOINT_PATH'])现有评估输出参考:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.543641 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 1.00000 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.623451 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.570156 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.566508 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.514109 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.573684 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.636842 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.636842 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.666667 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.630769 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.633333
内容的提问来源于stack exchange,提问作者Irdina Hidayah
相关产品推荐
相关产品推荐

