opencv.dnn两个自带nms函数

1. cv2.dnn.NMSBoxes

cv2.dnn.NMSBoxes 函数是 OpenCV 库中用于非极大值抑制(Non-Maximum Suppression,NMS)的函数,用于在对象检测任务中筛选出重叠的边界框,仅保留最佳的一个。在使用这个函数时,传入的 boxes 参数通常是一组预测的边界框坐标。

函数原型

cv2.dnn.NMSBoxes(boxes, scores, score_threshold, nms_threshold, eta=1.0, top_k=0)

参数说明

  • boxes: float 类型的数组,形状为 [num_boxes, 4],表示边界框的坐标。每个边界框由其左上角和右下角的坐标 [x, y, w, h] 表示。(x,y)为左上角坐标
  • scores: float 类型的数组,形状为 [num_boxes],表示每个边界框的置信度分数。
  • score_threshold: float 类型,用于过滤低于这个分数阈值的边界框。
  • nms_threshold: float 类型,用于确定哪些重叠的边界框应该被保留。如果两个边界框的重叠面积大于 nms_threshold,则其中一个边界框将被丢弃。
  • eta: float 类型,默认值为 1,用于自适应调整 NMS 阈值。如果设置为小于 1 的值,则 NMS 阈值会随着迭代的进行而减小,这有助于在迭代过程中保留更多的边界框。
  • top_k: int 类型,表示保留的最大边界框数量。默认值为 0,表示保留所有边界框。

返回值

返回值是一个整数数组,包含了保留下来边界框的索引。

用法示例

import cv2
# 假设我们有一组边界框和置信度分数
boxes = [[10, 20, 40, 60], [20, 30, 50, 70], [30, 40, 60, 80]]
scores = [0.9, 0.8, 0.7]
# 设置分数阈值和 NMS 阈值
score_threshold = 0.8
nms_threshold = 0.5
# 执行 NMS
indices = cv2.dnn.NMSBoxes(boxes, scores, score_threshold, nms_threshold)
# 输出保留的边界框索引
print(indices)

在这个例子中,boxes 是边界框的坐标列表,scores 是与每个边界框对应的置信度分数列表。函数会根据置信度分数和非极大值抑制的阈值来过滤掉重叠的边界框,只保留最有可能包含目标的边界框。返回的 indices 包含了保留下来边界框的索引。

2. cv2.dnn.NMSBoxesRotated

cv2.dnn.NMSBoxesRotated 函数是 OpenCV 库中用于对旋转的边界框执行非极大值抑制(Non-Maximum Suppression,NMS)的函数。它用于在对象检测任务中筛选出重叠的旋转边界框,仅保留最佳的一个。

函数原型

cv2.dnn.NMSBoxesRotated(boxes, scores, score_threshold, nms_threshold, eta=1.0, top_k=0)

参数说明

  • boxes: float 类型的数组,形状为 [num_boxes, 5],表示旋转边界框的坐标。每个旋转边界框由一个元组表示,格式为 ((center_x, center_y),(width, height), angle)
  • scores: float 类型的数组,形状为 [num_boxes],表示每个旋转边界框的置信度分数。
  • score_threshold: float 类型,用于过滤低于这个分数阈值的旋转边界框。
  • nms_threshold: float 类型,用于确定哪些重叠的旋转边界框应该被保留。如果两个旋转边界框的重叠面积大于 nms_threshold,则其中一个旋转边界框将被丢弃。
  • eta: float 类型,默认值为 1,用于自适应调整 NMS 阈值。如果设置为小于 1 的值,则 NMS 阈值会随着迭代的进行而减小,这有助于在迭代过程中保留更多的旋转边界框。
  • top_k: int 类型,表示保留的最大旋转边界框数量。默认值为 0,表示保留所有旋转边界框。

返回值

返回值是一个整数数组,包含了保留下来旋转边界框的索引。

用法示例

import cv2
# 假设我们有一组旋转边界框和置信度分数
boxes = [((100, 100), (50, 50), -30), ((150, 150), (60, 60), 45), ((200, 200), (70, 70), 0)]
scores = [0.9, 0.8, 0.7]
# 设置分数阈值和 NMS 阈值
score_threshold = 0.8
nms_threshold = 0.5
# 执行 NMS
indices = cv2.dnn.NMSBoxesRotated(boxes, scores, score_threshold, nms_threshold)
# 输出保留的旋转边界框索引
print(indices)

在这个例子中,boxes 是旋转边界框的坐标列表,scores 是与每个旋转边界框对应的置信度分数列表。函数会根据置信度分数和非极大值抑制的阈值来过滤掉重叠的旋转边界框,只保留最有可能包含目标的旋转边界框。返回的 indices 包含了保留下来旋转边界框的索引。

注意

①yolov8的旋转目标检测的输出是:(1,25,8400)

  • 1是batch_size
  • 25是4个坐标(x_conter,y_conter,w,h),20个类别的概率,1个旋转角度(弧度)
  • 8400是8400个预选框

②yolov10水平目标检测输出:(1,300,6)

  • 1是batch_size
  • 6是4个坐标(x1,y1r,w,h),1个置信度,1个类别
  • 300是300个预选框
  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值