手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX1下,TX2,Xavier等嵌入式开发板,亲测有效!

手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX2,Xavier等,亲测有效

maskrcnn模型与代码keras版本

代码链接:git clone
https://github.com/matterport/Mask_RCNN.git

本文基于tensorflow-gpu1.15.0
cuda
10.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 自己的MaskRCNN例子和模型转化---sampleuffMaskRCNN。可用于nvidia-TX2,Xavier等,亲测有效
      • Ubuntu 18.04 安装配置TensorRT 7.0
        • 解压、设置环境变量
      • 安装tensorrt
      • 安装uff和graphsurgeon
      • 测试
        • 也可以编译下面的例子运行
      • 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.输出
    • Xavier 或者PC上编译安装TensorRT7.0的SampleUffMaskRCNN示例程序(Tx1,Tx2都可以)
        • Xavier 刷机Jetpack 4.4,自行安装哈
        • 下载TensorRT7.0库
        • 编译sampleUffMaskRCNN
        • 效果测试:

TensorRT 为什么能够做到加速?速度提升约3倍呢?
TensorRT之所以能加速神经网络的的推断主要得益于两点。首先是TensorRT支持INT8和FP16的计算,通过在减少计算量和保持精度之间达到一个理想的trade-off,达到加速推断的目的。
更为重要的是TensorRT对于网络结构进行了重构和优化,主要体现在一下几个方面。
第一是tensorRT通过解析网络模型将网络中无用的输出层消除以减小计算。
第二是对于网络结构的垂直整合,即将目前主流神经网络的conv、BN、Relu三个层融合为了一个层,例如将图1所示的常见的Inception结构重构为图2所示的网络结构。
第三是对于网络的水平组合,水平组合是指将输入为相同张量和执行相同操作的层融合一起,如图2向图3的转化。
第四是对于concat层,将contact层的输入直接送入下面的操作中,不用单独进行concat后在输入计算,相当于减少了一次传输吞吐。如图所示:
手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX1下,TX2,Xavier等嵌入式开发板,亲测有效!_第1张图片
手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX1下,TX2,Xavier等嵌入式开发板,亲测有效!_第2张图片
手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX1下,TX2,Xavier等嵌入式开发板,亲测有效!_第3张图片

第一和第二步适用于所有的网络架构,但是第三步则对于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名称:如下图。

  1. TensorRT\samples\opensource\sampleUffMaskRCNN\mrcnn_config.h
    手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX1下,TX2,Xavier等嵌入式开发板,亲测有效!_第4张图片
  2. TensorRT\plugin\multilevelProposeROI\tlt_mrcnn_config.h
    手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX1下,TX2,Xavier等嵌入式开发板,亲测有效!_第5张图片
    依然:最少是类别数和类别名称,其他的可自行测试。
  3. \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无效。

手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX1下,TX2,Xavier等嵌入式开发板,亲测有效!_第6张图片

修改mrcnn_to_trt_single.py文件,第91行将类别80+1改为你分类的类别
手把手教你编译TensorRT 自己的MaskRCNN例子和模型转化—sampleuffMaskRCNN。可用于nvidia-TX1下,TX2,Xavier等嵌入式开发板,亲测有效!_第7张图片

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!有任何问题随时留言。

你可能感兴趣的:(Tensorrt,maskrcnn,深度学习,tensorflow,神经网络)