点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

【导语】本文为大家介绍了一个TensorRT int8 量化部署 NanoDet 模型的教程,并开源了全部代码。主要是教你如何搭建tensorrt环境,对pytorch模型做onnx格式转换,onnx模型做tensorrt int8量化,及对量化后的模型做推理,实测在1070显卡做到了2ms一帧!

NanoDet简介

NanoDet (https://github.com/RangiLyu/nanodet)是一个速度超快和轻量级的Anchor-free 目标检测模型;和yolov4 tiny作比较(如下图),精度相当,但速度却快了1倍;对于速度优先的场景,nanodet无疑是一个好的选择。

NaooDet和其它轻量级网络对比

NanoDet损失函数GFocal Loss

目前比较强力的one-stage anchor-free的检测器(以FCOS,ATSS为代表)基本会包含3个表示:

  1. 分类表示

  2. 检测框表示

  3. 检测框的质量估计(在FCOS/ATSS中,目前采用centerness,当然也有一些其他类似的工作会采用IoU,这些score基本都在0~1之间) 存在问题1:classification score 和 IoU/centerness score 训练测试不一致。存在问题2:bbox regression 表示不够灵活,没有办法建模复杂场景下的uncertainty 对于第一个问题,为了保证training和test一致,同时还能够兼顾分类score和质量预测score都能够训练到所有的正负样本,作者提出一个方案:就是将两者的表示进行联合 对于第二个问题,作者选择直接回归一个任意分布来建模框的表示。一句话总结:基于任意one-stage 检测器上,调整框本身与框质量估计的表示,同时用泛化版本的GFocal Loss训练该改进的表示,无cost涨点(一般1个点出头)AP

NanoDet 检测头FCOS架构

FCOS系列使用了共享权重的检测头,即对FPN出来的多尺度Feature Map使用同一组卷积预测检测框,然后每一层使用一个可学习的Scale值作为系数,对预测出来的框进行缩放。FCOS的检测头使用了4个256通道的卷积作为一个分支,也就是说在边框回归和分类两个分支上一共有8个c=256的卷积,计算量非常大。为了将其轻量化,作者首先选择使用深度可分离卷积替换普通卷积,并且将卷积堆叠的数量从4个减少为2组。在通道数上,将256维压缩至96维,之所以选择96,是因为需要将通道数保持为8或16的倍数,这样能够享受到大部分推理框架的并行加速。最后,借鉴了yolo系列的做法,将边框回归和分类使用同一组卷积进行计算,然后split成两份。

FPN层改进PAN

原版的PAN和yolo中的PAN,使用了stride=2的卷积进行大尺度Feature Map到小尺度的缩放。作者为了轻量化的原则,选择完全去掉PAN中的所有卷积,只保留从骨干网络特征提取后的1x1卷积来进行特征通道维度的对齐,上采样和下采样均使用插值来完成。与yolo使用的concatenate操作不同,作者选择将多尺度的Feature Map直接相加,使得整个特征融合模块的计算量变得非常非常小。

NanoDet 骨干网络ShuffleNetV2(原始版本)

作者选择使用ShuffleNetV2 1.0x作为backbone,去掉了最后一层卷积,并且抽取8、16、32倍下采样的特征输入进PAN做多尺度的特征融合

环境配置

  • 环境配置和之前的文章《基于TensorRT量化部署yolov5 4.0模型》类似

  • ubuntu:18.04

  • cuda:11.0

  • cudnn:8.0

  • tensorrt:7.2.16

  • OpenCV:3.4.2

  • cuda,cudnn,tensorrt和OpenCV安装包(编译好了,也可以自己从官网下载编译)可以从链接: https://pan.baidu.com/s/1dpMRyzLivnBAca2c_DIgGw 密码: 0rct

  • cuda安装

  • 如果系统有安装驱动,运行如下命令卸载

  • sudo apt-get purge nvidia*

  • 禁用nouveau,运行如下命令

  • sudo vim /etc/modprobe.d/blacklist.conf

  • 在末尾添加

  • blacklist nouveau

  • 然后执行

  • sudo update-initramfs -u

  • chmod +x cuda_11.0.2_450.51.05_linux.run

  • sudo ./cuda_11.0.2_450.51.05_linux.run

  • 是否接受协议: accept

  • 然后选择Install

  • 最后回车

  • vim ~/.bashrc 添加如下内容:

  • export PATH=/usr/local/cuda-11.0/bin:$PATH

  • export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64:$LD_LIBRARY_PATH

  • source ~/.bashrc 激活环境

  • cudnn 安装

  • tar -xzvf cudnn-11.0-linux-x64-v8.0.4.30.tgz

  • cd cuda/include

  • sudo cp *.h /usr/local/cuda-11.0/include

  • cd cuda/lib64

  • sudo cp libcudnn* /usr/local/cuda-11.0/lib64

  • tensorrt及OpenCV安装

  • 定位到用户根目录

  • tar -xzvf TensorRT-7.2.1.6.Ubuntu-18.04.x86_64-gnu.cuda-11.0.cudnn8.0.tar.gz

  • cd TensorRT-7.2.1.6/python,该目录有4个python版本的tensorrt安装包

  • sudo pip3 install tensorrt-7.2.1.6-cp37-none-linux_x86_64.whl(根据自己的python版本安装)

  • pip install pycuda 安装python版本的cuda

  • 定位到用户根目录

  • tar -xzvf opencv-3.4.2.zip 以备推理调用

NanoDet 模型转换onnx

  • pip install onnx

  • pip install onnx-simplifier

  • git clone https://github.com/Wulingtian/nanodet.git

  • cd nanodet

  • cd config 配置模型文件(注意激活函数要换为relu!tensorrt支持relu量化),训练模型

  • 定位到nanodet目录,进入tools目录,打开export.py文件,配置cfg_path model_path out_path三个参数

  • 定位到nanodet目录,运行 python tools/export.py 得到转换后的onnx模型

  • python3 -m onnxsim onnx模型名称 nanodet-simple.onnx 得到最终简化后的onnx模型

onnx模型转换为 int8 tensorrt引擎

  • git clone https://github.com/Wulingtian/nanodet_tensorrt_int8_tools.git(求star)

  • cd nanodet_tensorrt_int8_tools

  • vim convert_trt_quant.py 修改如下参数

  • BATCH_SIZE 模型量化一次输入多少张图片

  • BATCH 模型量化次数

  • height width 输入图片宽和高

  • CALIB_IMG_DIR 训练图片路径,用于量化

  • onnx_model_path onnx模型路径

  • python convert_trt_quant.py 量化后的模型存到models_save目录下

tensorrt模型推理

  • git clone https://github.com/Wulingtian/nanodet_tensorrt_int8.git(求star)

  • cd nanodet_tensorrt_int8

  • vim CMakeLists.txt

  • 修改USER_DIR参数为自己的用户根目录

  • vim nanodet_infer.cc 修改如下参数

  • output_name模型有一个输出

  • 我们可以通过netron查看模型输出名

  • pip install netron 安装netron

  • vim netron_nanodet.py 把如下内容粘贴

    • import netron

    • netron.start('此处填充简化后的onnx模型路径', port=3344)

  • python netron_nanodet.py 即可查看 模型输出名

  • trt_model_path 量化的的tensorrt推理引擎(models_save目录下trt后缀的文件)

  • test_img 测试图片路径

  • INPUT_W INPUT_H 输入图片宽高

  • NUM_CLASS 训练的模型有多少类

  • NMS_THRESH nms阈值

  • CONF_THRESH 置信度阈值

  • 参数配置完毕

  • mkdir build

  • cd build

  • cmake ..

  • make

  • ./NanoDetEngine 输出平均推理时间,以及保存预测图片到当前目录下,至此,部署完成!

预测结果展示

预测结果, inference时间做到了2ms一帧

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「计算机视觉工坊」公众号后台回复:深度学习,即可下载深度学习算法、3D深度学习、深度学习框架、目标检测、GAN等相关内容近30本pdf书籍。

下载2

在「计算机视觉工坊」公众号后台回复:计算机视觉,即可下载计算机视觉相关17本pdf书籍,包含计算机视觉算法、Python视觉实战、Opencv3.0学习等。

下载3

在「计算机视觉工坊」公众号后台回复:SLAM,即可下载独家SLAM相关视频课程,包含视觉SLAM、激光SLAM精品课程。

重磅!计算机视觉工坊-学习交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近3000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

基于TensorRT完成NanoDet模型部署相关推荐

  1. 基于C++的PyTorch模型部署

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 PyTorch作为一款端到端的深度学习框架,在1.0版本之后 ...

  2. 基于Jetson NX的模型部署

    系统安装 系统安装过程分为3步: 下载必要的软件及镜像 Jetson Nano Developer Kit SD卡映像 https://developer.nvidia.com/jetson-nano ...

  3. 基于web端和C++的两种深度学习模型部署方式

    深度学习Author:louwillMachine Learning Lab 本文对深度学习两种模型部署方式进行总结和梳理.一种是基于web服务端的模型部署,一种是基... 深度学习 Author:l ...

  4. 【深度学习】基于web端和C++的两种深度学习模型部署方式

    深度学习 Author:louwill Machine Learning Lab 本文对深度学习两种模型部署方式进行总结和梳理.一种是基于web服务端的模型部署,一种是基于C++软件集成的方式进行部署 ...

  5. pytorch基于web端和C++的两种深度学习模型部署方式

    本文对深度学习两种模型部署方式进行总结和梳理.一种是基于web服务端的模型部署,一种是基于C++软件集成的方式进行部署. 基于web服务端的模型部署,主要是通过REST API的形式来提供接口方便调用 ...

  6. 基于TensorRT的深度学习模型部署实战教程!

    应用背景介绍 早在遥远的1989年,一家叫做ALVIVN的公司首次将神经网络用在汽车上,进行车道线检测和地面分割.时至今日,深度学习已经应用在自动驾驶系统的多个分支领域.首先是感知领域,常用的传感器有 ...

  7. tensorrt轻松部署高性能dnn推理_基于TensorRT车辆实时推理优化

    基于TensorRT车辆实时推理优化 Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehic ...

  8. tensorrt安装_基于TensorRT的BERT推断加速与服务部署

    BERT的出现真是广大NLPer的福音,在很多任务上能取得显著提升.不例外,作者在工作过程中也使用了BERT进行下游任务训练,但在感叹BERT真香的时候,它及其漫长的推断时间让人感到很为难.本文就记录 ...

  9. 使用TensorRT 和 Triton 在Jetson NX上的模型部署

    Jetson因为是基于arm的与传统基于x86的主机或服务器的模型部署略有差别,但基本类似,主要分为三步 模型转换为onnx 生成基于TensorRT的推理引擎 使用Triton完成部署 1.模型转换 ...

  10. 部署基于嵌入的机器学习模型的通用模式

    2020-01-31 21:00:32 作者:Robbe Sneyders 编译:ronghuaiyang 导读 给大家介绍一下如何在生产中部署基于嵌入的机器学习模型. 由于最近大量的研究,机器学习模 ...

最新文章

  1. 天问电子少年团DIY作品
  2. Win8Metro(C#)数字图像处理--2.24二值图像闭运算
  3. Versions maven plugin 修改版本
  4. python 多数据输出到txt_python-BeautifulSoup输出到.txt文件
  5. Flutter异步加载FutureBuilder重绘解决方案
  6. 基于WebQQ3.0协议写一个QQ机器人
  7. 请求参数 统一 管理 java_Retrofit+Rxjava+okhttp基本操作和统一处理 – R...
  8. 集合的交并差 -python
  9. 为什么不能在字符串上使用switch语句?
  10. python遍历文件夹内文件并检索文件中的中文内容
  11. java 物联网项目_物联网工程综合实践-JAVA WEB开发.ppt
  12. 利用t-SNE可视化Glove向量
  13. Pownerdesigner画用例图/类图/时序图
  14. 重新认识Windows计算器Calc(MatLab计算替代品)——你所不知道的细节
  15. 幂律分布(python)
  16. 从软件工程师到IT猎头:我的一点经…
  17. JS中的数组转变成JSON格式字符串的方法
  18. 内存碎片---内部碎片外部碎片
  19. 十大技术类公众微信号地址
  20. 人人都是设计师:主流七种平面版式

热门文章

  1. js动态计算移动端rem
  2. 动态改变 itemRenderer 。
  3. Android 英文文档下载地址
  4. NGINX配置之二: nginx location proxy_pass 后面的url 加与不加/的区别.
  5. 手机端判断触摸滑动方向
  6. windows上java调用gdal.jar报错
  7. Address already in use: bind 端口被占用的解决办法
  8. MySQL 索引最左匹配原则的理解
  9. 酷狗音乐linux版_酷狗音乐PC版 9.1新版本初体验
  10. z平面与s平面计算机控制稳定性,2 计算机控制系统分析