手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX2,Xavier等,亲测有效
maskrcnn模型与代码keras版本
代码链接:git clone
https://github.com/matterport/Mask_RCNN.git
本文基于tensorflow-gpu1.15.0
cuda10.2
cudnn==7.6.5
Tensorrt==7.0.0.11(6.0.1.5测试过有效)版本与cuda,cudnn等版本对应即可
下载链接:nVidia官方网站即可,本文版本:TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn7.6.tar.gz
本次测试平台:1660ti 台式机(PC:tensorflow:3Hz,tensorrt-fp32:7Hz,tensorrt-fp16:12Hz)Xavier(tensorrt-fp32:1.8Hz,tensorrt-fp16:7.8Hz)
安装tensorflow,cuda,cudnn,本次不做任何教程,网上多到吐血,自行配置安装即可,本文直接开始安装tensorrt,模型转换,与测试效果。开造……
TensorRT 为什么能够做到加速?速度提升约3倍呢?
TensorRT之所以能加速神经网络的的推断主要得益于两点。首先是TensorRT支持INT8和FP16的计算,通过在减少计算量和保持精度之间达到一个理想的trade-off,达到加速推断的目的。
更为重要的是TensorRT对于网络结构进行了重构和优化,主要体现在一下几个方面。
第一是tensorRT通过解析网络模型将网络中无用的输出层消除以减小计算。
第二是对于网络结构的垂直整合,即将目前主流神经网络的conv、BN、Relu三个层融合为了一个层,例如将图1所示的常见的Inception结构重构为图2所示的网络结构。
第三是对于网络的水平组合,水平组合是指将输入为相同张量和执行相同操作的层融合一起,如图2向图3的转化。
第四是对于concat层,将contact层的输入直接送入下面的操作中,不用单独进行concat后在输入计算,相当于减少了一次传输吞吐。如图所示:
第一和第二步适用于所有的网络架构,但是第三步则对于Inception结构的神经网络加速效果最为明显。
因此:将TensorRT应用在NVIDIA 的TX1或者TX2上,或者Xavier上,可实现深度学习网络的时时推荐,且不需在内存较少的嵌入式设备上部署任何深度学习框架。
Ubuntu 18.04 安装配置TensorRT 7.0
官网https://developer.nvidia.com/tensorrt下载对应版本的TensorRT(示例为 cuda 10.2 cudnn 7.6),需注册账号、填写问卷调查方可下载。
解压、设置环境变量
TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn7.6.tar.gz解压至本地,(记住路径,后续会用到)。
tar -zxvf TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.0.cudnn7.6.tar.gz
设置添加至环境变量
>vim /etc/profile#加入下面的环境变量
>
> export TENSORRT_ROOT={你的tensorrt目录}
> export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:{你的tensorrt目录}/lib
> #保存:wq
>
> source /etc/profile
安装tensorrt
pip3 install tensorrt-7.0.0.11-cp36-none-linux_x86_64.whl
安装uff和graphsurgeon
xxx/TensorRT-7.0.0.11/下有uff和graphsurgeon,分别安装两个文件夹下的安装包 (本文python36)
cd /TensorRT-7.0.0.11/uff
pip3 install uff-0.6.5-py2.py3-none-any.whl
cd /TensorRT-7.0.0.11/graphsurgeon/
pip3 install graphsurgeon-0.4.1-py2.py3-none-any.whl
测试
python
>>import tensorrt
>>
>>import uff
>>
>>import graphsurgeon
>>
没啥问题就ok了,有问题对应找出来改个版本就可以。
也可以编译下面的例子运行
命令行切换进目录TensorRT-7.0.0.11\data\mnist,运行:
python download_pgms.py
下载所需数据,
然后切换到 TensorRT-7.0.0.11/samples/sampleMNIST/ ,编译项目生成可执行文件
make
#切换到bin路径
cd …/…/bin
./sample_mnist
Ubuntu 18.04 安装配置TensorRT 7.0搞定即可!
Ubuntu18.04编译TensorRT7.0 MaskRCNN例子和模型转化
1. Clone github 的TensorRT库
2. 开始编译
3. 修改conv2d_transpose function in UFF的conversion_functions.py
4. 下载Mask R-CNN库并设置PYTHONPATH.
5. Apply the patch into Mask R-CNN repo to update the model from NHWC to NCHW
6. 下载Mask-RCNN所必须的包
7. 将h5模型转为uff模型
8. 转换测试图片到.ppm格式
9. 转换
10.输出
测试tensorrt的maskrcnn例子,官方code为: sampleUffMaskRCNN
1. Clone github 的TensorRT库
git clone -b release/7.0 https://github.com/nvidia/TensorRT TensorRT
cd TensorRT
git submodule update --init --recursive
2. 开始编译
注*:Cmake 版本必须大于3.13,可自行检查安装。
编译之前有几个关键文件需要修改,后面Xavier编译测试的时候也需要修改,修改这个几个文件的参数跟自己训练模型时用的参数应该一致,最少有类别数和label名称:如下图。
- TensorRT\samples\opensource\sampleUffMaskRCNN\mrcnn_config.h
- TensorRT\plugin\multilevelProposeROI\tlt_mrcnn_config.h
依然:最少是类别数和类别名称,其他的可自行测试。 - \TensorRT\plugin\proposalLayerPlugin\mrcnn_config.h
该文件与1. 相同。
然后再编译:
export TRT_SOURCE=`pwd`
export TRT_RELEASE=`pwd`/home/Download/TensorRT-7.0.7.11 #tensorrt安装目录
cd $TRT_SOURCE
mkdir -p build && cd build
cmake .. -DTRT_LIB_DIR=$TRT_RELEASE/lib -DTRT_BIN_DIR=`pwd`/out ##如果make有错,有的可能需要指定gcc安装路径。
make -j$(nproc) #有时候会出错,单独make就没事了,多线程make可能会有调用顺序错误。
3. 修改conv2d_transpose function in UFF的conversion_functions.py
gedit /home/(my_pc_name)/.local/lib/python3.6/site-packages/uff/converters/tensorflow/converter_functions.py
找到524行,更换通道顺序
uff_graph.conv_transpose(
inputs[0], inputs[2], inputs[1],
strides, padding,
dilation=None, number_groups=number_groups,
left_format=lhs_fmt, right_format=rhs_fmt,
name=name, fields=fields
)
4. 下载Mask R-CNN库并设置PYTHONPATH.
路径可随意,但是知道在哪就可以
git clone https://github.com/matterport/Mask_RCNN.git
export PYTHONPATH=$PYTHONPATH:$PWD/Mask_RCNN
5. Apply the patch into Mask R-CNN repo to update the model from NHWC to NCHW
cd Mask_RCNN
git checkout 3deaec5
git am $TRT_SOURCE/samples/opensource/sampleUffMaskRCNN/converted/0001-Update-the-Mask_RCNN-model-from-NHWC-to-NCHW.patch
6. 下载Mask-RCNN所必须的包
pip3 install imgaug
pip3 install keras==2.1.6
7. 将h5模型转为uff模型
将训练好的模型为mask_rcnn_coco.h5 (257.6MB),需要事先根据你的分割任务训练好。
保存到 指定目录下.
cd $TRT_SOURCE/samples/opensource/sampleUffMaskRCNN/converted/
修改config.py文件,注意一定在转换之前修改,转换之后再修改sampleUffMaskRCNN/config.h无效。
修改mrcnn_to_trt_single.py文件,第91行将类别80+1改为你分类的类别
8. 转换测试图片到.ppm格式
from PIL import Image
image = Image.open("1.jpg")
image.save("001763.ppm")
图片的话cpp里面加载两个,名称可自行修改。
9. 转换
python3 mrcnn_to_trt_single.py -w /path/to/data/mask_rcnn_coco.h5 -o /path/to/data/mrcnn_nchw.uff -p ./config.py
10.输出
UFF Output written to /…………/Mask_RCNN/data/mrcnn_nchw.uff (257MB)
UFF Text Output written to /…………/Mask_RCNN/data/mrcnn_nchw.pbtxt (1.1MB)
Xavier 或者PC上编译安装TensorRT7.0的SampleUffMaskRCNN示例程序(Tx1,Tx2都可以)
Xavier 刷机Jetpack 4.4,自行安装哈
Jetpack 4.4 默认cuda10.2 ,cudnn7.6.5, 安装tensorrt7.0(与上步骤相同)
下载TensorRT7.0库
cd Downloads
git clone -b release/7.0 https://github.com/NVIDIA/TensorRT.git TensorRT
cd TensorRT/
git submodule update --init --recursive
编译sampleUffMaskRCNN
切记!切记!切记!编译之前依然需要修改如上所示路径的三个文件;
export TRT_SOURCE=`pwd`
mkdir -p build && cd build
cmake .. -DTRT_LIB_DIR=$TRT_RELEASE/lib -DTRT_BIN_DIR=`pwd`/out (-D CMAKE_C_COMPILER="/usr/bin/gcc")
make sample_uff_maskRCNN -j$(nproc)
如果 make sample_uff_maskRCNN -j$(nproc)出现:
The C compiler identification is unknown
CMake Error at CMakeLists.txt:12 (project):
No CMAKE_C_COMPILER could be found.
Tell CMake where to find the compiler by setting either the environment
variable “CC” or the CMake cache entry CMAKE_C_COMPILER to the full path to
the compiler, or to the compiler name if it is in the PATH
上步骤中cmake用:
cmake .. -DTRT_LIB_DIR=$TRT_RELEASE/lib -DTRT_BIN_DIR=`pwd`/out (-D CMAKE_C_COMPILER="/usr/bin/gcc")
cmake … -DTRT_LIB_DIR=$TRT_RELEASE/lib -DTRT_BIN_DIR=pwd
/out (-D CMAKE_C_COMPILER="/usr/bin/gcc")
git指示:TX2为aarch64架构,在make时要指定架构:make sample_uff_maskRCNN -j$(nproc) TARGET=aarch64。但我直接make,没出问题。
效果测试:
总算到这了:
$ cd Tensort/build/out/
$ ./sample_uff_maskRCNN -d /path #(放置转后图片.ppm,和uff模型:mrcnn_nchw.uff (257MB),mrcnn_nchw.pbtxt (1.1MB)的文件夹路径)。
过好一会,就会打印检测目标的class_name,score, ROI 四个点的坐标值。存取检测结果到out文件下,0.ppm
Finish!有任何问题随时留言。