部分vs版本,例如最新的vs2022可能在detectron2编译时报错:
lazy_init_num_threads@internal@at@@YAXXZ@4_NA vision.obj : error LNK2001: 无法解析的外部符号 __imp___tls_index_?init@?1??
可能的原因是vs2022的线程初始化有一些问题,这可能是vs的一个bug,也有可能是pytorch的bug,在未来的版本可能会修复,我在安装detectron2时是没有遇到这个问题的。这里给出解决办法:
方法一:添加临时的环境变量
注意!这种方法添加的环境变量在关闭命令行之后就会失效
找到vs安装目录下的vcvars64.bat文件,使用命令行打开,例如我的文件位置在E:\VSIDE\VC\Auxiliary\Build\vcvars64.bat,那么在命令行中输入:
E:\VSIDE\VC\Auxiliary\Build\vcvars64.bat
开启VS2022的x64环境,接着输入三条指令:
set MAX_JOBS=4
set DISTUTILS_USE_SDK=1
set OMP_NUM_THREADS=1
然后尝试在当前命令行窗口中重新安装detectron2.
方法二:在系统环境变量中添加
这个方法就是在环境变量中添加,自行搜索win10/11添加系统环境变量。这种方法优点是不需要每次开启新命令行是都使用set XXX命令
方法三:在vcvars64.bat中添加
使用记事本打开vcvars64.bat,在原有的文本后输入三个set命令:
不推荐这种办法,因为会修改vs文件。
该解决办法来自github的pull89511,pytorch的源码中有模棱两可的说法的问题,最简单的办法如下:
将pytorch源码的parallel.h中第32行的(如果你是base环境,那么位置在anaconda3\Lib\site-packages\torch\include\ATen\Parallel.h)
inline TORCH_API void lazy_init_num_threads() {
更改为:
inline void lazy_init_num_threads() {
注意,如果你有多个python环境安装了多个pytorch,那会有很多个Parallel.h,要找到你在使用的环境的pytorch源码目录(一定要找对,不然修改了不起作用)。例如我有一个叫py38的环境,那么我pytorch源码的路径就是anaconda3\envs\py38\Lib\site-packages\torch\include\ATen\Parallel.h
如果觉得找文件很麻烦,这里推荐一个软件everything,可以非常快搜索电脑上的文件。
想要进一步了解错误产生原因的建议进pull89511仔细看一下。
由于Facebook的detectron2没有对windows平台做官方支持,所以在安装的时候发生了很多问题,于是有了这篇问题记录的贴子。截至2022.11.28GitHub上detectron2的版本为0.6。
如果文章对你有帮助请给我一个小小的赞。
pyhon 3.7.6
cuda 11.6
pytorch 1.13
由于安装需要编译,请安装VS的C++开发环境
官方github源码地址
使用git命令下载
git clone https://github.com/facebookresearch/detectron2.git
使用pip命令安装
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
如果需要前置安装包,按要求下载即可。
为什么要手动安装pycocotools?
首先是pycocotools官方不支持windows系统,detectorn2却需要pycocotools,到时候安装detectron2时也会自动调用pip安装,但是会安装失败(因为直接pip install pycocotools会报错)。
1)修改setup.py
将setup.py中install_requires内容做如下修改(大概在165行):
"pycocotools>=2.0.2" 修改为 "pycocotools"
因为windows版本的pycocotools最新为2.0版本,故需要删除版本要求。修改完成后保存即可。
2)修改detectron2\detectron2\layers\csrc\nms_rotated\nms_rotated_cuda.cu文件
将using namespace detectron2;这一行之前(其实就是1-12行)的内容用如下程序段替代(其实就是注释了部分内容):
#include
#include
#include
#include
/*#ifdef WITH_CUDA
#include "../box_iou_rotated/box_iou_rotated_utils.h"
#endif
// TODO avoid this when pytorch supports "same directory" hipification
#ifdef WITH_HIP
#include "box_iou_rotated/box_iou_rotated_utils.h"
#endif*/
#include "box_iou_rotated/box_iou_rotated_utils.h"
这样改的原因参见GitHub网页的issues2769
上述步骤都完成后,就可以安装detectron2了,使用官方安装文档的代码:
python -m pip install -e detectron2
注意此时终端的路径应该是detectron2的上一级目录,比如你使用git clone将源码拷贝到了D:/detectron2,那么你的pip命令执行时终端的目录应该在D盘根目录。
安装过程中请保持网络畅通,pip需要下载detectron2的依赖包,因为网络原因下载失败的话请多试几次。
等待几分钟安装就完成了。 注意,如果pip出现红字提醒你版本不匹配或者有其他包没有安装的话,请安装提示更新或者安装对应版本的包即可。
参考官方文档的Getting Started部分,切换终端路径到demo,输入代码:
python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --webcam --opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl
--webcam 使用摄像头测试,如果要测试图片,使用--input指令:
python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \
--input input1.jpg input2.jpg --opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl
得到检测结果
以上就是detecron2安装的全部内容了,如果有什么问题或者疑问欢迎在评论区或私信指出。