解决OpenCV与Numpy版本不匹配问题

小背景

周四晚上发现之前写的程序不能用了,不知道是系统中使用了bootstrap的原因还是什么。为了方便,我把系统也放在了和之前做实验的conda环境。一开始不管算法还是系统都可以使用,但就那天晚上说部署一下Django项目,顺便再测一下代码(周日抽检,需要准备初稿,程序和PPT),结果就用不了了。晚上没有解决,周五上午早起花费1h左右解决了问题。特此记录一下排坑日记,因为担心未来可能还会遇到相同或者类似的bug。

报错一

RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa
Traceback (most recent call last):
  File "xxx.py", line 1, in <module>
    import cv2
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/cv2/__init__.py", line 181, in <module>
    bootstrap()
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/cv2/__init__.py", line 153, in bootstrap
    native_module = importlib.import_module("cv2")
  File "xxx/xxx/miniconda3/envs/xxx/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ImportError: numpy.core.multiarray failed to import

(报错中的xxx代表一些个人信息或者代码)首先一开始我看到bootstrap整个人是懵逼的,以为是bootstrap中有同名的cv2,后来发现不是。关于报错内容解释如下:
RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa Traceback (most recent call last)是说OpenCV和Numpy版本不匹配。最后一行的ImportError: numpy.core.multiarray failed to import 大概意思是说有多个版本的Numpy包。
如果是因为多个版本的Numpy包问题,直接卸掉不用的版本即可。使用 pip show numpy,我个人的结果显示只有一个1.19.5版本的,所以这个问题排除。关键问题出现在版本不匹配上,解决过程如下:
按照网上教程又装了一遍 opencv contrib,OpenCV和OpenCV Contrib的主要区别是OpenCV Contrib包含了一些不是在OpenCV核心库中实现的功能,例如深度学习框架的支持、面部识别、三维重建等等。控制台的输出信息出现了 numpy>=1.13.3字样,其实已经安装好的1.19.5是满足该要求的,但我还是降了版本。

pip install -U numpy==1.13.3

该命令将之前的版本卸载掉然后重新安装1.13.3版本

报错二

降版本后,运行程序,依旧报错,报错内容如下:

Traceback (most recent call last):
  File "xxx.py", line 1, in <module>
    import cv2; print(cv2.getBuildInformation())
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/cv2/__init__.py", line 181, in <module>
    bootstrap()
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/cv2/__init__.py", line 175, in bootstrap
    if __load_extra_py_code_for_module("cv2", submodule, DEBUG):
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/cv2/__init__.py", line 28, in __load_extra_py_code_for_module
    py_module = importlib.import_module(module_name)
  File "/xxx/mmfan/miniconda3/envs/xxx/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/cv2/gapi/__init__.py", line 301, in <module>
    cv.gapi.wip.GStreamerPipeline = cv.gapi_wip_gst_GStreamerPipeline
AttributeError: module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline'

报错内容不理解,之后使用降低OpenCV版本解决问题。

pip install opencv-python==4.5.5.64

运行该命令后,输出如下信息:

Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Collecting opencv-python==4.5.5.64
  Downloading https://mirrors.aliyun.com/pypi/packages/67/50/665a503167396ad347957bea0bd8d5c08c865030b2d1565ff06eba613780/opencv_python-4.5.5.64-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (60.5 MB)
     |████████████████████████████████| 60.5 MB 646 kB/s 
Requirement already satisfied: numpy>=1.13.3; python_version < "3.7" in /xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages (from opencv-python==4.5.5.64) (1.13.3)
Installing collected packages: opencv-python
  Attempting uninstall: opencv-python
    Found existing installation: opencv-python 4.7.0.72
    Uninstalling opencv-python-4.7.0.72:
      Successfully uninstalled opencv-python-4.7.0.72
Successfully installed opencv-python-4.5.5.64

按照输出的信息来看版本都符合要求:numpy = 1.13.3,python = 3.6,报错解决。

报错三

运行程序,依旧报错……又是关于numpy版本的问题,报错内容如下:

File "xxx.py", line 2, in <module>
    import timm
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/tim在这里插入代码片m/__init__.py", line 2, in <module>
    from .models import create_model, list_models, is_model, list_modules, model_entrypoint, \
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/timm/models/__init__.py", line 1, in <module>
    from .cspnet import *
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/timm/models/cspnet.py", line 15, in <module>
    import torch
  File "/xxx/xxx/miniconda3/envs/xxx/lib/python3.6/site-packages/torch/__init__.py", line 190, in <module>
    from torch._C import *
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'

报错表示该版本的numpy中没有xxx模块。很容易想到是因为版本过低,可是上面的报错解决后都是符合要求的版本啊,但还是试着更新了一下Numpy,又从1.13.3—>1.19.5。

pip install --upgrade numpy

该命令会卸载掉1.13.3版本的Numpy,安装最新版(我这里是1.19.5)。运行程序,没有报错,成功运行。

总结

上面的排坑过程说明Numpy版本本身是没有问题的,问题在于OpenCV的版本太高了,两者不匹配。所以降低其版本即可。至于为什么之前可以运行,现在不行,尚不清楚原因,可能是在某个环节更新了一些版本。

猜你喜欢

转载自blog.csdn.net/weixin_45845039/article/details/130300561