使用变形卷积V1有两种方式:
1、通过自定义op的方式在自己的python环境里定义deform_conv这一op。定义op的.cpp以及.cu文件可以参考git项目:
[mmdetection](https://github.com/open-mmlab/mmdetection)
2、包torchvision的 较新版本(大于等于0.6.0)中已经定义好变形卷积。首先通过`pip install torchvision`安装最新版本,之后在pycharm里使用变形卷积的过程为:(我的环境下python版本为3.6)
import torch
from torchvision.ops import DeformConv2d
model = DeformConv2d(in_channels=1, out_channels=1, kernel_size=3, padding=1)
x = torch.rand(1, 1, 256, 256)
offset = torch.rand(1, 2*3*3, 256, 256)
out = model(x, offset)
print(out)
为了使用更加方便,可以将DeformConv2d进一步封装成一个模块,这样调用时就和常规卷积nn.Conv2d()一样简单,代码如下:
class Deform_Conv_V1(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1,
padding=1, dilation=1, groups=1, offset_group=1):
super(Deform_Conv_V1, self).__init__()
offset_channels = 2 * kernel_size * kernel_size
self.conv_offset = nn.Conv2d(
in_channels,
offset_channels * offset_group,
kernel_size = kernel_size,
stride = stride,
padding = padding,
dilation= dilation,
)
self.DCN_V1 = ops.DeformConv2d(
in_channels,
out_channels,
kernel_size= kernel_size,
stride= stride,
padding= padding,
dilation = dilation,
groups = groups,
bias = False
)
def forward(self, x):
offset = self.conv_offset(x)
# print(offset.shape)
return self.DCN_V1(x, offset)
封装以后,如果想在我们的模型中使用DCN-V1,只需要添加如下代码:
Deform_Conv_V1(in_channel=1, out_channel=1, kernel_size=3, padding=1)
目前,使用V2只能通过自定义op的方式。还是参考第一部分给的链接的源码。在Github上下载下来项目源码,我们只需要其中的一个子文件夹mmdection/mmdet/ops/dcn。
将需要的文件整理到自己的项目目录下,参考我的是XXX\Models\ops。
之后,在自己的环境下编写相应的setup.py脚本,该脚本用于编译定义的.cpp和.cu文件。编译时,需要用pip安装pytest、pybind11,若还是编译失败,则需要安装python3-dev和pyyaml。
直接`pip install python3-dev`会失败,执行以下两条命令:
sudo apt-get install aptitude
sudo aptitude install python3-dev
from setuptools import setup
from torch.utils.cpp_extension import BuildExtension, CUDAExtension
setup(
name = 'Deform_conv', # 这里是你自定义的op的名字,自己设置即可
ext_modules = [
CUDAExtension('Deform_conv', [
'/home/XXX/Models/ops/src/deform_conv_cuda.cpp', # 自定义op的cpp文件的路径
'/home/XXX/Models/ops/src/deform_conv_cuda_kernel.cu', # 自定义op的cu文件的路径
]),
],
cmdclass={
'build_ext': BuildExtension
}
)
编写好脚本以后,在setup.py目录下,打开命令行,切换到对应的环境(如我想在我的名为DCN的conda环境下安装变形卷积,就切换到DCN这一环境),执行python setup.py install进行编译。编译成功后,import Deform_conv应该就没问题了。
我编译成功的环境的配置为:
python3.6 torchvision0.4.2 cuda10.0 gcc5.4