admin管理员组文章数量:1565853
背景
- numpy是一个用户科学计算的开源python库,是一个非常基础的库,现有的python库很多都会用到numpy这个库,如果你是从事计算机视觉的,这个库完全躲不过去
- 被很多库使用,很容易出现的问题就是兼容性,特别是numpy的接口如果发生了调整,那依赖numpy的库使用起来就很容易出问题,多数情况下调整下numpy版本即可
- 兼容性问题中,有一个很常见的问题:
File "/usr/local/lib/python3.8/dist-packages/mmdet/datasets/__init__.py", line 2, in <module>
from .cityscapes import CityscapesDataset
File "/usr/local/lib/python3.8/dist-packages/mmdet/datasets/cityscapes.py", line 12, in <module>
import pycocotools.mask as maskUtils
File "/usr/local/lib/python3.8/dist-packages/pycocotools/mask.py", line 3, in <module>
import pycocotools._mask as _mask
File "pycocotools/_mask.pyx", line 1, in init pycocotools._mask
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 96 from C header, got 80 from PyObject
这个问题相信大家都有遇到,网上搜索到的解决方法大都也是调整numpy版本
4. 多数情况下,调整numpy版本都是有效的方法,但也有很多情况下,虽然解决了这个问题,但又引起了新的问题。本文尝试着分析该问题出现的原因及给出几种解决方法。
5. 笔者本次是在使用mmdet0.17.2时遇到了该问题,主要是因为pycocotools2.0.6这个库
原因分析
- 仔细分析该问题,从错误日志上也可以看出一些端倪“binary incompatibility. Expected 96 from C header, got 80 from PyObject”,其实就是在使用C接口的时候,一些object的大小发生了变化。在numpy的官方文档中有相关的描述:Size of np.ndarray and np.void_ changed。
简单来说,就是从v1.20.0版本开始,numpy的C API有一些调整。具体的调整细节,笔者也没有仔细研究,感兴趣的读者可以去numpy官方文档去看一看。 - 知道了根本原因,那么这个错误什么情况下会出现呢?比如笔者使用的pycocotools2.0.6这个库,这个库使用pip安装时下载的whl包使用了比较新的numpy库(反正版本号大于等于v1.20.0的,具体哪个numpy版本不重要),即pycocotools2.0.6需要依赖的numpy版本必须大于等于v1.20.0,如果你当前安装的numpy版本不满足条件,比如笔者的numpy==1.19.0,此时就会出现这个错误。
- 那反过来是不是也会报错呢?比如pycocotools2.0.6如果使用的是旧版本numpy1.19.0,而当前环境中安装的numpy==1.24.0,此时会出现不兼容的错误吗?答案是不会,因为C API的调整是前向兼容的,即新环境可以让就版本正常运行
解决方案
知道了原因,解决方案也就顺利成章了
方法一
可以首先尝试直接升级numpy,如果可以直接运行,那么恭喜你,少了很多麻烦。
pip3 install --upgrade numpy
# 或者指定需要的版本,一般就是升级到1.20.0之后的版本
pip3 install numpy==${version}
方法二
如果你的numpy不能升级,如笔者的环境下,mmdet本身依赖numpy==1.19,相当于把numpy版本给固定了,此时只能尝试降低其他库的版本,如笔者就需要尝试降低pycocotools的版本
pip3 install pycocotools==2.0.1
多数情况下,该方法也可以解决问题。
但比较悲催的是,笔者这里不行,因为pycocotools的低版本安装总是出现其他问题。。。
无奈,只能选择方法三进行尝试
方法三
笔者这个场景下,方法一失效,因为升级numpy之后,这个错误倒是消失了,但其他错误又来了。此时的解决方法就是将对应的库直接重新编译,而不是用二进制安装。
pip3 uninstall pycocotools
pip3 install pycocotools --no-binary pycocotools
后记
如果涉及库比较多,就安装上述方法一到方法三,由简单到复杂,一个一个解决。
参考资料
scikit-learn-contrib库中相关的一个问题,github中的一个issue
本文标签: sizechangedndarrayValueErrornumpy
版权声明:本文标题:ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C head 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726673599a1080604.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论