参考文章:Multi-threaded Camera Caffe Inferencing

     TX2之多线程读取视频及深度学习推理

背景

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

在上篇博客 在Jetson TX2上显示摄像头视频并使用python进行caffe推理 实际上使用了单线程。本篇博客采用两个不同的线程,一个进行摄像机捕获,一个进行caffe推理。

程序下载: tegra-cam-caffe-threaded.py

线程间工作的分配

将摄像机捕获图像放入子线程,主线程完成其余所有工作,包括caffe初始化、推理和图像呈现。下面是启动子线程进行摄像机图像捕获并完成后终止它的代码片段

import threading

#
# This 'grab_img' function is designed to be run in the sub-thread.
# Once started, this thread continues to grab new image and put it
# into the global IMG_HANDLE, until THREAD_RUNNING is set to False.
#
def grab_img(cap):
    global THREAD_RUNNING
    global IMG_HANDLE
    while THREAD_RUNNING:
        _, IMG_HANDLE = cap.read()

def main():
    ......
    # Start the sub-thread, which is responsible for grabbing images
    THREAD_RUNNING = True
    th = threading.Thread(target=grab_img, args=(cap,))
    th.start()

    ......
    # Terminate the sub-thread
    THREAD_RUNNING = False
    th.join()

线程间的同步

多线程读取视频帧进行caffe推理适合经典的生产者-消费者模型,如下图

摄像机图形捕获线程充当生产者,主线程(caffe推理)充当消费者。我们需要设计一个队列来处理生产和消费,我们需要监视队列的满度,以决定是否需要删除项目和限制消费者。

在我们的例子中,我们认为生产者(以30帧每秒捕获摄像机)可能比消费者(caffe推理,其速率取决于模型的复杂程度)更快。我们需要跟踪相机捕获线程产生的最新图像帧,通过python中的垃圾收集器,甚至不需要使用互斥锁来保留最新帧。

我使用一个全局变量 IMG_HANDLE 来引用图像帧,每当生产者(摄像机捕获线程)从相机获取新帧时,这个 IMG_HANDLE 就会更新。另一方面,每当消费者(caffe推理线程)准备处理下一个图像帧,它就取消对 IMG_HANDLE 的引用,从而总是获得最新的图像帧。

帧2、4、5被丢弃时,python垃圾回收器自动回收,因为程序不再有对他们的引用。事实上,一旦caffe推理线程完成,帧1、3、6也会被垃圾收集。

程序的使用

python3 tegra-cam-caffe-threaded.py --usb --vid 

讨论与总结

但是,这种多线程设计是否有助于提高caffe推理脚本的吞吐量?也就是说能否通过这种设计推断出更多的帧/秒(fps)。答案可能是否定的。例如在最初的单线程设计中,假设摄像机捕获图像生成图像帧的速度比caffe推理的速度快,然后cap.read()总是立即返回(非阻塞方式)。因为总是有图像帧等待处理,更具体的说,旧的图像帧要么在v4l2驱动缓冲区中排队,要么在gstream/opencv堆栈中排队,然后又由cap.read()立即返回。那么旧的相框很可能不是相机捕捉到的最新的相框。

那么,这种多线程设计的真正好处是什么呢?

tegra-cam-caffe-threaded.py 中,我们只在全局变量IMG_HANDLE中保留最新的一个图像帧。因此,caffe推理(主)线程总是获取最新抓取的图像帧进行处理。总之,我认为这种多线程设计有助于改善caffe推理程序的延迟。

在TX2上多线程读取视频帧进行caffe推理的更多相关文章

  1. TX2之多线程读取视频及深度学习推理

    背景 一般在TX2上部署深度学习模型时,都是读取摄像头视频或传入视频文件进行推理,从视频中抽取帧进行目标检测等任务.对于大点的模型,推理的速度是赶不上摄像头或视频的帧率的,如果我们使用单线程进行处理, ...

  2. 在Jetson TX2上显示摄像头视频并使用python进行caffe推理

    参考文章:How to Capture Camera Video and Do Caffe Inferencing with Python on Jetson TX2 与参考文章大部分都是相似的,如果 ...

  3. How to read video frames in hadoop?如何在Hadoop中读取视频帧?

    To process specialized file formats (such as video) in Hadoop, you'd have to write a custom InputFor ...

  4. python opencv 按一定间隔截取视频帧

    前言关于opencvOpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. ...

  5. 使用JavaCV实现读取视频信息及自动截取封面图

    概述 最近在对之前写的一个 Spring Boot 的视频网站项目做功能完善,需要利用 FFmpeg 实现读取视频信息和自动截图的功能,查阅资料后发现网上这部分的内容非常少,于是就有了这篇文章. 视频 ...

  6. opencv 读取视频内容写入图片帧

    现在主要把自己平时用到的opencv功能记录到博客,一方面方便自己有时间来回顾,另一方便提供给大家一个参考. opencv 读取视频内容,把视频帧每一帧写成图片,存入电脑中.这个步骤是许多数据处理的基 ...

  7. 在Jetson TX2上捕获、显示摄像头视频

    参考文章:How to Capture and Display Camera Video with Python on Jetson TX2 与参考文章大部分都是相似的,如果不习惯看英文,可以看看我下 ...

  8. python_Opencv_读取视频

    目标 • 学会读取视频文件,显示视频,保存视频文件 • 学会从摄像头获取并显示视频 • 你将会学习到这些函数:cv2.VideoCapture(),cv2.VideoWrite()用摄像头捕获视频 使 ...

  9. opencv学习之路(2)、读取视频,读取摄像头

    一.介绍 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. ①读取视频有两种方法: A. VideoCapture cap; cap.open(“1.a ...

随机推荐

  1. MySQL入门,第五部分,表结构的修改

    ALTER TABLE <基本表名> [ ADD <新列名> <列数据类型> [列完整性约束] DROP COLUMN <列名> MODIFY < ...

  2. 痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题之初体验. 接上篇 <走进二维码(QR Code)的世界(1)- 引言> 继续更文,在 ...

  3. 科技发展时间线(Technology Timeline)

    本文主要记录,过去两百年间,科技发展的时间线 这些内容,是自己在学习电脑发展历史的时候做的, 感兴趣的同学,可以复制到 Excel 里面,按顺序逐一进行学习, 学习和整理的过程确实花了很长时间,但是并 ...

  4. excel完成数据库数据的批量插入

    业务场景: 开发过程中往往会遇到这样情况就是产品直接给我们一堆数据,让咱们直接导入到后台数据库中,这时候咱们只需要在excel表中进行直接操作即可,如图所示(以河北省的编号为例): 而对应的数据表为: ...

  5. 端口扫描工具nmap的常用参数讲解

    转载请注明出处:https://www.cnblogs.com/wangyanzhong123/p/12576406.html nmap下载与安装 这个没什么好说的.很简单官网上下载就ok了,需要注意 ...

  6. php开发中如何判断 是否微信访问

    在开发中遇到了这样一个需求,仅允许在微信中访问,所以就要对微信浏览器访问进行判断,本篇博文讲述如何判断是否是微信访问. /** * 判断是否微信访问 * @return bool */ functio ...

  7. window 10 安装paddlepaddle 1.7 GPU版本

    window 10 安装paddlepaddle 1.7 GPU版本 1)更新显卡驱动 2)安装cuda 10 https://developer.nvidia.com/cuda-10.0-downl ...

  8. stand up meeting 12/25/2015 & weekend 12/26/2015~12/27/2015

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  在pdf阅读页面添加生词本显示:UI美化     6 完善显示 ...

  9. 【简单了解系列】从基础的使用来深挖HashMap

    HashMap定义 说的专业一点,HashMap是常用的用于存储key-value键值对数据的一个集合,底层是基于对Map的接口实现.每一个键值对又叫Entry,这些Entry分散的存储在一个由数组和 ...

  10. Supermarket POJ - 1456(贪心)

    题目大意:n个物品,每个物品有一定的保质期d和一定的利润p,一天只能出售一个物品,问最大利润是多少? 题解:这是一个贪心的题目,有两种做法. 1 首先排序,从大到小排,然后每个物品,按保质期从后往前找 ...