【目标检测】评价指标:混淆矩阵概念及其计算方法(yolo源码)

这篇具有很好参考价值的文章主要介绍了【目标检测】评价指标:混淆矩阵概念及其计算方法(yolo源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇文章首先介绍目标检测任务中的评价指标混淆矩阵的概念,然后介绍其在yolo源码中的实现方法。

目标检测中的评价指标:

mAP概念及其代码实现(yolo源码/pycocotools)
混淆矩阵概念及其代码实现(yolo源码)

1 概念

  在分类任务中,混淆矩阵(Confusion Matrix)是一种可视化工具,主要用于评价模型精度,将模型的分类结果显示在一个矩阵中。多分类任务的混淆矩阵结构如图1所示,其中横轴表示模型预测结果,纵轴表示实际结果,图中的各类指标以cls_1的预测结果为例,其含义如下:

  • True Positive(TP):预测为正样本(cls_1),且实际为正样本(cls_1)
    • 各类别TP:混淆矩阵对角线的值
  • False Positive(FP):预测为正样本(cls_1),但实际为负样本(cls_other)
    • 各类别FP:混淆矩阵每列的和减去对应的TP
  • False Negative(FN):预测为负样本(cls_other),但实际为正样本(cls_1)
    • 各类别(FN:混淆矩阵每行的和减去对应的TP
  • True Negative(TN): 预测为负样本(cls_other),且实际为负样本(cls_other)
    • 各类别FN:混淆矩阵的和减去对应的TP、FP、FN

【目标检测】评价指标:混淆矩阵概念及其计算方法(yolo源码),目标检测,目标检测,矩阵,YOLO

图1 分类任务中混淆矩阵

  目标检测的任务为对目标进行分类定位,模型的预测结果p为 ( c l s , c o n f , p o s ) (cls, conf, pos) (cls,conf,pos),其中 c l s cls cls为目标的类别, c o n f conf conf为目标属于该类别的置信度, p o s pos pos为目标的预测边框。目标检测任务综合类别预测结果预测边框与实际边框IoU,对模型进行评价,其混淆矩阵结构如图2所示,图中的各类指标以 c l s _ 1 cls\_1 cls_1的预测结果为例,其含义如下:

  • 样本匹配(每一张图片):预测结果gt与实际结果dt匹配
    • IoU > IoU_thres
    • 同一个gt至多匹配一个p(若一个gt匹配到多个p,则选择IoU最高的p作为匹配结果)
    • 同一个gt至多匹配一个p(若一个p匹配到多个gt,则选择IoU最高的gt作为匹配结果)
  • background: 未成功匹配的gtdt
  • True Positive(TP):匹配结果为正样本(cls_1),且实际为正样本(cls_1)
  • False Positive(FP):匹配结果正样本(cls_1),但实际为负样本(cls_1 or background)
  • False Negative(FN):匹配结果为负样本(cls_other or backgroun),但实际为正样本(cls_1)
  • True Negative(TN):匹配结果为负样本(cls_other or backgroun),且实际为负样本(cls_other or backgroun)

【目标检测】评价指标:混淆矩阵概念及其计算方法(yolo源码),目标检测,目标检测,矩阵,YOLO

图2 目标检测中混淆矩阵

  目标检测任务中的混淆矩阵计算方法如图3所示。
【目标检测】评价指标:混淆矩阵概念及其计算方法(yolo源码),目标检测,目标检测,矩阵,YOLO

图3 混淆矩阵计算方法

2 计算方法

基于YOLO源码实现混淆矩阵计算(ConfusionMatrix)文章来源地址https://www.toymoban.com/news/detail-785320.html

  • 函数
    • process_batch:实现预测结果与真实结果的匹配,混淆矩阵计算
    • plot:混淆矩阵绘制
    • tp_fp:根据混淆矩阵计算TP/FP
class ConfusionMatrix:
    # Updated version of https://github.com/kaanakan/object_detection_confusion_matrix
    def __init__(self, nc, conf=0.25, iou_thres=0.5):
        self.matrix = np.zeros((nc + 1, nc + 1))
        self.nc = nc  # number of classes
        self.conf = conf  # 类别置信度
        self.iou_thres = iou_thres  # IoU置信度

    def process_batch(self, detections, labels):
        """
        Return intersection-ove-unionr (Jaccard index) of boxes.
        Both sets of boxes are expected to be in (x1, y1, x2, y2) format.
        Arguments:
            detections (Array[N, 6]), x1, y1, x2, y2, conf, class
            labels (Array[M, 5]), class, x1, y1, x2, y2
        Returns:
            None, updates confusion matrix accordingly
        """
        if detections is None:
            gt_classes = labels.int()
            for gc in gt_classes:
                self.matrix[self.nc, gc] += 1  # 预测为背景,但实际为目标
            return

        detections = detections[detections[:, 4] > self.conf]  # 小于该conf认为为背景
        gt_classes = labels[:, 0].int()  # 实际类别
        detection_classes = detections[:, 5].int()  # 预测类别
        iou = box_iou(labels[:, 1:], detections[:, :4])  # 计算所有结果的IoU

        x = torch.where(iou > self.iou_thres)  # 根据IoU匹配结果,返回满足条件的索引 x(dim0), (dim1)
        if x[0].shape[0]:  # x[0]:存在为True的索引(gt索引), x[1]当前所有下True的索引(dt索引)
            # shape:[n, 3] 3->[label, detect, iou]
            matches = torch.cat((torch.stack(x, 1), iou[x[0], x[1]][:, None]), 1).cpu().numpy()
            if x[0].shape[0] > 1:
                matches = matches[matches[:, 2].argsort()[::-1]]  # 根据IoU从大到小排序
                matches = matches[np.unique(matches[:, 1], return_index=True)[1]]  # 若一个dt匹配多个gt,保留IoU最高的gt匹配结果
                matches = matches[matches[:, 2].argsort()[::-1]]  # 根据IoU从大到小排序
                matches = matches[np.unique(matches[:, 0], return_index=True)[1]]  # 若一个gt匹配多个dt,保留IoU最高的dt匹配结果
        else:
            matches = np.zeros((0, 3))

        n = matches.shape[0] > 0  # 是否存在和gt匹配成功的dt
        m0, m1, _ = matches.transpose().astype(int)  # m0:gt索引 m1:dt索引
        for i, gc in enumerate(gt_classes):  # 实际的结果
            j = m0 == i  # 预测为该目标的预测结果序号
            if n and sum(j) == 1:  # 该实际结果预测成功
                self.matrix[detection_classes[m1[j]], gc] += 1  # 预测为目标,且实际为目标
            else:  # 该实际结果预测失败
                self.matrix[self.nc, gc] += 1  # 预测为背景,但实际为目标

        if n:
            for i, dc in enumerate(detection_classes):  # 对预测结果处理
                if not any(m1 == i):  # 若该预测结果没有和实际结果匹配
                    self.matrix[dc, self.nc] += 1  # 预测为目标,但实际为背景

    def tp_fp(self):
        tp = self.matrix.diagonal()  # true positives
        fp = self.matrix.sum(1) - tp  # false positives
        # fn = self.matrix.sum(0) - tp  # false negatives (missed detections)
        return tp[:-1], fp[:-1]  # remove background class

    @TryExcept('WARNING ⚠️ ConfusionMatrix plot failure')
    def plot(self, normalize=True, save_dir='', names=()):
        import seaborn as sn
        plt.rc('font', family='Times New Roman', size=15)
        array = self.matrix / ((self.matrix.sum(0).reshape(1, -1) + 1E-9) if normalize else 1)  # normalize columns
        array[array < 0.005] = 0.00  # don't annotate (would appear as 0.00)

        fig, ax = plt.subplots(1, 1, figsize=(12, 9), tight_layout=True)
        nc, nn = self.nc, len(names)  # number of classes, names
        sn.set(font_scale=1.0 if nc < 50 else 0.8)  # for label size
        labels = (0 < nn < 99) and (nn == nc)  # apply names to ticklabels
        ticklabels = (names + ['background']) if labels else 'auto'
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')  # suppress empty matrix RuntimeWarning: All-NaN slice encountered
            h = sn.heatmap(array,
                           ax=ax,
                           annot=nc < 30,
                           annot_kws={
                               'size': 20},
                           cmap='Reds',
                           fmt='.2f',
                           linewidths=2,
                           square=True,
                           vmin=0.0,
                           xticklabels=ticklabels,
                           yticklabels=ticklabels,
                           )
            h.set_facecolor((1, 1, 1))

            cb = h.collections[0].colorbar  # 显示colorbar
            cb.ax.tick_params(labelsize=20)  # 设置colorbar刻度字体大小。

        plt.xticks(fontsize=20)
        plt.yticks(fontsize=20)
        plt.rcParams["font.sans-serif"] = ["SimSun"]
        plt.rcParams["axes.unicode_minus"] = False
        ax.set_xlabel('实际值')
        ax.set_ylabel('预测值')
        # ax.set_title('Confusion Matrix', fontsize=20)
        fig.savefig(Path(save_dir) / 'confusion_matrix.png', dpi=100)
        plt.close(fig)

    def print(self):
        for i in range(self.nc + 1):
            print(' '.join(map(str, self.matrix[i])))

到了这里,关于【目标检测】评价指标:混淆矩阵概念及其计算方法(yolo源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详细讲解分类模型评价指标(混淆矩阵)python示例

    对于回归模型的评估方法,通常会采用平均绝对误差(MAE)、均方误差(MSE)、平均绝对百分比误差(MAPE)等方法。 对于聚类模型的评估方法,较为常见的一种方法为轮廓系数(Silhouette Coefficient ),该方法从内聚度和分离度两个方面入手,用以评价相同数据基础上不同聚类

    2024年02月06日
    浏览(56)
  • 【计算机视觉 | 目标检测】常见的两种评价指标:AP50和APr的理解和对比

    平均精度(Average Precision,简称AP)是目标检测中广泛使用的一种评价指标,用于衡量模型的检测精度。AP的计算方式基于精度-召回曲线(precision-recall curve)。 精度-召回曲线是在不同的置信度阈值下,以不同的召回率(recall)计算出的对应的精度(precision)点组成的曲线。其

    2024年02月05日
    浏览(58)
  • 【机器学习】全网最全模型评价指标(性能指标、YOLOv5训练结果分析、轻量化指标、混淆矩阵详解)【基础收藏】

    在目标检测任务中,我们常用的评价指标一般有两种,一种是使用Pascal VOC的评价指标,一种是更加严格的COCO评价指标,一般后者会更常用点。 如何判断一个检测结果是否正确。目前最常用的方式就是去计算检测框与真实框的IOU,然后 根据IOU去判别两个框是否匹配 。 常见指

    2024年02月04日
    浏览(51)
  • 【目标检测】目标检测的评价指标(七个)

    样本在计算机视觉的评价中是非常重要的概念,正样本比较好理解,是要检测的物体,负样本是不要检测的目标。这里负样本会有一些问题,首先负样本定义比较主观,其次负样本和正样本的量纲不在一个级别,那么实际算法中会把检测出的待选区域中的一部分作为正样本,

    2024年02月04日
    浏览(39)
  • 机器学习模型优劣评价指标:混淆矩阵,P-R曲线与平均精确度(附代码实现)

    文章参考:Mean Average Precision (mAP) Explained | Paperspace Blog 目录 一. Confusion Metrics混淆矩阵 二. Precision-Recall Curve, Average precision P-R曲线,平均精确度 三. 举例与代码实现 (1)从预测分数到类别标签(From Prediction Score to Class Label) (2)精确度-召回度曲线(Precision-Recall Curve) (3)平均

    2024年02月05日
    浏览(44)
  • 目标检测评价指标

    IoU(交并比) 1、IOU的全称为交并比(Intersection over Union), 是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率,即它们的交集和并集的比值 。 2、IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。 IoU计算如下图,B1为真实

    2024年02月05日
    浏览(41)
  • 目标检测网络的常见评价指标

    声明:原视频链接https://www.bilibili.com/video/BV13k4y1m7DY?spm_id_from=333.880.my_history.page.click 下面是我的笔记,截图均来自原视频。 举例说明:单类物体检测时,以人脸检测为例。如图 绿色 实线和虚线框:人脸的真实标注 红色 的实线框和虚线框:算法的检测结果 框左上角的 红色数

    2024年02月06日
    浏览(47)
  • 04- 评价指标mAP (目标检测)

    要点: Precision  (准确率 ): TP/(TP+FP) , 即模型给出的所有预测结果中命中真实目标的比例 。 Recall  (召回率): TP/(TP+FN) , 被找到的正确目标和所有正确目标的比值 。 官方文档: https://cocodataset.org/#detection-eval 参考文章: mAP的计算 TP   (True Positive): 一个正确的检测 ,检测

    2024年02月03日
    浏览(44)
  • 图像分类 图像分割的评价指标(混淆矩阵 正确率 精准率 召回率 F1分数 IOU dice系数)

             在图像分类或者图像分割中,为 评价模型的预测效果 ,在训练过程中通常需要比较预测值与真实标签值的差距,即误差。 目录 图像分类过程的评价指标 混淆矩阵 正确率/准确率 精准率 召回率 F1分数 图像分割过程的评价指标 混淆矩阵 混淆矩阵的生成代码 IO

    2024年01月22日
    浏览(44)
  • 分类问题的评价指标(Precision、Recall、Accuracy、F1-Score、Micro-F1、Macro-F1)以及混淆矩阵、ROC曲线

    真阳性:预测为正,实际为正。把正样本 成功 预测为正。  TP ——True Positive 假阳性:预测为正,实际为负。把负样本 错误 预测为正。  FP ——False Positive  ——误报 真阴性:预测为负、实际为负。把负样本 成功 预测为负。  TN ——True Negative 假阴性:预测与负、实际

    2024年01月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包