修复 OpenCV 依赖错误的小工具:OpenCV Fixer

使用 Nvidia 官方 Docker 镜像折腾 Stable Video Diffusion 的时候,发现 OpenCV 社区有一个古怪的 issue 需要手动解决,所以顺手写了一个能够自动修复的小工具。

以及,聊聊如何快速的发布一个 Python 软件包。

写在前面

如果你在使用 Python 生态的软件时,遇到了 module 'cv2.dnn' has no attribute 'DictValue' 的报错,可以试试看这个小工具。

当然,如果你想进一步确认是因为 OpenCV 引起的问题,可以尝试执行下面的命令:

bash 复制代码
python -c "import cv2; print(cv2.__version__)"

如果你收获的不是某个版本号,而是下面的报错日志,说明你的 Python 软件包存在需要修复的问题。

python 复制代码
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 181, in <module>
    bootstrap()
  File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 175, in bootstrap
    if __load_extra_py_code_for_module("cv2", submodule, DEBUG):
  File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 28, in __load_extra_py_code_for_module
    py_module = importlib.import_module(module_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/usr/local/lib/python3.10/dist-packages/cv2/typing/__init__.py", line 168, in <module>
    LayerId = cv2.dnn.DictValue
AttributeError: module 'cv2.dnn' has no attribute 'DictValue'

这个问题在社区早些时候有被反馈(opencv/opencv-python #884),主要原因是在安装 numpy 时被带入一起安装的版本过旧 opencv 导致的兼容性问题。比较 Trick 的是我们并不能通过简单执行 pip install 来更新软件包,需要遵从帖子进行一些手动清理安装,才能将问题解决。

所以,我写了一个简单的开源小工具,来自动修正这个问题,项目开源地址在:soulteary/opencv-fixer

下面讲讲如何使用这个小工具。

OpenCV Fixer

工具的使用非常简单,和使用普通的软件包一样,使用 pip install 来完成工具包的下载:

bash 复制代码
pip install opencv-fixer==0.2.5

软件的修复需要进行 OpenCV 的清理和更新下载,如果你访问 Python 官方的 PyPi 源比较慢,可以顺手更新软件源为国内的镜像:

bash 复制代码
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

然后,执行下面的命令,就能够完成 OpenCV 的自动修复工作了:

bash 复制代码
python -c "from opencv_fixer import AutoFix; AutoFix()"

如果一切正常,你将看到类似下面的日志输出:

bash 复制代码
Uninstalling the following OpenCV-related packages: opencv, opencv-fixer

Successfully uninstalled opencv

Successfully uninstalled opencv-fixer

Found opencv-python version is lower than 4.9, version=4.7.0

Begin upgrade your opencv-python version to 4.9+.

The folder /usr/local/lib/python3.10/dist-packages/cv2 has been removed successfully

...

如果我们再次执行之前的测试命令,能够得到 OpenCV 的版本号,那么说明一切都修复正常啦:

bash 复制代码
# python -c "import cv2; print(cv2.__version__)"
4.9.0

当然,如果我们在 Docker 环境或者使用 root 用户执行,可能会收到下面的 warning 警告日志:

bash 复制代码
Install opencv-python-headless failed: WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

但其实是没有问题的,如果我们执行 pip show opencv-python-headless,能够看到软件已经被正确安装:

bash 复制代码
# pip show opencv-python-headless
Name: opencv-python-headless
Version: 4.9.0.80
Summary: Wrapper package for OpenCV python bindings.
Home-page: https://github.com/opencv/opencv-python
Author: 
Author-email: 
License: Apache 2.0
Location: /usr/local/lib/python3.10/dist-packages
Requires: numpy, numpy, numpy, numpy
Required-by: 

其他:快速发布一个 Python 软件包

想要快速发布能够被 pip install 安装的 Python 软件包,其实很简单。

首先,需要注册一个 PyPi 账号,注册完毕后,会要求我们验证邮箱有效性。再完成邮箱验证后,我们需要在账号中配置"二步认证",从而开启获取 API Token 的权限。

获取的 API Token 页面下方,有可以一键复制的配置文件,内容类似下面这样,我们可以保存起来,稍晚使用:

Toml 复制代码
[pypi]
  username = __token__
  password = pypi-一长串Token

如果你是 macOS 用户,在不配置或者更新本地 Python 环境的情况下,如果想直接发布一个软件包,可能会比较麻烦。但是如果使用 Docker 就会变的简单许多:

bash 复制代码
cd package-dir

docker run --rm -it -v `pwd`:/app python:3.10 bash

比如,使用上面的命令,可以快速的将软件包里的内容映射到 Python 3.10 容器的 /app 目录,方便我们用一个完备、干净的环境做软件发布。

发布过程中,我们可以配置软件源和完成依赖软件包的下载:

bash 复制代码
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install packaging twine

完成基础依赖后,执行下面的命令,可以将我们之前获得的 API Token 保存为可以通过 PyPi 源认证的配置文件。

bash 复制代码
cat << EOF > ~/.pypirc
[pypi]
  username = __token__
  password = pypi-一长串Token
EOF

一切就绪之后,我们执行下面的命令,完成 Python 软件包的构建和发布就完事啦:

bash 复制代码
python setup.py sdist bdist_wheel
twine upload dist/*

最后

好了,这篇文章就先写到这里。

--EOF


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年01月07日

统计字数: 3707字

阅读时间: 8分钟阅读

本文链接: https://soulteary.com/2024/01/07/fix-opencv-dependency-errors-opencv-fixer.html

相关推荐
数据与后端架构提升之路8 分钟前
小鹏VLA 2.0的“神秘涌现”:从痛苦到突破,自动驾驶与机器人如何突然“开窍”?
人工智能·机器人·自动驾驶
fruge11 分钟前
CANN核心特性深度解析:简化AI开发的技术优势
人工智能
沛沛老爹28 分钟前
AI入门知识之RAFT方法:基于微调的RAG优化技术详解
人工智能·llm·sft·raft·rag
zskj_zhyl30 分钟前
科技助老与智慧养老的国家级政策与地方实践探索
大数据·人工智能·科技
避避风港34 分钟前
Java 抽象类
java·开发语言·python
YangYang9YangYan37 分钟前
职业本科发展路径与规划指南
大数据·人工智能·学习·数据分析
牛客企业服务1 小时前
2025年AI面试防作弊指南:技术笔试如何识别异常行为
人工智能·面试·职场和发展
N 年 后1 小时前
单独Docker部署和Docker Compose部署
java·docker·容器
shayudiandian1 小时前
CNN详解:卷积神经网络是如何识别图像的?
人工智能·深度学习·cnn
V_156560272191 小时前
2025年蚌埠市“三首产品”、市级服务型制造示范、市级企业技术中心等5个项目认定申报指南大全
大数据·人工智能·制造