您现在的位置是:首页 > 正文

将训练好的 mmdetection 模型转为 tensorrt 模型

2024-02-01 02:34:23阅读 1

mmdetection 是商汤科技(2018 COCO 目标检测挑战赛冠军)和香港中文大学开源的基于Pytorch实现的深度学习目标检测工具箱,性能强大,运算效率高,配置化编程,比较容易训练、测试。但pytorch模型不易于部署,运算速度还有进一步提升的空间,当前比较有效的方法是将模型转换为行为相同的tensorrt模型,本文记录转换流程。

任务思路

转换mmdetection 的 pytorch模型到tensorrt模型有多种方法,本文使用 mmdetection-to-tensorrt 库作为核心,完成直接的模型转换。

该库跳过了通常的 pth -> onnx -> tensorrt 的转换步骤,直接从pth转成tensorrt模型,并且已经成功支持了很多mmdetection 的模型转换。

Support Model/Module
  • Faster R-CNN
  • Cascade R-CNN
  • Double-Head R-CNN
  • Group Normalization
  • Weight Standardization
  • DCN
  • SSD
  • RetinaNet
  • Libra R-CNN
  • FCOS
  • Fovea
  • CARAFE
  • FreeAnchor
  • RepPoints
  • NAS-FPN
  • ATSS
  • PAFPN
  • FSAF
  • GCNet
  • Guided Anchoring
  • Generalized Attention
  • Dynamic R-CNN
  • Hybrid Task Cascade
  • DetectoRS
  • Side-Aware Boundary Localization
  • YOLOv3
  • PAA
  • CornerNet(WIP)
  • Generalized Focal Loss
  • Grid RCNN
  • VFNet
  • GROIE
  • Mask R-CNN(experiment)
  • Cascade Mask R-CNN(experiment)
  • Cascade RPN
完成步骤
  • 配置环境
  • 安装tensorrt 7.2.3.4
  • 安装 mmdetection-to-tensorrt 库并安装依赖
  • 使用 mmdetection-to-tensorrt 转换模型
  • 结果测试

配置环境

本机 gpu Nvidia GTX 1080 服务器

时间 2021.03

  • 操作系统 Ubuntu 16.04

  • Nvidia 显卡驱动 460.39

  • Cuda 版本 11.1

  • Cudnn 版本 8.1.1

具体配置方法教程很多,在此不再赘述,需要根据个人具体情况配置

安装 tensorrt并配置环境

选择的版本是 tensorrt 7.2.3.4

建议Python环境安装 Anaconda

安装 PyCuda
pip install pycuda
安装tensorrt
  • 下载tensorrt

    • 链接 https://developer.nvidia.com/zh-cn/tensorrt

    • 选择 TensorRT-7.2.3.4.Ubuntu-16.04.x86_64-gnu.cuda-11.1.cudnn8.1.tar.gz

  • 解压

tar zxfv TensorRT-7.2.3.4.Ubuntu-16.04.x86_64-gnu.cuda-11.1.cudnn8.1.tar.gz

解压后文件夹内文件:

# ls
TensorRT-Release-Notes.pdf  bin  data  doc  graphsurgeon  include  lib  onnx_graphsurgeon  python  samples  targets  uff
  • 安装tensorrt

根据自己的 Python 版本选择合适的包进行安装

cd TensorRT-7.2.3.4/python
pip install tensorrt-7.2.3.4-cp37-none-linux_x86_64.whl
  • 安装graphsurgeon wheel
cd TensorRT-7.2.3.4/graphsurgeon
pip install graphsurgeon-0.4.5-py2.py3-none-any.whl
  • 配置环境变量
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda/lib64

export PATH=$PATH:"your_path_to_TensorRT-7.2.3.4"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"your_path_to_TensorRT-7.2.3.4/lib"
  • 测试
python
import tensorrt
tensorrt.__version__

--> '7.2.3.4'

安装 mmdetection

  • 链接 https://github.com/open-mmlab/mmdetection
  • 安装文档 https://github.com/open-mmlab/mmdetection/blob/master/docs/get_started.md
安装 mmcv
pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/{cu_version}/{torch_version}/index.html
下载并安装 mmdetection
  • 下载
git clone git@git.zhlh6.cn:open-mmlab/mmdetection.git
  • 配置环境并安装
cd mmdetection
pip install -r requirements/build.txt
pip install -v -e .  # or "python setup.py develop"

安装 mmdetection-to-tensorrt

  • 链接 https://github.com/grimoire/mmdetection-to-tensorrt
安装 torch2trt_dynamic
git clone git@git.zhlh6.cn:grimoire/torch2trt_dynamic.git
cd torch2trt_dynamic
python setup.py develop
安装 amirstan_plugin
git clone --depth=1 git@git.zhlh6.cn:grimoire/amirstan_plugin.git
cd amirstan_plugin
  • 更新子模块
git submodule update --init --progress --depth=1

讲道理一句话就可以了,不过我在执行这句命令时报错,如果没报错继续下面的步骤

子模块更新报错解决方案

http协议不好用,需要改成git

  • 修改 amirstan_plugin/.gitmodules 文件

将第三行地址改为 git@github.com:NVIDIA/cub.git

[submodule "third_party/cub"]
	path = third_party/cub
	url = git@github.com:NVIDIA/cub.git 
	branch = 1.8.0
  • 修改 amirstan_plugin/.git/modules/third_party/cub/config

remote "origin" 地址改为 git@github.com:NVIDIA/cub.git

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	worktree = ../../../../third_party/cub
[remote "origin"]
	url = git@github.com:NVIDIA/cub.git 
	fetch = +refs/heads/main:refs/remotes/origin/main
[branch "main"]
	remote = origin
	merge = refs/heads/main
  • 再次执行
git submodule update --init --progress --depth=1
  • 新建build文件夹
mkdir build
cd build
  • 生成 makefile
cmake -DTENSORRT_DIR=${your_path_to_tensorrt} ..

若输出:

-- Found TensorRT headers at ../TensorRT-7.2.3.4/include
-- Find TensorRT libs at  ../TensorRT-7.2.3.4/lib/libnvinfer.so; ../TensorRT-7.2.3.4/lib/libnvparsers.so; ../TensorRT-7.2.3.4/lib/libnvinfer_plugin.so
-- Found TENSORRT:  ../TensorRT-7.2.3.4/include  
-- WITH_DEEPSTREAM: false
-- GPU_ARCHS is not defined. Generating CUDA code for default SMs: 35;53;61;70;75;80
-- Configuring done
-- Generating done
-- Build files have been written to:  ../amirstan_plugin/build

则说明 makefile 生成成功,保存在 build 文件夹下

  • 编译
make -j10

此时在build/lib文件夹下生成了很多文件

# ls
libadaptivePoolPlugin_static.a  libcarafeFeatureReassemblePlugin_static.a  libexViewPlugin_static.a             liblayerNormPlugin_static.a     libroiPoolPlugin_static.a         libtorchEmbeddingPlugin_static.a 
libamir_cuda_util.a             libdeformableConvPlugin_static.a           libgridAnchorDynamicPlugin_static.a  libmeshGridPlugin_static.a      libtorchBmmPlugin_static.a        libtorchFlipPlugin_static.a
libamirstan_plugin.so           libdeformablePoolPlugin_static.a           libgridSamplePlugin_static.a         librepeatDimsPlugin_static.a    libtorchCumMaxMinPlugin_static.a  libtorchGatherPlugin_static.a
libbatchedNMSPlugin_static.a    libdelta2bboxPlugin_static.a               libgroupNormPlugin_static.a          libroiExtractorPlugin_static.a  libtorchCumPlugin_static.a        libtorchNMSPlugin_static.a
  • 配置环境变量
export AMIRSTAN_LIBRARY_PATH=<amirstan_plugin_root>/build/lib
安装 mmdetection-to-tensorrt

进入 mmdetection-to-tensorrt 根目录

python setup.py develop
  • 测试是否成功
# pip show mmdet2trt

-->
Name: mmdet2trt
Version: 0.3.0
Summary: mmdetection to tensorrt converter
Home-page: UNKNOWN
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Location: /workspace/nfs/tensorrt_test/mmdetection-to-tensorrt
Requires: 
Required-by: 

测试

  • mmdetection-to-tensorrt 项目中,运行 demo 文件夹下的 inference.py 文件

  • 修改inference.py 文件中的 parser 参数 :

    • img:测试图像路径
    • config:mmdetection 的模型配置文件
    • checkpoint:模型 pth 文件路径
    • save_path:tensorrt 模型存放路径
    • score-thr:检测有效阈值
  • 配置好后运行该文件即可以生成模型在测试图像上的检测结果

参考资料

  • https://github.com/grimoire/mmdetection-to-tensorrt

  • https://zhuanlan.zhihu.com/p/165359425

网站文章

  • 多样性数据源报表如何做?几行代码就能解决。

    多样性数据源报表如何做?几行代码就能解决。

    ​现代应用已经进入多数据源阶段了,不再是一个单一的数据库包打天下,一个应用中会涉及除关系数据库外各种数据源,如文本文件类数据、NOSQL、多维数据库、HTML Webservice等等,即使是关系数据...

    2024-02-01 02:34:17
  • C#读取CSV文件 热门推荐

    C#读取CSV文件功能属性标签反射部分Csv读取的class读取文件读取title(字段名!)读取数据(values)将读取的字段名(title)和数据集合(二维数组)序列化结束语 功能 读取CSV文...

    2024-02-01 02:34:10
  • SpringBoot整合缓存(Caffeine、Redis)

    SpringBoot整合缓存(Caffeine、Redis)

    Bean如果不添加其他信息直接注入一个也行。

    2024-02-01 02:34:02
  • Java将JSON字符串与自定义对象之间的转化

    Java将自定义对象转化为JSON字符串JsonUtil.toJson(A);Java将JSON字符串转化为自定义对象InputStream in = req.getInputStream();String json = Streams.asString(in);A a = JsonUtil.of(json, A.class);

    2024-02-01 02:33:33
  • 算法设计与分析 第三章 动态规划

    算法设计与分析 第三章 动态规划

    一、思维导图 二、经典例题 1.矩阵链乘问题 (1)最优子结构证明: 假设有一个连续相乘的矩阵,要使相乘的次数最少。现在假设,x{i…j}是一个最优加括号方案。那么x{i…j} = x{i,k}+x{k+1,j},若x{i…k}是不是其子问题的最优解,那么一定存在一个y{i…k}为其子问题的最优解,那么一定有y{i…k}+x{k+1}

    2024-02-01 02:33:27
  • Qt QStandardItemModel用法(超级详细)

    Qt QStandardItemModel用法(超级详细)

    QStandardItemModel 是标准的以项数据(item data)为基础的标准数据模型类,通常与 QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能。本节介绍 QStandardltemModel 的使用,主要用到以下 3 个类:QStandardItemModel:基于项数据的标准数据模型,可以处理二维数据。维护一个二维的项数据数组,每个项是一...

    2024-02-01 02:33:20
  • post发送后加号丢失

    +为post特殊字符,所以传递后会丢失,要解诀这个问题,首先要加传递的内容进行加密。然后再解密。C#编码:Server.UrlEncode(ur)C#解码:Server.UrlDecodeJquery解码:decodeURIComponent(url);Jquery编码:encodeURIComponent(url);...

    2024-02-01 02:32:52
  • c语言遍历枚举,枚举类型的使用及进行循环

    该楼层疑似违规已被系统折叠隐藏此楼查看此楼1. 枚举的定义枚举类型定义的一般形式为:enum 枚举名{ 枚举值表 }; 在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。例如: 该枚举名为week...

    2024-02-01 02:32:44
  • Macos下跑通全景视频开源项目fraunhoferhhi/omaf.js

    Macos下跑通全景视频开源项目fraunhoferhhi/omaf.js

    项目地址:https://github.com/fraunhoferhhi/omaf.js.git 1. 安装nginx brew install nginx 2. 下载代码 mkdir ~/omaf...

    2024-02-01 02:32:38
  • vue-element-admin 和 python django 前后端分离 开撸(新手学习,高手指点) 热门推荐

    vue-element-admin 和 python django 前后端分离 开撸(新手学习,高手指点) 热门推荐

    一、python django 项目建立 1、django安装方法:运行命令:pip3 install django。(pip3和python3安装方法请自行百度); 2、创建django项目   在linux等命令行界面下,使用django提供的命令 django-admin startproject back 注:back你的项目名。创建之后的目录结构如图红框: 可以运...

    2024-02-01 02:32:12