ImportError: cannot import name ‘deform_conv_cuda’ from ‘assets.ops.dcn’
在DBNet++的复现中,搭建好环境进行自己的数据集训练时,运行train.py文件,出现了报错。
这里出现问题是在DB-master\assets\ops\dcn文件夹下,出问题的主要语句是在dcn文件夹下的function中deform_conv.py和deform_pool.py里。
其中的from … import deform_conv_cuda
如下列
deform_conv_cuda不能够正常调用,我在网上找到了这个问题出现的原因。
根因是mmdetection版本问题,在mmdetction github的issue中有对应的讨论。网址如下:
https://github.com/open-mmlab/mmdetection/issues/413#issuecomment-515299000
根据其中的高赞回答,我将解决方法锁定在
在DBNet模型训练的具体实现中,这要求我们cd到DB-master\assets\ops\dcn文件夹下,执行操作
python setup.py develop
但是这步运行又会出现如下报错
这步我搜索了很久,但是找不到直接关联的解决方法,大部分都是指向重新安装torch。但DBNet的环境安装应该是没有问题的,所以我开始找其他的解决办法。
重新回到问题的本质,问题出在deform_conv_cuda不能正常import,我又从github上其他的代码issue中寻找相关的问题,很快发现了下面这篇
https://github.com/MhLiao/DB/issues/298
该用户提到了c++代码,这也是该库不能直接调用的一个关键,而他后续提到的头部插入的代码AT_CHECK也是应和了上一个报错信息的显示,因此让我们到DB-master\assets\ops\dcn\src文件夹下,找到4个cpp文件(实际是2个cpp,2个cu)在它们的头部插入下述三行代码:
#ifndef AT_CHECK
#define AT_CHECK TORCH_CHECK
#endif
之后返回上一级文件夹DB-master\assets\ops\dcn,然后运行
python setup.py develop
这次能够顺利运行了,原本check的部分不会报错了(这里图有点不清晰,就不上图了)。当setup.py运行完毕,我们重新回到DBNet的复现,运行train.py开始我们的训练,能够正常运行了。
当然这个方法应该不只适用于DBNet,因为我在搜索问题的过程中看到了很多其他代码出现了与本文相同的问题语句,但是大家都知道csdn上全是复制粘贴,找的到问题但是很难找到解决方法。大部分的问题解决还是要通过github,尤其是自己复现代码时对应的源码的讨论区。
本方法主要还是关于mmdetction中from … import deform_conv_cuda的解决方法。