当前位置: 首页 > news >正文

使用 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 FasterRCNN 网络进行目标检测

目录 描述 此示例的工作原理 处理输入图形 数据准备 sampleUffFasterRCNN 插件 验证输出 TensorRT API 层和操作 TensorRT API 层和操作 先决条件 运行示例 示例 --help 选项 附加资源 许可 变更记录 已知问题 本示例&#xff0c;sampleUffFasterRCNN&#xff0…...

数据结构——顺序表(SeqList)

目录 1. 顺序表介绍 2. 顺序表工程 2.1 顺序表定义 2.1.1 静态顺序表 2.1.2 动态顺序表 2.2顺序表接口 2.2.1 顺序表初始化 2.2.2 顺序表打印 2.2.3 顺序表销毁 2.2.4 顺序表数据插入 2.2.4.1 容量检查 2.2.4.2 顺序表尾插 2.2.4.3 顺序表头插 2.2.4.4 顺序表随机…...

Uni-App 快捷登录

uniapp 实现一键登录前置条件: 开通uniCloud, 开通一键登录功能参考的文档 : 官网 - 一键登录uniapp指南 : https://uniapp.dcloud.net.cn/univerify.html#%E6%A6%82%E8%BF%B0 官网 - 一键登录开通指南 : https://ask.dcloud.net.cn/article/37965 官网 - unicloud使用指南 htt…...

DbUtils + Druid 实现 JDBC 操作 --- 附BaseDao

文章目录 Apache-DBUtils实现CRUD操作1 Apache-DBUtils简介2 主要API的使用2.1 DbUtils2.2 QueryRunner类2.3 ResultSetHandler接口及实现类 3 JDBCUtil 工具类编写3.1 导包3.2 编写配置文件3.3 编写代码 4 BaseDao 编写 Apache-DBUtils实现CRUD操作 1 Apache-DBUtils简介 com…...

css:元素居中整理水平居中、垂直居中、水平垂直居中

目录 1、水平居中1.1、行内元素1.2、块级元素 2、垂直居中2.1、单行文字2.2、多行文字2.3、图片垂直居中 3、水平垂直居中参考文章 1、水平居中 1.1、行内元素 行内元素&#xff08;比如文字&#xff0c;span&#xff0c;图片等&#xff09;的水平居中&#xff0c;其父元素中…...

从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型

从零开始的目标检测和关键点检测&#xff08;二&#xff09;&#xff1a;训练一个Glue的RTMDet模型 一、config文件解读二、开始训练三、数据集分析四、ncnn部署 从零开始的目标检测和关键点检测&#xff08;一&#xff09;&#xff1a;用labelme标注数据集 从零开始的目标检测…...

React18新特性?

文章目录 前言Automatic BatchingTransitionsSuspenseNew Hooks后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;react.js &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。…...

筹码博弈K线长阳选股公式,穿越筹码密集区

普通K线是由最高价、开盘价、最低价、收盘价四个价格构成的&#xff0c;而博弈K线是以这个四个价格对应的获利盘构成K线&#xff0c;反映筹码的获利情况。把鼠标移动到K线上&#xff0c;停留在对应的价格&#xff0c;就可以在右侧的筹码分布图看到相应的获利盘数据。&#xff0…...

微服务设计模式-架构真题(六十八)

UNIX的源代码控制工具(Source Code control System,SCCS)是项目开发中常用的&#xff08;&#xff09;。 源代码静态分析工具文档分析工具版本控制工具再工程工具 答案&#xff1a;C 解析&#xff1a; SCCS是版本控制工具 网闸的描述错误的是&#xff08;&#xff09;。 双…...

LeetCode----52. N 皇后 II

 题目 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1: 输入:n = 4 输出:2 解释:如上图所示,4 皇后问题存在两个不同的解法。 示例 2: 输入:n = …...

解决pycharm中,远程服务器上文件找不到的问题

一、问题描述 pycharm中&#xff0c;当我们连接到远程服务器上时。编译器中出现报错问题&#xff1a; cant open file /tmp/OV2IRamaar/test.py: [Errno 2] No such file or directory 第二节是原理解释&#xff0c;第三节是解决方法。 二、原理解释 实际上这是由于我们没有设置…...

虹科荣誉 | 喜讯!虹科成功入选“广州首届百家新锐企业”!!

文章来源&#xff1a;虹科品牌部 阅读原文&#xff1a;虹科荣誉 | 喜讯&#xff01;虹科成功入选“广州首届百家新锐企业”&#xff01;&#xff01; 近日&#xff0c;由中共广州市委统战部、广州市工商业联合会、广州市工业和信息化局、广州市人民政府国有资产监督管理委员会…...

如何利用Jmeter从0到1做一次完整的压测?这2个步骤很关键!

压测&#xff0c;在很多项目中都有应用&#xff0c;是测试小伙伴必备的一项基本技能&#xff0c;刚好最近接手了一个小游戏的压测任务&#xff0c;一轮压测下来&#xff0c;颇有收获&#xff0c;赶紧记录下来&#xff0c;与大家分享一下&#xff0c;希望大家能少踩坑。 一、压…...

基于STM32+微信小程序设计的智能门锁(4种开锁方式)_2023

一、项目介绍 1.1 项目背景 随着智能家居的普及,智能门锁作为一个非常重要的组成部分,受到了人们越来越多的关注。传统的机械锁门禁已经不能满足人们对于门锁安全、便捷性和智能化的需求,因此市场对于智能门锁的需求不断增加。而随着技术的发展,基于单片机的智能门锁已经…...

享受户外的美好时光:花园吊椅的魅力

拥有舒适的花园吊椅&#xff0c;就像在家中创造了一个度假天堂。这些轻松摇摆的座位为您提供了一个完美的地方&#xff0c;既能舒适躺卧&#xff0c;又能让您在家中的花园或庭院中感受到度假的氛围。度过美好时光的吊椅&#xff0c;将成为家庭花园的一大亮点&#xff0c;为您带…...

游戏中找不到d3dx9_43.dll怎么办,教你快速解决方法

在计算机的世界里&#xff0c;我们经常会遇到一些让人头疼的问题。比如&#xff0c;有一天&#xff0c;小明正在玩他最喜欢的游戏&#xff0c;突然弹出了一个错误提示&#xff1a;“由于找不到d3dx9_43.dll,无法继续执行代码”。小明感到非常困惑&#xff0c;不知道这是什么意思…...

蓝桥杯:买不到的数目

对于两个互质的正整数 n , m n,m n,m,请找出来不能被 n n n和 m m m组成的最大数 X X X 例如:对于4,7那么 X X X17&#xff0c;因为对于大于17的任一数都可由4和7组成。 重新翻译题目&#xff1a; 对于任一大于 X X X的正整数 Y Y Y满足 Y a n b m Y a \times nb \times m …...

Nginx简介,Nginx搭载负载均衡以及Nginx部署前端项目

目录 一. Nginx简介 Nginx的优点 二. Nginx搭载负载均衡 2.1 Nginx安装 2.1.1 安装依赖 2.1.2 解压nginx安装包 2.1.3 安装nginx 2.1.4 启动nginx服务 2.2 tomcat负载均衡 2.3 Nginx配置 三. Nginx前端部署 一. Nginx简介 NGINX&#xff08;读作&#xff1a;engi…...

QT5.15.2搭建Android编译环境及使用模拟器调试(全)

一、安装QT5.15.2 地址&#xff1a;下载 我电脑的windows的&#xff0c;所以选windows 由于官方安装过程非常非常慢&#xff0c;一定要跟着步骤来安装&#xff0c;不然慢到怀疑人生 1&#xff09;打开"命令提示符"&#xff08;开始 -> Windows 系统 -> 命令…...

npm install报 ERESOLVE unable to resolve dependency tree

三四年前的一个项目&#xff0c;打开&#xff0c;npm install 一下&#xff0c;结果报 ERESOLVE unable to resolve dependency tree。 以前install都一切顺利&#xff0c;现在就不行&#xff0c;那很大的可能是npm的版本不同。 PS D:\workSpace\code\*-admin-ui-master> n…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...