Video Training for Assistance Driving

Pinjie Xu | 2025/05/30

目录

议程

背景

为何需要视频训练?

PyNvOnDemandDecoder

一个为辅助驾驶设计的高效按需视频解码库

PyNvOnDemandDecoder 设计

概览

PyNvOnDemandDecoder 设计概览,Page 5
PyNvOnDemandDecoder 设计概览,Page 5

随机帧访问 (Random Frame Access)

随机帧访问架构图,Page 6
随机帧访问架构图,Page 6

流式帧访问 (Streaming Frame Access)

流式帧访问架构图,Page 7
流式帧访问架构图,Page 7

解复用器-解码器分离帧访问 (Demuxer-Decoder Separation Frame Access)

随机帧访问 API

import PyNvOnDemandDecoder as nvc
# create random access decoder, only once
nv_gop_dec = nvc.CreateGopDecoder(
                           num_video_per_clip,
                           iGpu)
while True:
  # Reuse the nv_gop_dec to extract multi-frame from multi-file
  gop_decoded = nv_gop_dec.Decode(file_path_list,frame_id_list)

流式帧访问 API

import PyNvOnDemandDecoder as nvc
# create stream reader decoder, only once
nv_smp_rd = nvc.CreateSampleReader(
                           num_sets,
                           num_video_per_clip,
                           iGpu)
while True:
  # Reuse the nv_smp_rd to extract multi-frame from multi files progressively
  gop_decoded = nv_smp_rd.Decode(file_path_list,frame_id_list)

解复用器 & 解码器分离访问 API

import PyNvOnDemandDecoder as nvc
# create random access decoder, only once
nv_gop_dec = nvc.CreateGopDecoder(
                           num_video_per_clip,
                           iGpu)
# get GOP packets from demuxer
packets = nv_gop_dec.GetPackets(file_path_list,frame_id_list)
while True:
  # Reuse the packets and nv_gop_dec to extract the frames in those GOPs
  gop_decoded = nv_gop_dec.DecodePacket(packets,file_path_list,frame_id_list)

与 PyTorch 集成

# Enable GPU usage in multi-processing with spawn mode
torch.multiprocessing.set_start_method('spawn', force=True)

class VideoClipDatasetWithPyNVVideo(torch.utils.data.Dataset):
    def __init__(self):
        self.decoder = nvc.CreateGopDecoder(maxfiles, usedevicememory, iGpu)
    def __getitem__(self, index):
        decoded_frames = self.decoder.DecodeN12ToRGB(video_paths, frame_idx, True)
        return decoded_frames

# Custom Dataset Class
dataset = VideoClipDatasetWithPyNVVideo()
dataloader = DataLoader(dataset, batch_size, num_workers=4, pin_memory=True)

# 训练 pipeline
for batch in dataloader:
    train()

优化

数据并行与 NVDEC 流水线

NVDEC 流水线数据并行示意图, Page 13
NVDEC 流水线数据并行示意图, Page 13

免映射解码 (Map-free Decode)

目标GOP及免映射解码示意图, Page 14
目标GOP及免映射解码示意图, Page 14

设备内存管理 (Device Memory Management)

设备内存使用优化对比图, Page 15
设备内存使用优化对比图, Page 15

解复用器 (Demuxer) 与解码器 (Decoder) 的重用

Page 16 - 解复用器与解码器重用优化流程图
Page 16 - 解复用器与解码器重用优化流程图

性能

随机访问延迟与吞吐量

Page 17 - 随机访问性能对比图,包括帧解码延迟、完整视频解码吞吐量和存储使用情况。我们的方法在延迟上降低了53%,吞吐量提升了13.3倍,视频存储相比图像节省了79%。
Page 17 - 随机访问性能对比图,包括帧解码延迟、完整视频解码吞吐量和存储使用情况。我们的方法在延迟上降低了53%,吞吐量提升了13.3倍,视频存储相比图像节省了79%。

测试设备:
- GPU: NVIDIA A100-SXM4-80GB
- CPU: AMD EPYC 7742 64核处理器
-
仅用于技术讨论

流式访问延迟与吞吐量

Page 18 - 流式访问性能对比图,包括帧解码延迟和完整视频解码吞吐量。我们的方法在延迟上降低了43%,吞吐量提升了12.3倍。
Page 18 - 流式访问性能对比图,包括帧解码延迟和完整视频解码吞吐量。我们的方法在延迟上降低了43%,吞吐量提升了12.3倍。

测试设备:
- GPU: NVIDIA A100-SXM4-80GB
- CPU: AMD EPYC 7742 64核处理器
-
仅用于技术讨论

未来工作

总结 (Takeaway)

选择视频训练与PyNvOnDemandDecoder


DALI 图像管道设计用于 ADAS 训练

Roman Schäffert, DevTech | AI Open Day 2025/05/30

动机

概述
- 数据加载和预处理通常是训练中的瓶颈。

ADAS 使用案例
- 每个样本中处理多个图像(例如,多摄像头,多时间步)。
- 每个图像有多个处理步骤。

DALI 提供的方案
- 高效的数据加载和预处理。
- 在 GPU 上执行。
- 利用 GPU 的空闲时间进行训练。

目标:简化用于 ADAS 使用案例的 DALI 管道设计
- 提供一种能够轻松表示复杂训练数据的可能性。
- 构建一个灵活的 DALI 管道框架,该框架:
- 专门为 ADAS 设计。
- 灵活且易于适应新的使用案例。
- 可轻松集成到现有实现中(作为 PyTorch DataLoader 的直接替代品)。
- 计算效率高。

灵活的管道设计

概述

Page 25 - DALI ADAS 管道的灵活设计概览
Page 25 - DALI ADAS 管道的灵活设计概览

数据结构

Page 26 - SampleDataGroup (SDG) 的数据结构示意图,展示了其层级结构。
Page 26 - SampleDataGroup (SDG) 的数据结构示意图,展示了其层级结构。

处理步骤设计

Page 27 - 处理步骤设计示例,展示了变换如何应用于数据字段。
Page 27 - 处理步骤设计示例,展示了变换如何应用于数据字段。
处理步骤设计 (续)
Page 28 - 应用处理步骤到指定的子树(例如第一个摄像头)。
Page 28 - 应用处理步骤到指定的子树(例如第一个摄像头)。
- **将操作应用于具有给定名称的条目的所有子节点(在树中的任何位置)**
    - 此处显示:`"cams"`
Page 29 - 应用处理步骤到所有名为 "cams" 的子节点。
Page 29 - 应用处理步骤到所有名为 "cams" 的子节点。

- **还有更多可用的修饰符**

Page 30 - 示意图与上一页相同,强调有更多修饰符可用。
Page 30 - 示意图与上一页相同,强调有更多修饰符可用。
Page 31
Page 31

流水线灵活性

Page 32
Page 32

运行时性能

设置

Page 34
Page 34

[1] S. Wang et. al., “Exploring Object-Centric Temporal Modeling for Efficient Multi-View 3D Object Detection”, arXiv:2303.11926 [http://cs.CV]
代码: https://github.com/exiawsh/StreamPETR

结果

Page 36
Page 36

谢谢!

如果您想尝试/使用 DALI 流水线框架,请告诉我们!