问题描述:
我在调用cocoeval计算map时,发生报错:TypeError: object of type <class ‘numpy.float64’> cannot be safely interpreted as an integer
经查,错误主要发生在pycocotools/cocoeval.py
下面这一行代码:
self.iouThrs = np.linspace(.5, 0.95, np.round((0.95 - .5) / .05) + 1, endpoint=True)
参考网址:https://stackoverflow.com/questions/59801932/raise-typeerror-typeerror-object-of-type-class-numpy-float64-cannot-be-saf 中的回答,可以看到,在numpy 1.17.0版本中,np.linspace()是可以使用浮点数作为步长的,但是在numpy 1.18.0版本中就会报错(如下)。
(1)numpy == 1.17.0
In [216]: np.linspace(0,1,10.)
Out[216]:
array([0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
(2) numpy == 1.18.0
In [2]: np.linspace(0,10,10.)
---------------------------------------------------------------------------
TypeError: object of type <class 'float'> cannot be safely interpreted as an integer.
解决方法一:
降低numpy的版本。
具体步骤如下:
-
查看自身numpy版本:
pip show numpy
我这里显示我的numpy版本是1.18.0,所以需要降低版本号。
-
降低numpy版本:
pip install -U numpy==1.17.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
后面加上 -i 是为了设置清华镜像源作为下载地址,速度飞快。
-
降低版本号后即可正常调用coco的api了。
解决方法二:
修改cocoapi的源码
因为我现在用的是python3.9+pytorch1.9,numpy版本已经降不到1.17.0了,所以只有去修改cocoapi源码的方法了。
如果用的是conda环境,cocoapi所在位置应该是:
/home/w61/anaconda3/envs/[env name]/lib/[python version]/site-packages/pycocotools/pycocotools.py
找到这个文件,修改以下代码:
self.iouThrs = np.linspace(.5, 0.95, np.round((0.95 - .5) / .05) + 1, endpoint=True)
为
self.iouThrs = np.linspace(.5, 0.95, int(np.round((0.95 - .5) / .05)) + 1, endpoint=True)
保存即可。
附:存一个安装pycocotools的方法:
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI