利用NVIDIA DALI读取视频帧

1. NVIDIA DALI简介

NVIDIA DALI全称是NVIDIA Data Loading Library,是一个用GPU加速的数据加载和预处理库,可用于图像、视频和语音数据的加载和处理,从而为深度学习的训练和推理加速。

NVIDIA DALI库的出发点是,深度学习应用中复杂的数据处理pipeline,如数据加载、解码、裁剪、Resize等功能,在CPU上处理已经成为瓶颈,限制了深度学习训练和推理的性能及可扩展性。DALI库通过使用GPU来处理这些功能,并封装了pre-fetch、并行执行、批处理等功能,降低用户的编程难度。

NVIDIA可适配于多种深度学习框架,如TensorFlow、PyTorch、MXNet和PaddlePaddle。

2. NVIDIA DALI安装

目前NVIDIA DALI只支持Linux x64系统,且CUDA版本在CUDA 11.0以上。

对于CUDA 11.X版本,安装命令行:

pip install --extra-index-url https://developer.download.nvidia.com/compute/redist --upgrade nvidia-dali-cuda110

对于CUDA 12.X版本,安装命令行如下:

pip install --extra-index-url https://developer.download.nvidia.com/compute/redist --upgrade nvidia-dali-cuda120

3. 读取视频帧

在深度学习应用中,我们常常需要从视频文件或者图像序列构建数据库。这一节就通过一个小例子说明如何用NVIDIA DALI从视频文件中读取指定数量视频帧。

最简单的使用方式,是通过@pipeline_def修饰符来定义nvidia dali pipeline,如下例,我们定义一个从视频文件(通过filenames指定视频文件列表)读取指定数量视频帧(通过sequence_length指定)的pipeline。

# Define a video pipeline
@pipeline_def
def video_pipeline(filenames, sequence_length):videos = fn.readers.video(device='gpu', filenames=filenames, sequence_length=sequence_length, name='Reader')return videos

 然后对以上定义的pipeline实例化:

sequence_length = 25
video_directory = r'/home/grace/BSVD/datasets/DAVIS-training-mp4'
video_files = [video_directory + '/' + f for f in os.listdir(video_directory)]# Build the video pipeline
pipe = video_pipeline(batch_size=1, num_threads=2, device_id=0, filenames=video_files, sequence_length=sequence_length, seed=123456)
pipe.build()

实例化过程中,可以传入其他pipeline参数,如batch_size、num_threads等。

构建完成后,通过pipeline.run()来实现视频帧的输出,默认为RGB类型。

for i in range(0,20):pipe_out = pipe.run()sequence_out = pipe_out[0].as_cpu().as_array()print('i = {}, sequence shape = {}'.format(i, sequence_out.shape))# show_sequence(sequence_out[0])save_images(i, sequence_out[0])   # 保存读取到的图像序列

4. 读取图像序列

除了从视频文件中读取视频帧,NVIDIA DALI还提供从图像序列读取数据的功能。

参考nvidia dali官方说明文档中的一个示例,亲测有效。

from nvidia.dali import pipeline_def
import nvidia.dali.fn as fn
import nvidia.dali.types as types# Define a function for showing output image
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
%matplotlib inlinedef show_images(image_batch):columns = 4rows = (max_batch_size + 1) // (columns)fig = plt.figure(figsize = (24,(24 // columns) * rows))gs = gridspec.GridSpec(rows, columns)for j in range(rows*columns):plt.subplot(gs[j])plt.axis("off")plt.imshow(image_batch.at(j))# image sequence dir
image_dir = "data/images"
max_batch_size = 8# Define an image sequence reading pipeline
@pipeline_def
def simple_pipeline():jpegs, labels = fn.readers.file(file_root=image_dir)images = fn.decoders.image(jpegs, device='cpu')return images, labels# Build the pipeline
pipe = simple_pipeline(batch_size=max_batch_size, num_threads=1, device_id=0)
pipe.build()# Run the pipeline and show outputpipe_out = pipe.run()
images, labels = pipe_out
show_images(images)

输出结果如下:

除了以上基础用法,nvidia dali还集成了很多数据增广方法,如旋转、剪切、resize等等,今天由于时间关系,下次再继续补充吧。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心大模型商业化领跑,百度在自我颠覆中重构生长力

随着科技巨头竞逐AI大模型,人工智能技术成为今年最受瞩目的新技术。但是,AI大模型的创新之路,还缺少一个足够有力的商业化答案。 作为全球最先发布大模型的互联网大厂,百度能否加速大模型的应用落地,以及文心大模型能…

VMware 系列:vmware vsphere虚拟化简介以及产品系下载、Esxi安装

vmware vsphere虚拟化简介以及产品系下载、Esxi安装 一. vmware vsphere 虚拟化(1.1)为什么要学习虚拟化(1.2)虚拟化产品介绍(1.3)Vsphere6.7特性二. ESXI(2.0)如何知道哪些品牌对应支持哪些版本的 ESXI,ESXI各个版本对OS的支持又是什么?比如看看哪些机器支持哪些版本…

排查生产环境:MySQLTransactionRollbackException数据库死锁

一. 问题现状 程序直接宕机,并在error.log日志中发现大量的报错日志,如下: ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting trans…

C++ Boost 实现异步端口扫描器

端口扫描是一种用于识别目标系统上哪些网络端口处于开放、关闭或监听状态的网络活动。在计算机网络中,端口是一个虚拟的通信端点,用于在计算机之间传输数据。每个端口都关联着特定类型的网络服务或应用程序。端口扫描通常是网络管理员、安全专业人员用来…

springboot项目中获取业务功能的导入数据模板文件

场景: 在实际业务场景中,经常会遇到某些管理功能需要数据导入共功能,但既然是导入数据,肯定会有规则限制,有规则就会有数据模板,但这个模板一般是让客户自己下载固定规则模板,而不是让客户自己随便上传模板。下面介绍直接下载模板 一、下载模板示例 1、在项目的…

MySQL 中 DELETE 语句中可以使用别名么?

某天,正按照业务的要求删除不需要的数据,在执行 DELETE 语句时,竟然出现了报错! 作者:林靖华,开源数据库技术爱好者,擅长MySQL和Redis的运维 爱可生开源社区出品,原创内容未经授权不…

Mysql查看Binlog文件

前期准备 检查是否开启binlog mysql> SHOW VARIABLES LIKE log_bin; // 或者 mysql> SHOW VARIABLES LIKE log%;ON代表开启,OFF代表关闭。如为OFF需 开启 后才能查看,但只能查看开启之后时间点的。 查看binlog文件有哪些 一般yum安装的mysql…

【python学习】基础篇-常用第三方库-chardet:检测文本文件的编码格式

chardet是一个Python库,用于检测文本文件的编码格式。 以下是一些基本的用法: 使用chardet.detect()函数检测文件编码 with open(example.txt, rb) as f:result chardet.detect(f.read()) print(result[encoding])使用chardet.detect()函数检测字节串…

【python学习】基础篇-常用第三方库-requests库:用于发送各种类型的HTTP请求

在Python中,requests库是一个常用的HTTP请求库,用于发送各种类型的HTTP请求。 以下是一些基本的用法: 更多高级功能可以参考官方文档:https://docs.python-requests.org/ 发送GET请求 response requests.get(https://www.examp…

Program Header Table(转载)

程序头表与段表相互独立,由ELF文件头统一管理。 程序头表负责ELF文件从文件到加载后映像的映射关系,一般只有可执行文件包含。 1. segment和section segment: 程序头表项描述的对象称为segment,即elf文件加载后的数据块; 它提供…

exports和module.exports 区别

在 Node.js 中,“exports”和“module.exports”两者的区别有以下几点: 导出对象类型不同: exports 是对 module.exports 的一个全局引用,而实际导出的是 module.exports 对象。即 exports 只是为了方便,可以在不断开…

C++学习(2):分配器allocator

new和operator new new是关键字,new 操作符的执行过程: 调用operator new分配内存;调用构造函数在operator new返回的内存地址处生成类对象; operator new是一个函数,可以被重载,通过重载它,…

微服务开发中,使用AOP和自定义注解实现对权限的校验

一、背景 微服务开发中,暴露在外网的接口,为了访问的安全,都是需要在http请求中传入登录时颁发的token。这时候,我们需要有专门用来做校验token并解析用户信息的服务。如下图所示,http请求先经过api网关,网…

[点云分割] 欧式距离分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <chrono>#include <pcl/ModelCoefficients.h> // 模型系数的定义 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 各种点云数据类型 #include <pcl/sample_c…

java“贪吃蛇”小游戏

基于java实现贪吃蛇小游戏&#xff0c;主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做&#xff1a;Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面&#xff1a; 代码主界面主要讲解的是 …

window文件夹下python脚本实现批量删除无法预览的图片

你是否遇到过下载的图片会发现有些图片会无法预览情况&#xff1f; 有几种原因可能导致一些图片在预览时无法正常显示&#xff1a; 损坏的图片文件&#xff1a; 图片文件可能损坏或者部分损坏&#xff0c;导致无法被正常解析和预览。这种情况可能是因为文件在传输过程中损坏、…

蓝桥等考C++组别八级003

第一部分:选择题 1、C++ L8 (15分) 整数16,20的最大公约数(公因数)是( )。 A. 1 B. 2 C. 4 D. 80 正确答案:C

机器学习入门(第二天)——感知机

概述 每个算法都是为了解决一类问题&#xff0c;或者说解决之前的问题所创造出来的&#xff0c;而感知机&#xff0c;在解决一类问题的时候也暴露了很多问题&#xff0c;变相的推动了以后的算法的改进方向。 知识树 苹果表示相对重要的 直观介绍 现在有一盘红豆和绿豆&#…

Caused by: java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory

今天项目启动时报错&#xff0c;刻意记录一下&#xff0c;具体报错部分日志如下&#xff1a; Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name sqlSessionFactory defined in class path resource [com/baomidou/mybatis…

2014年8月20日 Go生态洞察:Go在OSCON的精彩亮相

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…