关于tensorRT动态输入的例子大多数都是c++版本的,python版本的较少,这里简单总结下python处理tensorRT动态输入时,遇到的一些问题及解决方案。

这里的动态输入是指batch,width,height等不固定大小的输入。对于目标检测等问题,如果将图像压缩到指定长度和宽度,一般会损失一些性能,一般情况下是压缩较小的边到一定数值(例如608,416等),另一条边按照比例进行压缩,这就导致了输入可能是变长的情况。而早期的tensorrt是不支持变长输入,这一点比较令人费解,因为tensorflow,pytorch等框架是支持变长输入的,为什么tensorrt支持变长输入要这么麻烦呢?我想到的一个原因是tensorrt内部做了一些优化策略,而这些优化策略对于变长问题是较难处理的。

一、由onnx模型构建trt引擎

tensorrt6 以后的版本是支持动态输入的,需要给每个动态输入绑定一个profile,用于指定最大值,最小值和常规值,如果超出这个范围会报异常。

profile = builder.create_optimization_profile()
profile.set_shape(network.get_input(0).name, (1,3, 32, 32), (1,3, 608, 608), (1,3, 2050, 2050))
config.add_optimization_profile(profile)

另外建立engine时是通过config设置参数的,

config.max_workspace_size=1<<30 #1GB

而不是通过builder,这一点很重要,如果出现显存溢出的问题需要重新设置

config.max_workspace_size

构建引擎

engine = builder.build_engine(network,config)

二、推理

1、申请空间

因为是动态输入,所以每次申请的空间大小不一样,为了不用每次推理时都要重新申请空间,可以申请一次所需的最大空间,后面取数据的时候对齐就可以了。

inputs = []
outputs = []
bindings = []
stream = cuda.Stream()
tmp=[1,32,16,8]
print('engine.get_binding_format_desc',engine.get_binding_format_desc(0))
for count,binding in enumerate(engine):print('binding:',binding)size = trt.volume(engine.get_binding_shape(binding)) * engine.max_batch_size*(int)(h_/tmp[count])*(int)(w_/tmp[count])  dtype = trt.nptype(engine.get_binding_dtype(binding))  # Allocate host and device buffershost_mem = cuda.pagelocked_empty(size, dtype)device_mem = cuda.mem_alloc(host_mem.nbytes)# Append the device buffer to device bindings.bindings.append(int(device_mem))# Append to the appropriate list.if engine.binding_is_input(binding):inputs.append(HostDeviceMem(host_mem, device_mem))else:outputs.append(HostDeviceMem(host_mem, device_mem))

2、推理

注意推理拿到的数据长度是前面申请空间中数据,输入确定了,输出长度也就确定了,取到合适的长度即可。

trt_outputs = common.do_inference_v3(self.context,bindings=self.bindings,inputs=self.inputs,outputs=self.outputs,stream=self.stream,h_=h_,w_=w_)output_shapes = [(1, int(h_/32), int(w_/32), 21),(1, int(h_/16), int(w_/16), 21),(1, int(h_/8), int(w_/8), 21)]print(output_shapes)
trt_outputs = [output[:shape[1]*shape[2]*shape[3]].reshape(shape) for output, shape in zip(trt_outputs, output_shapes)]

完整用例请参考

https://github.com/zhaogangthu/keras-yolo3-ocr-tensorrt/tree/master/tensorRT_yolo3​github.com

取input 输入_tensorRT动态输入(python)相关推荐

  1. python 用户输入_Python 用户输入(input)

    1.用户输入(input) Python允许用户输入. 这意味着我们可以要求用户输入. 该方法在Python 3.6中与Python 2.7有所不同. Python 3.6使用input()方法. P ...

  2. html input不能输入小数_【Python基础(八)】输入和输出

    本节将会介绍python中的输入和输出操作,基础部分主要就是介绍input()和print()的用法,print()我们在之前的学习中已经多次使用了,并不陌生,这一节再详细的梳理一下print()中可 ...

  3. Python抓取网页中的动态序列化数据

    Python抓取网页中的动态序列化数据 动态序列化数据经常应用于前后端分离的页面.或者通过VUE.JS等HTML页面环境,常规的爬虫抓取方法并不能满足数据采集的要求,因此需要其他的方式进行数据的采集. ...

  4. python动态页面元素爬取_爬取动态网页python+Web kit

    上一篇文章爬取动态网页python+selenium+webdriver介绍了爬取动态网站的一种模拟浏览器的方法,该方法的优劣也很明显 优: 可以模拟任何人的操作,输入账号密码,点击登录等等操作 劣: ...

  5. python抓取朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)...

    原标题:如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下) 前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往 ...

  6. python动态渲染抓取网页_爬取动态网页python+Web kit

    上一篇文章爬取动态网页python+selenium+webdriver介绍了爬取动态网站的一种模拟浏览器的方法,该方法的优劣也很明显 优: 可以模拟任何人的操作,输入账号密码,点击登录等等操作 劣: ...

  7. python爬取加密qq空间_使用python+selenium爬取qq空间好友动态

    使用python+selenium爬取qq空间好友动态 分析过程如下: 要想用selenium登陆qq空间,必须点击账号密码登陆按钮然后再填写账号密码登陆. 1.PNG 点击账号密码按钮后跳转到如下页 ...

  8. python编写一计票程序,键盘输入候选人姓名(输入“#”结束),使用字典存储并统计出候选人得票数。python实现分段函数。

    一.编程题目         编程题目1:python编写一计票程序,键盘输入候选人姓名(输入"#"结束),使用字典存储并统计出候选人得票数.        编程题目2:pytho ...

  9. tensorrt动态输入分辨率尺寸

    本文只有 tensorrt python部分涉动态分辨率设置,没有c++的. 目录 pytorch转onnx: onnx转tensorrt: python tensorrt推理: 知乎博客也可以参考: ...

最新文章

  1. server-send event object
  2. cad打印样式ctb丢失_我的第一次打印:cad模型空间套图框打印图纸
  3. dev c++ 最新版本5.0
  4. Error: The 'decorators' plugin requires a 'decoratorsBeforeExport' option
  5. jmeter 多机负载压测与服务器性能监测
  6. ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机
  7. 19、java中枚举
  8. php 正则替换 ubb,php实现过滤UBB代码的类
  9. 微信联合苹果探索iOS系统的暗黑模式;iPhone SE 2于3月31日发布;Kotlin 1.3.70发布 | 极客头条...
  10. 乘法口诀表java加表格_Java 面试 - 打印九九乘法口诀表
  11. python生成器的惰性计算
  12. 火山PC_火山安卓_免安装解压即用版本
  13. Linux学习一概述和环境搭建(入门概述,环境搭建,走近Linux系统)
  14. 后端MultipartFile接收文件转Base64
  15. STAR:转录组数据比对工具简介
  16. 移动前端开发和 Web 前端开发的区别
  17. bzoj 4816 [Sdoi2017]数字表格——反演
  18. 基于树莓派raspberry: 移植 2.4寸TFT显示屏以及源码分析
  19. EUV光刻机内部揭秘!
  20. 怎样才能让青少年培养起阅读习惯?听听猿辅导这四位嘉宾怎么说

热门文章

  1. python百度地图api经纬度_从百度地图API接口批量获取地点的经纬度
  2. Python入门100题 | 第076题
  3. linux修改path路径
  4. Java 实现 SSH 协议的客户端登录认证方式--转载
  5. Java 异常处理的误区和经验总结--转载
  6. Linux定时增量更新文件--转
  7. Linux原始套接字实现分析---转
  8. Apache Thrift - 可伸缩的跨语言服务开发框架 ---转载
  9. 【采用】信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)
  10. 灰度图像--图像增强 非锐化掩蔽 (Unsharpening Mask) .