介绍
DCNv4是可变形卷积的第四版本也是今年2024年1月份公示的,其在网络结构上和DCNv3是差不多的,最突出的优点的减小了内存访问带来的负担,加快收敛的速度,在不失精度的情况下能把速度大幅度提升,在论文作者的实验里面不对DCNv4做任何的处理,仅仅是将其替换原本DCNv3,速度提升了80%。
论文地址:[2401.06197] Efficient Deformable ConvNets: Rethinking Dynamic and Sparse Operator for Vision Applications (arxiv.org)https://arxiv.org/abs/2401.06197
源码地址:
OpenGVLab/DCNv4: [CVPR 2024] Deformable Convolution v4 (github.com)https://github.com/OpenGVLab/DCNv4
编译DCNv4
Linux编译
如果你的系统是Linux的话就很容易了,直接运行make.sh这个文件或者是和windows一样输入python代码来编译,基本上都能一次性解决(但是Linux没用过的话前期配置真的很烦人,搞的我快疯了都)
Windows编译
DCNv4和旧版本的DCNv3一样是需要进行编译的,直接进入DCNv4的目录下面找到setup.py文件然后终端输入
python setup.py build install
如果成功了就万事大吉,但是对于windows用户来说一般很难一次性成功,我也是搞了好久最后编译成功的(可提供windows编译环境)
报错汇总(持续更新)
1.页面大小不足
这个两个解决方法一个是修改虚拟内存大小,具体操作很多博主也写了,我自己是直接把works=8修改成works=0就解决了
2.RuntimeError: Not implemented on the CPU
这里是说我们的DCNv4在一些操作中用到CPU来训练,但是我们是要他在GPU上跑才行,然后我的解决方法是
首先找到\ultralytics-main\ultralytics\nn\task.py下的class DetectionModel(BaseModel),添加如下代码
if isinstance(m, (Detect, Segment, Pose)):
s = 256 # 2x min stride
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") #增加的,将模型放入GPU运行
m.inplace = self.inplace
m.cuda() #增加的,将模型放入GPU运行
forward = lambda x: self.forward(x)[0] if isinstance(m, (Segment, Pose)) else self.forward(x)
m.stride = torch.tensor([s / x.shape[-2] for x in forward(torch.zeros(1, ch, s, s).to(device))]) # forward 在张量后加了一个to(device)
然后在找到_predict_once函数添加一段代码
def _predict_once(self, x, profile=False, visualize=False, embed=None):
self.cuda()//添加使用GPU
"""
Perform a forward pass through the network.
Args:
x (torch.Tensor): The input tensor to the model.
profile (bool): Print the computation time of each layer if True, defaults to False.
visualize (bool): Save the feature maps of the model if True, defaults to False.
embed (list, optional): A list of feature vectors/embeddings to return.
Returns:
(torch.Tensor): The last output of the model.
"""
两个地方改完了就成功解决这个问题了