detectron2是facebook开源的目标检测依赖框架, 诸如sparcer-cnn的目标检测模型均依赖于其进行开发. 然而于诸如opencv-python等一般的python的cv依赖库不同, detectron2多出来了编译的步骤.官方的指导安装步骤是使用git clong源码后在setup.py所在路径下运行以下命令:
1 | pip install -e . |
需要额外注意的是detectron2对torch库的版本依赖较为敏感. 我的CUDA version是12.1,使用的是如下torch版本.
1 | pip install torch==2.5.1+cu121 torchvision==0.20.1+cu121 torchaudio==2.5.1+cu121 --extra-index-url https://download.pytorch.org/whl/cu121 |
然而在后续的编译过程中反复遇到提示无法在虚拟环境中找到torch依赖的报错, 即使我确实已经正确安装了对应版本的torch库. 初步分析, 产生这个问题的原因在于使用pip install -e .时启动了PEP517隔离环境, 即创建了一个临时的,独立的虚拟环境, 而这个环境正好将外部的已安装torch的conda环境隔离在外, 根据路径下的pyproject.toml配置构建库函数所依赖的工具并加入到临时环境中. 但即使其中声明了对torch的依赖, 也可能因为境内的网络原因导致安装失败. 我所遇到的具体报错如下所示:
1 | File "/tmp/pip-build-env-h48lpsdh/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 317, in run_setup |
对于这种情况, 有以下几种种常规的处理方法:
- 在pip命令后加入后缀
--no-build-isolation, 来关闭上述的隔离功能, 使编译过程在conda环境中进行(conda本身已经对环境进行了隔离) - 直接强制使用setup.py进行编译安装.
python setup.py build develop, 然而这种操作已不被pip推荐以避免可能的环境混乱. - 使用pip安装已经完成预编译的detectron2库, 命令为
pip install 'git+https://github.com/facebookresearch/detectron2.git'.
然而, 前两种方法对上述报错并不奏效, 第三种方法在我所在的网络环境下几乎不可行 (即使我已经更换了诸如githubfast.com的镜像源或使用GitHub官方加速方法). 最后, 我发现了一种手动编译的方法成功解决的了detectron2的安装编译问题, 在定位到detectron2项目目录下, 构建好conda环境后执行以下两步即可.
FORCE_CUDA=1 python setup.py build_ext --inplacepython setup.py develop
第1步首先通过FORCE_CUDA=1强制激活CUDA编译流程, 确保CUDA相关的cpp和.cu被正确编译; 接着运行setup.py, 这是标准的python包构建命令, build_ext是其子命令, 作用是告诉setuptools当前在执行构建拓展的操作. --inplace则是build_ext的子选项, 用于声明拓展文件的放置位置, 默认情况下编译完成的拓展文件会被放置于临时的build/目录下, 而inplace则覆盖该默认行为并将编译好的文件放置于于源文件相同的目录中.
第2步则是用于构建.egg-info文件, 使pip工具能够正确的识别和管理当前的包, 其文件本身是旧格式的Python包元数据(metadata).
至此, detectron2的编译安装问题就暂时解决了.