使用 TensorFlow FasterRCNN 网络进行目标检测

目录

描述

此示例的工作原理

处理输入图形

数据准备

sampleUffFasterRCNN 插件

验证输出

TensorRT API 层和操作

TensorRT API 层和操作

先决条件

运行示例

示例 --help 选项

附加资源

许可

变更记录

已知问题


本示例,sampleUffFasterRCNN,演示了如何使用基于 TensorFlow 的 Faster-RCNN 模型。它使用了 ProposalCropAndResize TensorRT 插件来实现建议层和 ROIPooling 层,因为 TensorRT 不支持它们。

此示例的工作原理

UFF Faster R-CNN 网络在网络的单次前向传递中执行目标检测和定位任务。Faster R-CNN 网络是在 ResNet-10 骨干网络(特征提取器)上训练的,用于检测 4 类对象:AutomobileRoadsignBicyclePerson,以及 background 类(无对象)。

该示例使用 TensorRT 插件来运行 UFF Faster R-CNN 网络。为了使用这些插件,需要预处理 TensorFlow 图,我们使用 GraphSurgeon 实用程序来执行此操作。

此网络的主要组成部分包括图像预处理器、特征提取器、区域建议网络(RPN)、建议层、ROIPooling(CropAndResize)、分类器和后处理器。

图像预处理器 图像图形预处理器步骤负责调整图像大小。将图像调整为大小为 3x272x480(CHW)的张量。此步骤还对图像执行逐通道均值减法。在预处理之后,输入图像的通道顺序为 BGR,而不是 RGB

特征提取器 图形的特征提取器部分在预处理图像上运行 ResNet10 网络。生成的特征映射由 RPN 层和建议层使用,用于生成可能包含对象的感兴趣区域(ROIs)。作为第二分支,特征映射还在 ROIPooling(或更确切地说是 CropAndResize 层)中使用,以从建议层输出的指定 ROIs 裁剪特征映射的补丁。

在此网络中,特征映射来自 ResNet-10 骨干的中间层输出。中间层的累积步幅为 16。

区域建议网络(RPN) RPN 使用步幅-16 骨干的特征映射,并在其中附加一个小型卷积神经网络(CNN)头部,用于检测图像的特定区域是否包含对象。它还输出候选对象的粗略坐标。

建议层 建议层接受 RPN 的输入,并对 RPN 的候选框进行一些微调。微调包括选择置信度最高的顶部框并针对它们执行 NMS(非最大抑制)。最后,根据 NMS 操作后的置信度再次选择置信度最高的顶部框。

此操作在 Proposal 插件中实现为 TensorRT 插件。

CropAndResize CropAndResize 层执行 Caffe 实现的原始 ROIPooling 层的 TensorFlow 实现。CropAndResize 层将建议层的 ROIs 调整到公共目标大小,输出结果后由分类器处理,以区分 ROI 属于哪个类别。CropAndResize 操作和 ROIPooling 操作之间的区别在于前者使用双线性插值,而后者使用池化。

此操作在 CropAndResize 插件中实现为 TensorRT 插件。

分类器 分类器是一个小型网络,接受 CropAndResize 层的输出,并区分 ROI 属于哪个类别。除此之外,它还提供了从 RPN 层输出的坐标的增量值。

后处理器 后处理器将分类器输出的增量值应用于 RPN 输出的坐标,并在 NMS 后获取最终检测结果。

具体来说,本示例执行以下步骤:

  • 处理输入图形
  • 数据准备
  • sampleUffFasterRCNN 插件
  • 验证输出

处理输入图形

TensorFlow FasterRCNN 图包含一些当前不受 TensorRT 支持的操作。通过对图进行预处理,我们可以将图中的多个操作合并成一个单独的自定义操作,可以在 TensorRT 中实现为插件层。目前,预处理程序提供了将命名空间中的所有节点合并为一个自定义节点的功能。

要使用预处理程序,应使用 -p 标志和配置文件来调用 convert-to-uff 实用程序。配置脚本还应包括将嵌入在生成的 .uff 文件中的所有自定义插件的属性。在此示例中,UFF Faster R-CNN 的当前配置脚本位于此示例中的 config.py 中。

数据准备

生成的网络具有名为 input_1 的输入节点,输出节点的名称为 dense_class/Softmaxdense_regress/BiasAddproposal。UFF 解析器在示例中注册了这些节点。

此示例中 UFF Faster R-CNN 网络的输入是 3 通道 480x272 图像。在示例中,我们从输入图像中减去每通道的均值值。

由于 TensorRT 不依赖于任何计算机视觉库,因此图像以每像素的二进制 R、G 和 B 值表示。格式为 Portable PixMap(PPM),这是一种 netpbm 颜色图像格式。在此格式中,每像素的 R、G 和 B 值由整数字节(0-255)表示,并逐像素依次存储。由于实现原因,输入图像的通道顺序实际上是 BGR,而不是 RGB。

有一个名为 readPPMFile 的简单 PPM 读取函数。

sampleUffFasterRCNN 插件

关于如何创建 TensorRT 插件的详细信息可在 扩展 TensorRT 自定义层 中找到。

convert-to-uff 命令的 config.py 应将自定义层映射到 TensorRT 中的插件名称,方法是修改 op 字段。插件参数的名称也应与 TensorRT 插件期望的参数名称完全匹配。

如果定义的 config.py 如上所述,那么 NvUffParser 将能够解析网络并以正确的参数调用适当的插件。

以下是在 UFF Faster R-CNN 中为 TensorRT 实现的一些插件层的详细信息。

CropAndResize 插件 CropAndResize 插件根据建议层的 ROI 坐标从特征图中裁剪补丁,并将其调整到公共目标大小,例如 7x7。输出张量用作紧随 CropAndResize 插件的分类器的输入。

Proposal 插件 Proposal 插件对来自 RPN 的候选框进行了微调。微调包括根据它们的置信度选择置信度最高的顶部框,执行 NMS 操作,最后选择经 NMS 操作后具有最高置信度的顶部框。

验证输出

在创建生成器之后(请参见 使用 C++ 构建引擎)并序列化引擎(请参见 使用 C++ 序列化模型),我们可以执行推理。有关反序列化和运行推理的步骤,请参阅 使用 C++ 执行推理。UFF FasterRCNN 网络的输出可读取。通过在图像上绘制边界框来可视化结果。

TensorRT API 层和操作

在此示例中,使用以下层。有关这些层的更多信息,请参阅 TensorRT 开发人员指南:层 文档。

激活层 激活层实现逐元素激活函数。具体来说,本示例使用类型 kRELU 的激活层。

TensorRT API 层和操作

在此示例中,使用以下层。有关这些层的更多信息,请参见TensorRT开发人员指南:层文档。

激活层 激活层实现逐元素激活函数。具体而言,此示例使用类型为kRELU的激活层。

卷积层 卷积层计算具有或不具有偏差的2D(通道,高度和宽度)卷积。

全连接层 全连接层实现矩阵-向量乘积,具有或不具有偏差。

填充层 填充层实现对张量的两个最内层维度进行零填充。

插件层 插件层是用户定义的,提供了扩展TensorRT功能的能力。有关更多详细信息,请参见使用自定义层扩展TensorRT。

池化层 池化层在通道内实现池化。支持的池化类型有maximumaveragemaximum-average blend

缩放层 缩放层实现每个张量、每个通道或每个元素的仿射变换和/或常数值的指数化。

SoftMax层 SoftMax层根据用户指定的输入维度在输入张量上应用SoftMax函数。

先决条件

  1. 安装UFF工具包和图形外科医生。根据您的TensorRT安装方法,选择使用TensorRT的安装方法安装工具包和图形外科医生(请参见TensorRT安装指南:安装TensorRT中的说明)。

  2. 我们提供一个bash脚本用于下载模型以及此示例所需的其他数据:./download_model.sh

    模型将在uff_faster_rcnn目录中下载并解压缩,pb模型是uff_faster_rcnn/faster_rcnn.pb

    除了pb模型,目录中还包含一些PPM图像和list.txt。这些PPM图像是此示例中使用的测试图像。list.txt在TensorRT的INT8模式下用于列出在TensorRT的INT8校准步骤中使用的图像名称。

  3. 使用UFF转换器对TensorFlow模型进行预处理。

    1. 从上一步下载的目录中将TensorFlow protobuf文件(faster_rcnn.pb)复制到工作目录,例如/usr/src/tensorrt/data/faster-rcnn-uff

    2. 修复UFF转换器。

      应用修复UFF转换器的补丁以修复UFF软件包中Softmax层的问题。让UFF_ROOT表示Python UFF软件包的根目录,例如/usr/lib/python2.7/dist-packages/uff

      然后,使用以下命令应用补丁: patch UFF_ROOT/converters/tensorflow/converter_functions.py < fix_softmax.patch

      补丁文件fix_softmax.patch是在TensorRT 5.1 GA中使用UFF软件包版本0.6.3生成的。在应用补丁之前,请确保您的UFF软件包版本也为0.6.3。对于TensorRT 6.0,请忽略此问题,因为它应该已经修复。

    3. 运行以下命令进行转换。

       

      convert-to-uff -p config.py -O dense_class/Softmax -O dense_regress/BiasAdd -O proposal faster_rcnn.pb

      这将保存转换后的.uff文件在与输入相同的目录中,文件名为faster_rcnn.uff

      config.py脚本指定了UFF Faster R-CNN TensorFlow图所需的预处理操作。config.py脚本中使用的插件节点和插件参数应与TensorRT中注册的插件匹配。

  4. 在INT8模式下运行示例还需要一个带有所有校准图像列表的list.txt文件(仅包含基名,不包括后缀)。将list.txt复制到包含pb模型的同一目录中。

  5. 将PPM图像复制到包含pb模型的同一目录中。

运行示例

  1. 按照顶层指南构建OSS示例(包括此示例,当然)。二进制文件命名为sample_uff_faster_rcnn将创建在build/cmake/out目录中。

  2. 运行示例以执行对象检测和定位。

    在FP32模式下运行示例:

     

    ./sample_uff_faster_rcnn --datadir /data/uff_faster_rcnn -W 480 -H 272 -I 2016_1111_185016_003_00001_night_000441.ppm

    在INT8模式下运行示例:

     

    ./sample_uff_faster_rcnn --datadir /data/uff_faster_rcnn -i -W 480 -H 272 -I 2016_1111_185016_003_00001_night_000441.ppm

  3. 验证示例是否成功运行。如果示例成功运行,您应该看到类似以下的输出:

    在2016_1111_185016_003_00001_night_000441.ppm中检测到汽车,置信度为99.9734%
    在2016_1111_185016_003_00001_night_000441.ppm中检测到汽车,置信度为99.9259%
    在2016_1111_185016_003_00001_night_000441.ppm中检测到汽车,置信度为98.7359%
    在2016_1111_185016_003_00001_night_000441.ppm中检测到汽车,置信度为92.4371%
    在2016_1111_185016_003_00001_night_000441.ppm中检测到汽车,置信度为89.7888%
    此输出表明示例成功运行PASSED。

示例 --help 选项

要查看可用选项及其描述的完整列表,请使用 -h--help 命令行选项。

附加资源

以下资源提供有关sampleUffFasterRCNN的更深入了解。

文档

  • NVIDIA TensorRT示例简介
  • 使用C++ API使用TensorRT
  • NVIDIA TensorRT文档库

许可

有关使用、复制和分发的条款和条件,请参阅TensorRT软件许可协议文档。

变更记录

2019年7月 这是README.md文件和示例的第一个版本。

已知问题

此示例中没有已知问题。

你可能感兴趣的:(tensorflow,目标检测,人工智能)