引言
本文主要以目标检测算法CenterNet作为载体,介绍可变形卷积的算法原理,python实现以及工程化部署
可变形卷积原理介绍
可变形卷积目前有DCN V1以及在V1基础上改进发展来的DCN V2,具体的算法原理可以看论文原文或者参考:
https://cloud.tencent.com/developer/article/1679389
可变形卷积的实现
这里主要参考:https://cloud.tencent.com/developer/article/1638363 中的讲解
CenterNet中实现DCN V2的工程化部署
这里主要参考的代码为:https://github.com/CaoWGG/TensorRT-CenterNet
这里参考:
有几个点需要事先说明:
为了能够实现对于模型的量化,需要将CenterNet模型先转换为ONNX,然后利用tensorRT官方公布的onnx-tensorrt库来实现tensorRT模型的转化
由于TensorRT中不支持可变形卷积的操作,所以需要自定义plugin来进行实现
CenterNet中DCNV2的plugin定义在onnx-tensorrt文件夹中,分别为:
dcn_v2_im2col_cuda.cu和dcn_v2_im2col_cuda.h;DCNv2.cpp和DCNv2.h,其中DCNv2.cpp和DCNv2.h为tensorRT中自定义plugin的文件,具体代码如下:
1 | DCNv2Plugin::DCNv2Plugin(int in_channel, |
然后需要将以上plugin定义好的op在onnx-tensorrt中builtin_op_importers.cpp文件中进行插件的注册操作:
1 | DEFINE_BUILTIN_OP_IMPORTER(DCNv2) { |
在builtin_plugins.cpp也进行注册:
1 | REGISTER_BUILTIN_PLUGIN("DCNv2", DCNv2Plugin); |
然后需要在onnx-tensorrt中的CMakeLists.txt里添加上定义plugin对应的源码并将其链接到动态库中:
1 | # 定义插件源码 |
最后在链接以上生成的库来进行tensort标准C++ API函数进行前向推理以及模型转换操作