使用 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文件和示例的第一个版本。

已知问题

此示例中没有已知问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/127353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下git clone时出现“Filename too long”错误的解决办法

在windows下&#xff0c;当使用git clone复制项目时&#xff0c;出现下述错误表示项目中有文件民字符过长的问题&#xff0c;需要开启git的长路径支持解决&#xff1a; fatal: cannot create directory at xxxx: Filename too long warning: Clone succeeded, but checkout fa…

Pycharm安装jupyter和d2l

安装 jupyter: jupyter是d2l的依赖库&#xff0c;没有它就用不了d2l pycharm中端输入pip install jupyter安装若失败则&#xff1a; 若网速过慢&#xff0c;则更改镜像源再下载&#xff1a; pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ pip …

ChatGPT-自然语言处理模型

前言 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种自然语言处理模型&#xff0c;具有强大的文本生成和理解能力。 使用场景 它可以用于各种场景&#xff0c;包括但不限于&#xff1a; 1. 自动文本生成&#xff1a;GPT可以生成连贯、流畅的文章、故…

中国长城-安全防护-硬件,软件,细粒度权限划分-等级保护,人员意识

目录 等级保护 安全防护 中国长城-安全防护 硬件&#xff0c;软件&#xff0c;细粒度权限划分-等级保护&#xff0c;人员意识 等级保护 安全防护 建立安全管理制度&#xff1a;制定信息安全政策&#xff0c;明确安全管理职责&#xff0c;建立安全培训和考核机制&#xff0c…

视频闪闪,探店带货系统,精细化顺序混剪,故事影视解说,视频处理大全,精细化顺序混剪,多场景裂变,多视频混剪

视频闪闪&#xff0c;探店带货系统&#xff1a;精细化顺序混剪与故事影视解说的艺术 在当今的数字时代&#xff0c;视频已成为一种强大的营销工具。探店带货系统更是将视频的魅力发挥到极致。今天&#xff0c;我们将探讨如何在视频中突出主题&#xff0c;进行探店带货&#xf…

【斗罗二】戴华斌再次打脸,王冬对战嗜血魔熊,仙琳儿神秘登场

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《绝世唐门》22集预告最新爆料&#xff0c;在上一集中&#xff0c;我们见证了戴华斌因输给霍雨浩而耿耿于怀&#xff0c;此次他下定决心动用家族的力量来挑战霍雨浩。然而&#xff0c;他…

【设计模式】第12节:结构型模式之“外观模式”

一、简介 门面模式&#xff0c;也叫外观模式&#xff0c;英文全称是Facade Design Pattern。门面模式为子系统提供一组统一的接口&#xff0c;定义一组高层接口让子系统更易用。 目的&#xff1a;简化复杂系统的交互方式 特点&#xff1a;提供一个统一的交互接口 二、UML类…

人工智能基础_机器学习013_三种梯度下降对比_线性回归梯度下降更新公式_对梯度下降函数求偏导数_得到---人工智能工作笔记0053

这里批量梯度下降,就是用准备的所有样本数据进行梯度下降计算. 然后小批量梯度下降就是使用比如我一共有500个样本,那么我从中拿出50个样本进行梯度下降计算. 然后随机梯度下降,更厉害, 从一共有500个样本中,随机的取一个样本进行梯度下降计算, 首先我们看批量梯度下降,使用…

设计融合_ c#

单例模式 using System; namespace DesignIntegration{ public class TimeManager{ private static TimeManager _instance; private static readonly Object locker new Object(); private TimeManager() { } public static TimeManager…

基于springboot实现游戏分享网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现游戏分享网站演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把游戏分享管理与现在网络相结合&#xff0c;利用java技术建设游戏分享网站&#xff0c;实现游戏分享的信息化。则对于进一步提高游戏分享管理发展&#xff0c;丰富游戏分享管理经验能起到…

windows内存取证-中等难度-下篇

上文我们对第一台Target机器进行内存取证&#xff0c;今天我们继续往下学习&#xff0c;内存镜像请从上篇获取&#xff0c;这里不再进行赘述​ Gideon 攻击者访问了“Gideon”&#xff0c;他们向AllSafeCyberSec域控制器窃取文件,他们使用的密码是什么&#xff1f; 攻击者执…

Elasticsearch实战:常见错误及详细解决方案

Elasticsearch实战&#xff1a;常见错误及详细解决方案 1.read_only_allow_delete":“true” 当我们在向某个索引添加一条数据的时候&#xff0c;可能&#xff08;极少情况&#xff09;会碰到下面的报错&#xff1a; {"error": {"root_cause": [{&…

Python-文件操作

目录 一、文件的打开与关闭 1、文件的打开 2、文件模式 3、文件的关闭 二、文件的读写 1、写文件 2、读文件 3、文件的定位读写 三、文件的重命名和删除 1、文件的重命名 2、文件的删除 四、文件夹的相关操作 1、创建文件夹 2、获取当前目录 3、改变默认目录 4、…

等你加入!文心开发者说分享者招募全面开启

《文心开发者说》已经开播一个月了&#xff0c;在这段时间里&#xff0c;许多开发者们分享了自己的切身实战经历&#xff0c;了解到作为“先锋”的开发者们对于开发应用的独特心得与见解。 我们期待更多开发者的加入&#xff0c;分享您的开发心得与技巧&#xff0c;对行业动态…

Linux-----nginx的简介,nginx搭载负载均衡以及nginx部署前后端分离项目

目录 nginx的简介 是什么 nginx的特点以及功能 Nginx负载均衡 下载 安装 负载均衡 nginx的简介 是什么 Nginx是一个高性能的开源Web服务器和反向代理服务器。它的设计目标是为了解决C10k问题&#xff0c;即在同一时间内支持上万个并发连接。 Nginx采用事件驱动的异…

1596 - Bug Hunt (UVA)

题目链接如下&#xff1a; https://onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&category448&pageshow_problem&problem4471 我的代码如下&#xff1a; #include <iostream> #include <string> #include <map> // #define…

数据分析在程序员职业中的重要性及实践应用

一、引言 在当今信息化社会的快速发展中&#xff0c;数据分析已经成为一项重要的职业技能。不论是从事哪个行业&#xff0c;都需要具备一定的数据分析能力。对于程序员而言&#xff0c;掌握数据分析技能不仅能够提升自身在职场中的竞争力&#xff0c;更能够在职业生涯中获得更…

JAVA数据类型分类及初始默认值(详细)

前言 在学习Java的时候会接触到数据类型&#xff0c;那么在Java中有哪些数据类型呢&#xff1f; Java数据类型主要分为两大类 1.基本类型&#xff08;primitive type&#xff09;2.引用类型&#xff08;reference type&#xff09; 1.基本类型里分为&#xff1a;数值类型、…

多模态论文学习之ALBEF(Align BEfore Fusing)

ALBEF泛读 TitleLinksMotivationHow to solve it?(Contribution)ModelExperimentsPre-training DatasetsDownstream tasksAblation ExperimentTitle 《Align before Fuse: Vision and Language Representation Learning with Momentum Distillation》 Links Paper地址 M…

Hadoop相关知识点

文章目录 一、主要命令二、配置虚拟机2.1 设置静态ip2.2 修改主机名及映射2.3 修改映射2.4 单机模式2.5 伪分布式2.6 完全分布式 三、初识Hadoop四、三种模式的区别4.1、单机模式与伪分布式模式的区别4.2、特点4.3、配置文件的差异4.3.1、单机模式4.3.2、伪分布式模式4.3.3、完…