• 利用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。

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

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

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

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

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

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

    4. 读取图像序列

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

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

    1. from nvidia.dali import pipeline_def
    2. import nvidia.dali.fn as fn
    3. import nvidia.dali.types as types
    4. # Define a function for showing output image
    5. import matplotlib.gridspec as gridspec
    6. import matplotlib.pyplot as plt
    7. %matplotlib inline
    8. def show_images(image_batch):
    9. columns = 4
    10. rows = (max_batch_size + 1) // (columns)
    11. fig = plt.figure(figsize = (24,(24 // columns) * rows))
    12. gs = gridspec.GridSpec(rows, columns)
    13. for j in range(rows*columns):
    14. plt.subplot(gs[j])
    15. plt.axis("off")
    16. plt.imshow(image_batch.at(j))
    17. # image sequence dir
    18. image_dir = "data/images"
    19. max_batch_size = 8
    20. # Define an image sequence reading pipeline
    21. @pipeline_def
    22. def simple_pipeline():
    23. jpegs, labels = fn.readers.file(file_root=image_dir)
    24. images = fn.decoders.image(jpegs, device='cpu')
    25. return images, labels
    26. # Build the pipeline
    27. pipe = simple_pipeline(batch_size=max_batch_size, num_threads=1, device_id=0)
    28. pipe.build()
    29. # Run the pipeline and show output
    30. pipe_out = pipe.run()
    31. images, labels = pipe_out
    32. show_images(images)

    输出结果如下:

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

  • 相关阅读:
    ArrayList
    Python入门之模块
    面试经典150题——生命游戏
    【机器学习】梯度下降法与牛顿法【Ⅲ】拟牛顿法
    【Vue项目复习笔记】详情页的展示
    如何快速删除 Word 文档中的分页符
    AcWing 1230. K倍区间
    Flutter 的缓存策略
    Pyinstaller安装与使用
    力扣练习——70 串联所有单词的子串
  • 原文地址:https://blog.csdn.net/DeliaPu/article/details/134405576