NMS(非极大值抑制)在NumPy、PyTorch和C++中的实现方法

这篇博客详细介绍了NMS(Non-Maximum Suppression)算法在目标检测中的应用,包括NMS的基本思想、numpy简洁实现、pytorch实现以及cpp实现。NMS通过消除高重叠度的边界框来减少检测结果中的冗余。文中还提供了Soft-NMS的实现,它对高重叠度的边界框不是直接剔除,而是降低其置信度。此外,博客中还给出了代码示例和验证过程,帮助读者更好地理解和应用NMS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是NMS(非极大值抑制)在NumPy、PyTorch和C++中的实现方法及代码示例:


一、NumPy实现

核心逻辑

通过向量化计算IoU,逐轮筛选最高置信度框并抑制重叠框。

import numpy as np

def nms_numpy(dets, thresh):
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]

    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    order = scores.argsort()[::-1]  # 按置信度降序排序[1,5](@ref)

    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        # 计算当前框与其他框的IoU
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 
### NumPy 版本兼容性解决方案 为了确保 Python 模块能够在不同版本的 NumPy(如 1.x 2.x)上正常运行,可以通过以下方法实现: #### 使用 `numpy` 的最低公共 API 集合 通过编写代码时仅依赖于跨多个 NumPy 版本均支持的功能集合来提高兼容性。例如,在某些情况下,新版本可能会引入新的参数或更改现有函数的行为。因此,应避免使用特定于某个高版本的功能。 对于 YOLOv5 中的 `detect.py` 文件,其主要涉及矩阵运算、张量操作以及一些高级功能(如 NMS)。这些部分可能受到 NumPy 更新的影响[^1]。以下是具体措施: 1. **动态导入并检测 NumPy 功能** 可以在程序启动阶段检查当前使用的 NumPy 版本,并基于此调整行为逻辑。 ```python import numpy as np def check_numpy_version(): version = tuple(map(int, np.__version__.split('.'))) if version >= (2, 0): # 如果是 NumPy 2.x 或更高版本 print("Using features from NumPy 2.x or higher.") elif version >= (1, 0): # 如果是 NumPy 1.x print("Falling back to compatible mode with NumPy 1.x.") else: raise ImportError("Unsupported NumPy version detected!") return version ``` 2. **条件化调用** 对于那些已知存在差异的操作,可以根据上述版本判断结果有条件地执行不同的路径。比如某些数组切片方式或者广播机制的变化: ```python def safe_operation(array): version = check_numpy_version() if version >= (2, 0): result = array @ array.T # 假设这是 NumPy 2.x 新增特性 else: result = np.dot(array, array.T) # 向下兼容写法 return result ``` 3. **捕获异常处理未知错误** 即便做了充分准备,仍可能存在未预料到的情况导致崩溃。此时可以在关键位置加入 try-except 结构捕捉潜在问题并提供替代方案。 ```python def robust_function(input_data): try: output = some_new_feature_in_2_x(input_data) except AttributeError: # 当尝试访问不存在的方法/属性时触发 fallback_to_old_method(input_data) return output ``` 4. **单元测试覆盖多场景验证** 构建全面的自动化测试套件分别针对目标平台上的各个重要组合进行验证是非常必要的。这有助于提前发现因环境切换带来的隐患[^2]。 综上所述,采取以上策略能够有效缓解由于底层库升级引发的应用层不稳定现象,从而保障像 YOLOv5 这样的复杂项目稳定高效运转。 ```python import numpy as np def example_compatible_code(x): """ A function demonstrating compatibility between different versions of NumPy. Args: x (np.ndarray): Input data. Returns: np.ndarray: Processed data based on the current NumPy version. """ version = tuple(map(int, np.__version__.split('.'))) if version >= (2, 0): processed = np.linalg.matrix_power(x, 3) # Example feature introduced in v2+ else: processed = np.matmul(np.matmul(x, x), x) return processed ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值