Win10下手把手教你Mask RCNN绘制PR曲线、计算mAP

导航:

1. keras版的mask rcnn环境配置https://blog.csdn.net/hesongzefairy/article/details/104702119

2. keras版的mask rcnn训练自己的数据集https://blog.csdn.net/hesongzefairy/article/details/105738318

3. 一文理解精确率Precision、召回率Recall以及ROC曲线https://blog.csdn.net/hesongzefairy/article/details/104295431

之前的两篇文章已经对mask rcnn的用法做了详细介绍,那么还剩最后一个任务,对目标检测模型评价其性能所用到的指标,PR曲线怎么画,AP、mAP(mean Average Precision)怎么计算?

首先在概念上应该有导航3的基础,本文再简单的解释一下TP、FP、TN、FN

T为True,表示检测类别正确    F为False,表示检测类别错误

P为Positive,表示正样本         N为Negative,表示负样本

TP为True Positive,表示检测正确的正样本

FP为False Positive,表示检测错误的正样本

TN为True Negative,表示检测正确的负样本

FN为False Negative,表示检测错误的负样本

在mAP的计算过程中,会用到TP、FP、FN

计算mAP,首先需要计算precision和recall

精确率Precision:

又称查准率,能够体现模型分类为正样本的数量中分类正确的比例,分母靠预测值决定。

正样本的预测数/被预测为正样本的数量(包含错误预测为正样本的负样本)P = \frac{TP}{TP + FP}

召回率Recall:

又称查全率,即上述的TPR。

分类正确的样本书/正样本的数量 R = \frac{TP}{TP + FN}

计算出precision和recall之后,就可以调整阈值来获取一组组的(P,R)点,绘制出PR曲线,进一步计算出AP和mAP

那么在代码中如何实现:

在utils中有一个函数compute_ap()是专门用来计算AP的,可以看一下源码

def compute_ap(gt_boxes, gt_class_ids, gt_masks,
               pred_boxes, pred_class_ids, pred_scores, pred_masks,
               iou_threshold=0.5):
    """Compute Average Precision at a set IoU threshold (default 0.5).

    Returns:
    mAP: Mean Average Precision
    precisions: List of precisions at different class score thresholds.
    recalls: List of recall values at different class score thresholds.
    overlaps: [pred_boxes, gt_boxes] IoU overlaps.
    """

函数需要的输入是:

gt_boxes:读取json文件中mask并生成相应的bounding box(目标数量,4)

gt_class_ids:读取json文件中的目标类别(目标数量,)

gt_masks:读取json文件中的mask边缘坐标点生成mask(512,512,目标数量)

pred_boxes:模型预测生成的box(目标数量,4)

pred_class_ids:模型预测生成的

### mmsegmentation 中生成和解读 PR 曲线 #### 1. 定义与概念 PR曲线展示了不同阈值下的查准率(Precision)和查全率(Recall),对于二分类或多分类问题具有重要意义。查准率是在预测为正类别的样本中实际为正的比例,而查全率是指在所有真实正类别样本中被正确识别出来的比例[^4]。 #### 2. 使用 `mmsegmentation` 库生成 PR 曲线的方法 为了在 `mmsegmentation` 框架下生成 PR 曲线,通常需要自定义评估过程,因为该框架主要专注于语义分割任务,默认并不提供直接生成 PR 曲线的功能。不过可以通过以下方式实现: - **计算混淆矩阵**:利用模型预测结果构建混淆矩阵,进而计算各个类别的PrecisionRecall 值。 - **调整置信度阈值**:通过改变检测器输出的概率阈值来获取一系列不同的 PrecisionRecall 对应点,从而形成完整的 PR 曲线。 下面是一个简单的 Python 实现例子,用于说明如何基于 `mmseg` 的预测结果手动创建 PR 曲线数据并绘图: ```python import numpy as np from sklearn.metrics import precision_recall_curve import matplotlib.pyplot as plt from mmseg.apis import inference_segmentor, init_segmentor def generate_pr_curve(model_path, img_paths, gt_labels): model = init_segmentor(config_file=model_path) all_precisions = [] all_recalls = [] for i, (img_path, label) in enumerate(zip(img_paths, gt_labels)): result = inference_segmentor(model, img_path)[0] # 将多通道的结果转化为单通道的二进制掩码 pred_mask = (result.argmax(axis=0) == 1).astype(int) prec, rec, _ = precision_recall_curve(label.flatten(), pred_mask.flatten()) all_precisions.append(prec) all_recalls.append(rec) avg_precision = sum([p.max() for p in all_precisions]) / len(all_precisions) fig, ax = plt.subplots() for recalls, precisions in zip(all_recalls, all_precisions): ax.plot(recalls, precisions, lw=2, alpha=0.7) ax.set_xlabel('Recall') ax.set_ylabel('Precision') ax.set_xlim([0.0, 1.0]) ax.set_ylim([0.0, 1.05]) ax.set_title(f'Average Precision={avg_precision:.2f}') plt.show() ``` 这段代码假设输入图像路径列表 (`img_paths`) 及其对应的真实标签(`gt_labels`)已经准备好,并且每个标签都是一个二维数组表示像素级别的真值标注。注意这里的处理逻辑适用于二元分类场景,在面对更复杂的多类别情况时可能需要适当修改。 #### 3. 解读 PR 曲线下面积(Average Precision, AP) 平均精度(AP)是衡量对象检测性能的一个重要指标,它等于 PR 曲线下的面积。AP 越大意味着模型在整个操作范围内的表现越好。当绘制多个类别的 PR 图像时,还可以进一步计算 mAP(mean Average Precision), 即各单独类别 AP 的均值作为整体评价标准[^2]。
评论 115
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值