调用NMS函数时触发numpy属性错误('numpy' has no attribute 'int')及数据类型不匹配问题求助
调用NMS函数时触发numpy属性错误('numpy' has no attribute 'int')及数据类型不匹配问题求助
各位好,我现在在运行一段目标检测相关的Python代码,调用NMS(非极大值抑制)函数的时候卡壳了,碰到个头疼的错误,想请大家帮忙看看问题出在哪!
1. 问题相关代码片段
我处理检测框和置信分后调用NMS的代码是这样的:
# do NMS dets = np.hstack((boxes, scores[:, np.newaxis])).astype(np.float32, copy=False) keep = nms(dets, 0.3) # -> 错误就是在这一行触发的 😢 dets = dets[keep, :]
而NMS函数的导入和基础定义是:
from .nms.cpu_nms import cpu_nms, cpu_soft_nms def nms(dets, thresh): """Dispatch to either CPU or GPU NMS implementations.""" # 内部逻辑会调用导入的cpu_nms函数
2. 调试时观测到的数据
我用调试器仔细看了变量情况:
- 执行到报错行时,
boxes是形状(1000,4)的float32数组,scores是(1000,)的float32数组,合并后的dets是(1000,5)的float32数组,数据格式都是检测框(x1,y1,x2,y2)加对应置信分的结构,数值看起来完全正常。 - 具体的
dets数组内容也没问题,前几行都是类似[0.0, 0.0, 300.0, 300.0, 0.99...]这样的合法数据。
3. 触发的错误信息
最后代码抛出了这个明确的错误:
AttributeError: module 'numpy' has no attribute 'int'.
跟踪下来,错误是在cpu_nms的底层实现代码里触发的,也就是那个导入的CPU版本NMS函数内部。
4. 我自己的初步分析
我查了下资料,NumPy在1.24及以后的版本里,把np.int这个旧的类型别名给移除了,现在要求用Python内置的int,或者np.int32/np.int64这类明确的具体类型。我怀疑这个cpu_nms是比较老的代码实现,里面还在写np.int,导致在新的NumPy环境下找不到这个属性,直接报错。
虽然我已经把dets转成了float32,但NMS内部处理索引或者返回结果的时候,应该是尝试用np.int来转换类型,这就直接触发了这个属性错误。
5. 求大家给点可行的解决办法
目前我自己想到几个可能的方向,但还没彻底验证:
- 要么去找到
cpu_nms.py文件,把里面所有的np.int都替换成int或者np.int32? - 要么暂时把NumPy降级到1.23.x版本,这个版本还保留
np.int的别名,能兼容旧代码? - 或者干脆换掉这个老的NMS实现,用OpenCV的
cv2.dnn.NMSBoxes或者torchvision里的NMS函数?这些现代实现应该已经适配了新的NumPy版本。
有没有大佬碰到过类似的情况,给我指个明路呀!
备注:内容来源于stack exchange,提问作者Megidd
相关产品推荐
相关产品推荐

