计算机系统应用教程网站

网站首页 > 技术文章 正文

目标检测(三):锚框标注与评价指标计算原理

btikc 2024-09-16 13:10:21 技术文章 21 ℃ 0 评论

1、简介

目标检测模型需要依靠训练数据进行参数学习。当完成模型训练后,需要根据评价指标衡量模型的检测性能(这些指标包括准确率、召回率、AP,mAP等)。下面介绍目标检测中训练数据的生成方法与模型评价指标。

2、训练数据生成

训练数据生成的主要目的:给每个锚框标注类别与真实边框位置。

在文章目标检测(一)中,我们在图片中生成了大量锚框,通过生成的锚框预测目标的类别与偏移量。而目标检测通常采用有监督方式学习模型参数。因此,需要知道每个锚框所属的类别以及所要预测的真实边框的位置。据此,根据锚框与真实框之间的类别损失与位置损失,反向传播,学习模型参数。

怎样标注锚框?

如图2,锚框的标注即锚框与真实框的匹配。方法如下:

第一步:从真实框中选择1个目标框,记为真实框1,找锚框与之进行匹配;

第二步:计算真实框1与锚框1,2,3,4之间的IOU,并选择IOU最大的作为匹配锚框,并得到匹配对(锚框1,真实框1);

第三步:重复上述过程,得到真实框2与锚框2匹配,得到匹配对(锚框2,真实框2);

第四步:将未匹配的锚框3,4与真实框计算IOU,锚框3与真实框1的IOU大于阈值t,得到匹配对(锚框3,真实框1),锚框4与真实框1及真实框2的IOU均小于阈值t,因此,锚框4分配到背景,得到匹配对(锚框4,背景)。

通过代码进行实现:

import torch


def box_iou(boxes1, boxes2):
    box_area = lambda boxes: ((boxes[:, 2] - boxes[:, 0]) *
                              (boxes[:, 3] - boxes[:, 1]))
    areas1 = box_area(boxes1)
    areas2 = box_area(boxes2)
    inter_upperlefts = torch.max(boxes1[:, None, :2], boxes2[:, :2])
    inter_lowerrights = torch.min(boxes1[:, None, 2:], boxes2[:, 2:])
    inters = (inter_lowerrights - inter_upperlefts).clamp(min=0)
    inter_areas = inters[:, :, 0] * inters[:, :, 1]
    union_areas = areas1[:, None] + areas2 - inter_areas
    return inter_areas / union_areas


def box_corner_to_center(boxes):
    x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
    cx = (x1 + x2) / 2
    cy = (y1 + y2) / 2
    w = x2 - x1
    h = y2 - y1
    boxes = torch.stack((cx, cy, w, h), axis=-1)
    return boxes


def assign_anchor_to_bbox(ground_truth, anchors, device, iou_threshold=0.5):
    """将最接近的真实边界框分配给锚框"""
    num_anchors, num_gt_boxes = anchors.shape[0], ground_truth.shape[0]
    # 位于第i行和第j列的元素x_ij是锚框i和真实边界框j的IoU
    jaccard = box_iou(anchors, ground_truth)
    # 对于每个锚框,分配的真实边界框的张量
    anchors_bbox_map = torch.full((num_anchors,), -1, dtype=torch.long,
                                  device=device)
    # 根据阈值,决定是否分配真实边界框
    max_ious, indices = torch.max(jaccard, dim=1)
    anc_i = torch.nonzero(max_ious >= iou_threshold).reshape(-1)
    box_j = indices[max_ious >= iou_threshold]
    anchors_bbox_map[anc_i] = box_j
    col_discard = torch.full((num_anchors,), -1)
    row_discard = torch.full((num_gt_boxes,), -1)
    for _ in range(num_gt_boxes):
        max_idx = torch.argmax(jaccard)
        box_idx = (max_idx % num_gt_boxes).long()
        anc_idx = (max_idx / num_gt_boxes).long()
        anchors_bbox_map[anc_idx] = box_idx
        jaccard[:, box_idx] = col_discard
        jaccard[anc_idx, :] = row_discard
    return anchors_bbox_map


if __name__ == "__main__":
    ground_truth = torch.tensor([[0.1, 0.08, 0.52, 0.92],
                                 [0.55, 0.2, 0.9, 0.88]])
    anchors = torch.tensor([[0, 0.1, 0.2, 0.3],
                            [0.15, 0.2, 0.4, 0.4],
                            [0.63, 0.05, 0.88, 0.98],
                            [0.66, 0.45, 0.8, 0.8],
                            [0.57, 0.3, 0.92, 0.9]])

    anchors_bbox_map = assign_anchor_to_bbox(ground_truth, anchors, device=anchors.device)
    print(anchors_bbox_map)
算法输出:
tensor([-1,  0,  1, -1,  1])

在上述代码中,锚框个数5个,真实框个数2个。即为5个锚框分配2个真实框。

在输出中:

  • -1:表示该锚框分配到背景;
  • 0:表示该锚框分配到真实框0;
  • 1:表示该锚框分配到真实框1。

因此,可得:

  • 第1个与第4个anchor分配到背景;
  • 第2个anchor分配到真实框1;
  • 第3个与第5个anchor分配到真实框2。

3、评价指标解析

(1)业界常用评价指标?

  • 常用的指标主要2个:召回率与准确率。
  • 与上述两指标对应的:漏报率与误报率。
  • 关系:召回率+漏报率=100%,准确率+误报率=100%。

在目标检测中术语中,预测框分为以下四种情况:

  • 正确检测框TP(True Positive):预测框正确的预测了目标;
  • 误检框FP(False Positive):预测框将别的对象预测成了目标,如将背景预测为dog;
  • 漏检框FN(False Negative):预测框没有把目标预测出来;
  • 正确的背景TN(True Negative):本身是背景,预测框也预测为了背景。

以上四个术语与准确率、召回率之间的关系为:

  • 准确率:Precision = TP/(TP+FP)
  • 召回率:Recall = TP/(TP+FN)

举个例子:假如我们通过目标检测统计人流量,在一帧图片中有10个人,而模型预测出了11个目标框。在这11个目标框中,有8个正确预测了目标,有3个将背景预测为目标。

那么,根据上述数据:正确检测框TP=8,错误检测框FP=3,漏检框FN=10-8=2。

则准确率:P=8/(8+3)=72.73%,召回率:R=8/(8+2)=80%

(2)不同应用场景怎样选择?

不同的应用场景对于指标要求的侧重点不同。如军事重地火灾的检测,对于模型召回率要求极高,理论上不允许存在漏报,即召回率=100%,即模型需对任何发生的火灾都能检测到。而在普通应用场景,如流水线中物料分拣,对模型识别的准确率要求高,理论上不允许物料误分类,即准确率=100%。

(3)高准确率与高召回率两者能不能兼顾?

答案是:不能。追求一个指标的升高,往往导致对立指标的下降。

举个极端的例子:图片中存在10个真实目标。

  • 预测框为1个(IOU>0.9),并成功预测出了1目标,那么准确率为100%,召回率为10%(出手少,精准命中,但是召回低);
  • 预测框为100个(IOU>0.5),成功预测出了10个目标,那么准确率为10%,召回率为100%(广撒网,高召回,但是准确率低)。

(4)怎样用一个指标评价模型性能?

准确率与召回率的关系如图3所示,这条曲线上的每个点是取预测框不同置信度下的准召值。这条曲线还是准确率与召回率的关系,并且是两个对立指标,难以评价模型好坏。

通常采用AP来评价模型:

AP表示曲线下所包围的面积,如果模型1的准召率比模型2的准召率高,那么模型1的P-R曲线所包围的面积要比模型2的大。因此,AP综合考虑了不同召回下的准确率。mAP是对每个类别的AP的平均值。

写在最后:基于锚框机制的目标检测模型训练时,需为锚框分配真实框;模型的评价指标采用mAP为合理方式。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表