利用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 inline

def show_images(image_batch):
    columns = 4
    rows = (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 output

pipe_out = pipe.run()
images, labels = pipe_out
show_images(images)

输出结果如下:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络基础(一)

文章目录: 计算机网络认识计算机网络背景网络发展认识 “协议” 网络协议初识协议分层OSI七层模型TC/IP 五层(或四层)模型 网络传输基本流程网络传输流程图同局域网的两台主机进行通信跨网络的两台主机进行通信数据包的封装和分用 网络中的地…

本周Github有趣项目:draw-a-ui等

有趣的项目、工具和库 gpt-crawler 抓取网站以生成知识文件,从而从 URL 创建您自己的自定义 GPT。 需要步骤: 配置运行爬虫、 将您的数据上传到 OpenAI:使用此选项通过 UI 访问您生成的知识,您可以轻松与他人共享 创建自定义助…

AR眼镜_单目光波导VS双目光波导方案

双目光波导AR眼镜方案是一种创新的智能设备,可以在现实场景中叠加虚拟信息,提供增强的视觉体验和交互体验。光学显示方案是AR眼镜的核心技术之一,它对眼镜的性能和使用体验起着决定性的作用。 相比于单目AR眼镜,双目AR眼镜具有更好…

【算法】距离(最近公共祖先节点)

题目 给出 n 个点的一棵树,多次询问两点之间的最短距离。 注意: 边是无向的。所有节点的编号是 1,2,…,n。 输入格式 第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数; 下来 n−1 行,每行三个整数 x,y,k&am…

mtgsig1.2简单分析

{"a1": "1.2", # 加密版本"a2": new Date().valueOf() - serverTimeDiff, # 加密过程中用到的时间戳. 这次服主变坏了, 时间戳需要减去一个 serverTimeDiff(见a3) ! "a3": "这是把xxx信息加密后提交给服务器, 服主…

深度优化数据库性能:Linux 内核参数调整解析

点击上方蓝字关注我 数据库服务器性能的优化是每个IT团队关注的焦点之一。除了数据库引擎的优化之外,合理调整操作系统的内核参数也是提高数据库性能的关键。本文将解析一些常见的 Linux 内核参数,以及它们在数据库服务器优化中的作用和建议的值。 1. 参…

【学习笔记】Java安全之动态加载字节码

文章目录 什么是Java的字节码利用URLClassLoader加载远程class文件利用ClassLoader#defineClass直接加载字节码利用TemplatesImpl加载字节码利用BCEL ClassLoader加载字节码 最近在学习Phith0n师傅的知识星球的Java安全漫谈系列,随手记下笔记 什么是Java的字节码 J…

StoneDB顺利通过中科院软件所 2023 开源之夏 结项审核

近日,中科院软件所-开源软件供应链点亮计划-开源之夏2023的结项名单正式出炉,经过三个月的项目开发和一个多月的严格审核,共产生 418个成功结项项目!其中,StoneDB 作为本次参与开源社区,社区入选的两个项目…

MHA高可用

MHA: 什么是MHA:masterhight availabulity:基于主库的高可用环境下:主从复制,故障恢复 有一个主从的架构。 MHA实验要求,最少有一主两从 Mysql的单点故障问题,一旦主库崩溃,MHA可以在0-30S内…

【工作记录】springboot应用实现license认证

前言 License授权是一种常见的商业模式,一般用于在客户端部署项目后进行使用人员或功能限制,也常用于软件的试用场景。 主要实现思路就是在服务端生成密钥对及证书,在客户端启动或访问过程中进行验证。 本文实现的是通过IP地址、MAC地址、…

【MySQL】运行报错:ERROR 1193 (HY000): Unknown system variable ‘tx_isolation‘ 查看隔离级别报错

1、查看事务隔离级别的时候报错: 原因: 老版本 MySQL 比如 5 中用的是 tx_isolation,而应该是在 5.7.20 版本之后,用的是 transaction_isolation。 所以:在 MySQL 8 及之后的版本中,只需将语句中的 tx_isol…

FPGA基础以太网

以太网数据通信 物理层:网线网卡(PHY芯片) 数据链路层:Mac层(数据有效传输) 如图所示:FPGA中的Mac层中的MII接口负责控制PHY芯片,PHY芯片通过网线与PC端进行以太网数据传输。 FPGA中&#xff…

【草料】uni-app ts vue 小程序 如何如何通过草料生成对应的模块化二维码

一、查看uni-app项目 1、找到路径 可以看到项目从 src-race-pages-group 这个使我们目标的查询页面 下面我们将这个路径copy到草料内 2、找到进入页面入参 一般我们都会选择 onload() 函数下的入参 这里我们参数的是 id 二、草料 建议看完这里的教程文档 十分清晰&#xff01…

学习笔记6——垃圾回收

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/190801.html java垃圾回收(stop the world) 专注于堆和方法区的垃圾回收,年轻代,老年代,永久代判断对象是否还存…

基于flask和fomantic-ui的简易p2p文件分享平台的手动实现

背景 开学一个多月了,由于繁重的学业和懒惰,都没怎么更新有意思的博客。 前几天突然想到了一个想法。同学之间平常用网络分享一个文件,大部分都是用的qq。但是qq看起来把文件拖到聊天框点击发送就发给对面同学了。但是实际上是先上传到了腾…

【C语言期末不挂科——指针篇1】

C语言指针初阶 文章目录 C语言指针初阶**什么是指针?**   **1)初识指针**  **2)地址的大小**  **3)指针变量** **指针的类型**   **1)指针对整数加减运算**  **2)指针的解引用** **野指针**  **1&#xff…

河北大学选择ZStack Cube超融合一体机打造实训云平台

河北大学通过云轴科技ZStack Cube超融合一体机构建校园实训云平台,部署测试仅耗时1天,该平台能够更快地为学生提供高性能、高可用的云主机、云存储和云网络服务;同时也能满足日常运维管理要求,为学生提供更好的实训环境。 河北省…

什么是NoSQL?什么是redis?redis是做什么的?

redis官网 NoSQL泛指非关系型数据库,redis是其中的一种,Redis是发展最快的。 什么是NoSQL? NoSQL是一个广义的术语,指的是非关系型数据库,不同于传统的关系型数据库(如MySQL、Oracle等)。它没有…

(二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数据集二、导入数据以及展示部分1.导入数据集以及对数据集进行处理2.展示数据(看看就好) 三(1)、搭建网络进…

Diagrams——制作短小精悍的流程图

今天为大家分享的是一款轻量级的流程图绘制软件——Diagrams。 以特定的图形符号加上说明,表示算法的图,称为流程图或框图。流程图是流经一个系统的信息流、观点流或部件流的图形代表。我们常用流程图来说明某一过程。 流程图使用一些标准符号代表某些类…