nms¶
- paddle.vision.ops. nms ( boxes, iou_threshold=0.3, scores=None, category_idxs=None, categories=None, top_k=None ) [源代码] ¶
非极大抑制(non-maximum suppression, NMS)用于在目标检测应用对检测边界框(bounding box)中搜索局部最大值,即只保留处于同一检测目标位置处重叠的框中分数最大的一个框。IoU(Intersection Over Union) 被用于判断两个框是否重叠,该值大于门限值(iou_threshold)则被认为两个框重叠。其计算公式如下:
如果参数scores不为None,输入的boxes会首先按照它们对应的score降序排序,否则将默认输入的boxes为排好序的。
如果category_idxs和categories不为None,分类NMS将会被执行,也就是说,nms过程会在每一个类别的框当中分别进行计算,计算结果会被组合起来然后按照得分倒序排列。
如果top_k不为None的话,排序的计算结果中仅有前k个元素会被返回,否则会返回所有的元素。
参数¶
boxes(Tensor) - 待进行计算的框坐标,它应当是一个形状为[num_boxes, 4]的2-D Tensor,以[[x1, y1, x2, y2], ...]的形式给出,数据类型可以是float32或float64,其中(x1, y1)是左上角的坐标值,(x2, y2)是右下角的坐标值,其关系应符合``0 <= x1 < x2 && 0 <= y1 < y2``。
iou_threshold(float32,可选) - 用于判断两个框是否重叠的IoU门限值。 如果IoU(box1, box2) > threshold, box1和box2将被认为是重叠框。默认为:0.3。
scores(Tensor,可选) - 与boxes参数对应的score,它应当是一个形状为[num_boxes]的1-D Tensor。数据类型可以是float32或float64。默认为:None。
category_idxs(Tensor,可选) - 与boxes参数对应的类别编号,它应当是一个形状为[num_boxes]的1-D Tensor。数据类型为int64。默认为:None。
categories(List,可选) - 类别列表,它的每个元素应该是唯一的,满足categories == paddle.unique(class_idxs)。默认为:None。
top_k(int64,可选) - 需要返回的分数最高的boxes索引数量。该值须小于等于num_boxes。默认为:None。
返回¶
Tensor - 被NMS保留的检测边界框的索引,它应当是一个形状为[num_boxes]的1-D Tensor。
代码示例¶
import paddle
import numpy as np
boxes = np.random.rand(4, 4).astype('float32')
boxes[:, 2] = boxes[:, 0] + boxes[:, 2]
boxes[:, 3] = boxes[:, 1] + boxes[:, 3]
# [[0.06287421 0.5809351 0.3443958 0.8713329 ]
# [0.0749094 0.9713205 0.99241287 1.2799143 ]
# [0.46246734 0.6753201 1.346266 1.3821303 ]
# [0.8984796 0.5619834 1.1254641 1.0201943 ]]
out = paddle.vision.ops.nms(paddle.to_tensor(boxes), 0.1)
# [0, 1, 3, 0]
scores = np.random.rand(4).astype('float32')
# [0.98015213 0.3156527 0.8199343 0.874901 ]
categories = [0, 1, 2, 3]
category_idxs = np.random.choice(categories, 4)
# [2 0 0 3]
out = paddle.vision.ops.nms(paddle.to_tensor(boxes),
0.1,
paddle.to_tensor(scores),
paddle.to_tensor(category_idxs),
categories,
4)
# [0, 3, 2]