ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C head

背景

  1. numpy是一个用户科学计算的开源python库,是一个非常基础的库,现有的python库很多都会用到numpy这个库,如果你是从事计算机视觉的,这个库完全躲不过去
  2. 被很多库使用,很容易出现的问题就是兼容性,特别是numpy的接口如果发生了调整,那依赖numpy的库使用起来就很容易出问题,多数情况下调整下numpy版本即可
  3. 兼容性问题中,有一个很常见的问题:
  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这个库

原因分析

  1. 仔细分析该问题,从错误日志上也可以看出一些端倪“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官方文档去看一看。
  2. 知道了根本原因,那么这个错误什么情况下会出现呢?比如笔者使用的pycocotools2.0.6这个库,这个库使用pip安装时下载的whl包使用了比较新的numpy库(反正版本号大于等于v1.20.0的,具体哪个numpy版本不重要),即pycocotools2.0.6需要依赖的numpy版本必须大于等于v1.20.0,如果你当前安装的numpy版本不满足条件,比如笔者的numpy==1.19.0,此时就会出现这个错误。
  3. 那反过来是不是也会报错呢?比如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

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值