参考:https://jkjung-avt.github.io/camera-caffe-threaded/

代码:https://gist.github.com/jkjung-avt/d408aaabebb5b0041c318f4518bd918f

一般在TX2上部署深度学习模型时,都是读取摄像头视频或传入视频文件进行推理,从视频中抽取帧进行目标检测等任务。对于大点的模型,推理的速度是赶不上摄像头或视频的帧率的,如果我们使用单线程进行处理,即读取一帧检测一帧,推理会堵塞视频的正常传输,表现出来就是摄像头视频有很大的延迟,如果是对实时性要求较高,这种延迟是难以接受的。因此,采用多线程的方法,将视频读取与深度学习推理放在两个线程里,互不影响,达到实时的效果。

实现方法

将摄像头的视频读取放入子线程,充当一个生产者的角色,将推理放入主线程,充当消费者的角色,主线程推理完一帧后从子线程提数据,继续推理,下图是原博文的一幅图片,描述了两个线程的关系

1 子线程

子线程程序参考https://github.com/jkjung-avt/tf_trt_models/blob/tf-1.8/utils/camera.py,实现摄像头和视频的读取

"""camera.py
This code implements the Camera class, which encapsulates code to
handle IP CAM, USB webcam or the Jetson onboard camera.  The Camera
class is further extend to take either a video or an image file as
input.
"""import time
import logging
import threadingimport numpy as np
import cv2def open_cam_rtsp(uri, width, height, latency):"""Open an RTSP URI (IP CAM)."""gst_str = ('rtspsrc location={} latency={} ! ''rtph264depay ! h264parse ! omxh264dec ! ''nvvidconv ! ''video/x-raw, width=(int){}, height=(int){}, ''format=(string)BGRx ! videoconvert ! ''appsink').format(uri, latency, width, height)return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)def open_cam_usb(dev, width, height):"""Open a USB webcam.We want to set width and height here, otherwise we could just do:return cv2.VideoCapture(dev)"""gst_str = ('v4l2src device=/dev/video{} ! ''video/x-raw, width=(int){}, height=(int){}, ''format=(string)RGB ! videoconvert ! ''appsink').format(dev, width, height)return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)def open_cam_onboard(width, height):"""Open the Jetson onboard camera.On versions of L4T prior to 28.1, you might need to add'flip-method=2' into gst_str."""gst_str = ('nvcamerasrc ! ''video/x-raw(memory:NVMM), ''width=(int)2592, height=(int)1458, ''format=(string)I420, framerate=(fraction)30/1 ! ''nvvidconv ! ''video/x-raw, width=(int){}, height=(int){}, ''format=(string)BGRx ! videoconvert ! ''appsink').format(width, height)return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)def grab_img(cam):"""This 'grab_img' function is designed to be run in the sub-thread.Once started, this thread continues to grab a new image and put itinto the global 'img_handle', until 'thread_running' is set to False."""while cam.thread_running:if cam.args.use_image:assert cam.img_handle is not None, 'img_handle is empty in use_image case!'# keep using the same img, no need to update ittime.sleep(0.01)  # yield CPU to other threadselse:_, cam.img_handle = cam.cap.read()fps = cam.cap.get(cv2.CAP_PROP_FPS)time.sleep(1/fps)  # fps = 20hzprint('time sleep ', 1/fps)if cam.img_handle is None:logging.warning('grab_img(): cap.read() returns None...')breakcam.thread_running = Falseclass Camera():"""Camera class which supports reading images from theses video sources:1. Video file2. Image (jpg, png, etc.) file, repeating indefinitely3. RTSP (IP CAM)4. USB webcam5. Jetson onboard camera"""def __init__(self, args):self.args = argsself.is_opened = Falseself.thread_running = Falseself.img_handle = Noneself.img_width = 0self.img_height = 0self.cap = Noneself.thread = Nonedef open(self):"""Open camera based on command line arguments."""assert self.cap is None, 'Camera is already opened!'args = self.argsif args.use_file:self.cap = cv2.VideoCapture(args.filename)# ignore image width/height settings hereelif args.use_image:self.cap = 'OK'self.img_handle = cv2.imread(args.filename)# ignore image width/height settings hereif self.img_handle is not None:self.is_opened = Trueself.img_height, self.img_width, _ = self.img_handle.shapeelif args.use_rtsp:self.cap = open_cam_rtsp(args.rtsp_uri,args.image_width,args.image_height,args.rtsp_latency)elif args.use_usb:self.cap = open_cam_usb(args.video_dev,args.image_width,args.image_height)else:  # by default, use the jetson onboard cameraself.cap = open_cam_onboard(args.image_width,args.image_height)if self.cap != 'OK':if self.cap.isOpened():# Try to grab the 1st image and determine width and height_, img = self.cap.read()if img is not None:self.img_height, self.img_width, _ = img.shapeself.is_opened = Truedef start(self):assert not self.thread_runningself.thread_running = Trueself.thread = threading.Thread(target=grab_img, args=(self,))self.thread.start()def stop(self):self.thread_running = Falseself.thread.join()def read(self):if self.args.use_image:return np.copy(self.img_handle)else:return self.img_handledef release(self):assert not self.thread_runningif self.cap != 'OK':self.cap.release()

2 主线程

主线程程序调用camera类,然后进行open、start、read等操作,read函数返回的是最新一帧的frame,这样可以起到实时的效果,而多余的帧通过python的垃圾回收机制自动回收,不会对系统内存造成影响

def detect_in_video():'''其它初始化等操作'''cam = Camera(args)cam.open()cam.start()while cam.thread_running:frame = cam.read()'''后续识别操作'''def main():detect_in_video()if __name__ =='__main__':main()

链接:https://blog.csdn.net/zong596568821xp/article/details/86704906

多线程读取视频及深度学习推理相关推荐

  1. NVIDIA教你用TensorRT加速深度学习推理计算 | 量子位线下沙龙笔记

    主讲人:Ken(何琨)| NVIDIA开发者社区经理 张康 屈鑫 编辑整理 量子位 出品 | 公众号 QbitAI 12月22日,量子位联合NVIDIA英伟达举行了线下交流会,跟现场近百位开发者同学共 ...

  2. 深度学习推理框架调研总结

    深度学习推理框架 作者介绍 1.移动端深度学习推理框架调研 1.1 小米的MACE(2017) 1.2 阿里的MNN 1.3 腾讯的TNN 1.4 ARM的tengine 1.5 百度的paddle- ...

  3. 如何使用TensorRT加速深度学习推理

    文章目录 1.TensorRT 简介 2.一个简单的TensorRT示例 3.简要代码演练 3.1.批量输入 4.配置文件 5.优化您的应用 6.使用混合精度计算 7.设置最大工作区大小 8.重用Te ...

  4. 爱视图灵-深度学习推理盒(JETSON TX2)

    爱视图灵-深度学习推理盒(JETSON TX2) 一.NVIDIA Jetson TX2 模块化 AI 超级计算机的优势 传统的视频分析使用基于计算机视觉的方法,但下一代解决方案愈发依赖深度学习技术. ...

  5. 自制深度学习推理框架-第七课-构建自己的计算图

    自制深度学习推理框架-第六课-构建自己的计算图 项目主页 https://github.com/zjhellofss/KuiperInfer 感谢大家点赞和PR, 这是对我最大的鼓励, 谢谢. 现在K ...

  6. 自制深度学习推理框架-第十一节-再探Tensor类并构建计算图的图关系

    自制深度学习推理框架-第十一节-再探Tensor类并准备算子的输入输出 本课程介绍 我写了一个<从零自制深度学习推理框架>的课程,课程语言是 C++,课程主要讲解包括算子实现和框架设计的思 ...

  7. NVIDIA TensorRT高性能深度学习推理

    NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和 ...

  8. 英伟达深度学习推理引擎TensorRT,现在开源了

    https://www.toutiao.com/a6703740623364555271/ 2019-06-18 13:37:53 机器之心报道 参与:李亚洲.李泽南.思 英伟达的深度学习推理引擎Te ...

  9. 工程之道,深度学习推理性能业界最佳优化实践

    MegEngine「训练推理一体化」的独特范式,通过静态图优化保证模型精度与训练时一致,无缝导入推理侧,再借助工业验证的高效卷积优化技术,打造深度学习推理侧极致加速方案,实现当前业界最快运行速度.本文 ...

  10. tensorrt轻松部署高性能dnn推理_NVIDIA TensorRT高性能深度学习推理

    NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和 ...

最新文章

  1. NeHe OpenGL第三十三课:TGA文件
  2. SP3946 MKTHNUM - K-th Number(整体二分)
  3. 突发公共事件应急管理 新闻网站集
  4. 通过一组RESTful API暴露CQRS系统功能
  5. 07丨行锁功过:怎么减少行锁对性能的影响
  6. 闲置硬盘自制nas私有云_闲置U盘不用扔,教你一招变云盘,随时随地备份数据、访问私有云...
  7. 数据库水平切分的实现原理解析
  8. 数据库技能实战进阶之常用结构化sql语句(中)
  9. PLSQL中文显示乱码
  10. 拓端tecdat|Python中利用长短期记忆模型LSTM进行时间序列预测分析 - 预测电力负荷数据
  11. VPS搭建HTTP代理
  12. Android性能优化学习记录(二)稳定性与内存优化
  13. 今日分享——《青春》(李大钊)
  14. js html监听ctrl v,js监听组合按键
  15. python批量修改替换文件内容
  16. Python编程之读取Excel csv格式文件内容
  17. Spring Security 记住我功能原理以及实现
  18. 关系型数据库和非关系型数据库简单介绍:
  19. CDH6 安装 Apache atlas
  20. 《C语言》4小时不挂科【猴博士爱讲课】(学习笔记)

热门文章

  1. excel 单元格内换行
  2. ENVI辐射定标出现Calibration requires gain and offset for each band错误提示
  3. 实现UncaughtExceptionHandler来实现获取应用全局的crash信息
  4. 狂神说Reids完结篇
  5. Java 生成二维码实战
  6. 你以为只有菜鸟求职碰壁,其实还有...
  7. c语言的关键字怎么编辑,C语言的关键字
  8. linux下c爬取天气的源码,一个在conky中实现获取本地天气的c源代码
  9. 更改自定义按钮显示值并对单元格赋值
  10. FR复选框批量删除(填报)