参考文章: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. docker 相关操作

    docker-compose down //关闭所有容器 docker-compose up //开启所有容器 docker-compose restart //重启所有容器 单独更新某个容器时用脚本 ...

  2. "强调内容"组件:<em> —— 快应用组件库H-UI

     <import name="em" src="../Common/ui/h-ui/text/c_tag_i"></import> & ...

  3. matplotlib 中其他基于Affine2DBase的类

    2020-04-11 11:42:22 --Edit by yangray以下所有类(除了BboxTransformToMaxOnly )都直接继承于Affine2DBaseIdentityTrans ...

  4. python3(十八)decorator

    # -----------------------1-------------------------------------------- # 由于函数也是一个对象,而且函数对象可以被赋值给变量,所 ...

  5. 如何使用npt结合crontab实现集群之间的时间同步

    当我们每个机器的时间都不一致时,假如有一个定时任务,定的10点启动执行.结果namenode十点了启动任务,可是分配到的执行节点DataNode才九点五十导致任务执行失败怎么办?这就需要将机器之间的时 ...

  6. Docker php安装扩展步骤详解

    前言 此篇,主要是演示docker-php-source , docker-php-ext-install ,docker-php-enable-docker-configure 这四个命令到底是用来 ...

  7. Linux环境下django初入

    python -m pip install --upgrade pip 终端中 一. 创建项目: 1.django-admin startproject mysite(第一种比较好) 2.django ...

  8. 选择IT行业的自我心得,希望能帮助到各位!(一)

    我记得当时我还在读书的时候,也是卡在高三在后面,纠结我该怎么选择专业,一边顶着高考的压力又担心这担心那的,前怕狼后怕虎,一直犹犹豫豫,知道有一天我就听到谁谁谁的哥哥学IT老牛逼了,一个月多少多少钱,买 ...

  9. python批量爬取动漫免费看!!

    实现效果 运行环境 IDE VS2019 Python3.7 Chrome.ChromeDriver Chrome和ChromeDriver的版本需要相互对应 先上代码,代码非常简短,包含空行也才50 ...

  10. E - Sum of gcd of Tuples (Hard) Atcoder 162 E(容斥)

    题解:这个题目看着挺吓人的,如果仔细想想的话,应该能想出来.题解还是挺好的理解的. 首先设gcd(a1,a2,a3...an)=i,那么a1~an一定是i的倍数,所以ai一共有k/i种取值.有n个数, ...