TAO v5.5.0

ActionRecognitionNet

ActionRecognitionNet 接受图像序列作为网络输入,并预测这些图像中人物的动作。TAO 提供 2D/3D 网络骨干,具有以下输入选项:仅 RGB 输入、仅光流 (OF) 输入和双流联合输入 (RGB+OF)。

action_recognition_arch.png

动作识别网络架构

ActionRecognitionNet 需要 RGB 视频帧用于 RGB 输入流,以及光流向量用于 OF 输入流。原始光流向量的 x 轴和 y 轴应映射到灰度图像以进行训练。我们提供了一个工具来预处理样本。此工具将视频转换为帧,并基于 NVIDIA 光流 (NVOF) SDK 生成光流图像。

按照以下结构组织数据

复制
已复制!
            

/Dataset /class_a /video_1 /rgb 000000.png 000001.png ... N.png /u 000000.jpg 000001.jpg ... N-1.jpg /v 000000.jpg 000001.jpg ... N-1.jpg

数据集的根目录包含多个子目录,用于不同的类别。每个类别目录都有子文件夹,用于不同的视频,并且每个子文件夹都包含 rgbuv 文件夹,分别用于存放 RGB 帧、光流 x 轴灰度图像和光流 y 轴灰度图像。如果您想训练仅 RGB 模型,uv 文件夹可以为空。我们提供了一个脚本来仅生成 RGB 帧。

注意

预处理工具在 MIT 许可证下于 Github 上发布。并且为处理 HMDB51 数据集提供了all-in-one脚本。

常见的数据处理流程可以使用以下图表描述

rgb_preprocess_pipe.png

仅 RGB 数据处理流程

of_preprocess_pipe.png

仅 OF 数据处理流程

ActionRecognitionNet 的规范文件包括 modeltraindataset 参数。以下是训练 3D 仅 RGB 模型(骨干网络为 resnet18)在包含 5 个类别的数据集上的示例规范:“walk”、“sits”、“squat”、“fall”、“bend”

复制
已复制!
            

model: model_type: rgb backbone: resnet18 rgb_seq_length: 3 input_type: 3d sample_rate: 1 dropout_ratio: 0.0 dataset: train_dataset_dir: /data/train val_dataset_dir: /data/test label_map: walk: 0 sits: 1 squat: 2 fall: 3 bend: 4 output_shape: - 224 - 224 batch_size: 32 workers: 8 clips_per_video: 15 augmentation_config: train_crop_type: no_crop horizontal_flip_prob: 0.5 rgb_input_mean: [0.5] rgb_input_std: [0.5] val_center_crop: False train: optim: lr: 0.0005 momentum: 0.9 weight_decay: 0.0005 lr_scheduler: MultiStep lr_decay: 0.1 lr_steps: [15, 25] patience: 1 min_lr: 0.0001 num_epochs: 10 checkpoint_interval: 5 validation_interval: 5 clip_grad_norm: 0.0 num_gpus: 1 gpu_ids: [0] seed: 1234

参数 数据类型 默认值 描述 支持的值
model dict config 模型架构的配置
dataset dict config 数据集的配置
train dict config 训练任务的配置
evaluate dict config 评估任务的配置
inference dict config 推理任务的配置
encryption_key string None 用于加密和解密模型文件的加密密钥
results_dir string /results 实验结果保存的目录
export dict config ONNX 导出任务的配置

model

model 参数提供了更改 ActionRecognitionNet 架构的选项。

复制
已复制!
            

model: model_type: rgb backbone: resnet18 rgb_seq_length: 3 input_type: 3d sample_rate: 1 dropout_ratio: 0.0

参数 数据类型 默认值 描述 支持的值
model_type string joint 模型类型,可以是 rgb(仅 RGB 模型)、of(仅 OF 模型)或 joint(RGB+OF 模型) rgb/of/joint
backbone string resnet18 模型的骨干网络。当前支持的骨干网络为 ResNet18/34/50/101 resnet18/34/50/101
input_type string 2d 模型的输入类型。可以是 2d3d 2d/3d
rgb_seq_length unsigned int 3 单次推理的 RGB 帧数 >0
rgb_pretrained_model_path string None RGB 模型的预训练权重的绝对路径
rgb_pretrained_num_classes unsigned int 0 预训练 RGB 模型的类别数。使用 0 指定与当前训练相同的类别数。 >=0
of_seq_length unsigned int 10 单次推理的光流帧数 >0
of_pretrained_model_path string None OF 模型的预训练权重的绝对路径
of_pretrained_num_classes unsigned int 0 预训练 RGB 模型的类别数。使用 0 指定与当前训练相同的类别数。 >=0
joint_pretrained_model_path string None 联合模型的预训练权重的绝对路径
num_fc unsigned int 64 联合模型的隐藏单元数 >0
sample_rate unsigned int 1 用于选取连续帧的采样率。例如,如果 sample_rate 为 2,则每 2 帧选取一帧。 >0
dropout_ratio float 0.5 丢弃隐藏单元的概率 0.0 ~ 1.0

train

train 参数定义了训练过程的超参数。

复制
已复制!
            

train: optim: lr: 0.0005 momentum: 0.9 weight_decay: 0.0005 lr_scheduler: MultiStep lr_decay: 0.1 lr_steps: [15, 25] patience: 1 min_lr: 0.0001 num_epochs: 10 checkpoint_interval: 5 validation_interval: 5 clip_grad_norm: 0.0 num_gpus: 1 gpu_ids: [0] seed: 1234

参数 数据类型 默认值 描述 支持的值
num_gpus unsigned int 1 用于分布式训练的 GPU 数量 >0
gpu_ids List[int] [0] 用于分布式训练的 GPU 索引
seed unsigned int 1234 random、NumPy 和 torch 的随机种子 >0
num_epochs unsigned int 10 运行实验的总 epoch 数 >0
checkpoint_interval unsigned int 1 保存检查点 (checkpoint) 的 epoch 间隔 >0
validation_interval unsigned int 1 运行验证的 epoch 间隔 >0
resume_training_checkpoint_path string 从中恢复训练的中间 PyTorch Lightning 检查点
results_dir string /results/train 用于保存训练结果的目录
optim dict config SGD 优化器的配置,包括学习率、学习率调度器和权重衰减 >1
clip_grad_norm float 0.0 通过 L2 范数裁剪梯度的量。0.0 表示不裁剪 >=0

optim

optim 参数定义了训练中 SGD 优化器的配置,包括学习率、学习率调度器和权重衰减。

复制
已复制!
            

optim: lr: 0.0005 momentum: 0.9 weight_decay: 0.0005 lr_scheduler: MultiStep lr_decay: 0.1 lr_steps: [15, 25] patience: 1 min_lr: 0.0001

参数

数据类型

默认值

描述

支持的值

lr float 5e-4 训练的初始学习率 >0.0
momentum float 0.9 SGD 优化器的动量 >0.0
weight_decay float 5e-4 权重衰减系数 >0.0

lr_scheduler

string

MultiStep

学习率调度器。提供了两个调度器
* MultiStep : 在设定的步骤中将 lr 降低 lr_decay 倍;
* AutoReduce : 当 lr_monitor 的下降幅度不超过先前值的 0.1% 时,将 lr 降低 lr_decay 倍。

MultiStep/AutoReduce

lr_decay float 0.1 学习率调度器的降低因子 >0.0
lr_steps int list [15, 25] 用于 MultiStep 调度器降低学习率的步数 int list
lr_monitor string val_loss AutoReduce 调度器的监控值 val_loss/train_loss
patience unsigned int 1 在没有改进的情况下,学习率将被降低的 epoch 数 >0
min_lr float 1e-4 训练中的最小学习率 >0.0

dataset

dataset 参数定义了数据集源、训练批次大小和数据增强。

复制
已复制!
            

dataset: train_dataset_dir: /data/train val_dataset_dir: /data/test label_map: walk: 0 sits: 1 squa: 2 fall: 3 bend: 4 output_shape: - 224 - 224 batch_size: 32 workers: 8 clips_per_video: 15 augmentation_config: train_crop_type: no_crop horizontal_flip_prob: 0.5 rgb_input_mean: [0.5] rgb_input_std: [0.5] val_center_crop: False

参数 数据类型 默认值 描述 支持的值
train_dataset_dir string 训练数据集的路径
val_dataset_dir string 验证数据集的路径
label_map dict 将类别名称映射到索引的字典
output_shape list [224, 224] 数据增强后的输出形状 unsigned int list,大小为 2
batch_size unsigned int 32 训练和验证的批次大小 >0
workers unsigned int 8 并行处理数据的 worker 数量 >0
clips_per_video unsigned int 1 在一个 epoch 中从一个视频采样的片段数 >0
augmentation_config dict config 用于定义数据增强方法的参数
注意

对于 3D 模型,输入布局为 NCDHW,其中 N 是批次大小,C 是输入通道,D 是深度或序列长度,H 是图像高度,W 是图像宽度。

对于 2D 模型,输入布局为 N[CxD]HW

augmentation_config

augmentation_config 参数包含数据增强的超参数。

复制
已复制!
            

augmentation_config: train_crop_type: no_crop horizontal_flip_prob: 0.5 rgb_input_mean: [0.5] rgb_input_std: [0.5] val_center_crop: False

参数 数据类型 默认值 描述 支持的值

train_crop_type

string

random_crop

训练时的裁剪类型
* random_crop: 在图像上随机裁剪 output_shape 区域。
* multi_scale_crop: 裁剪图像的四个角和中心
具有多个尺度,并从中随机选择一个裁剪后的区域。
* no_crop: 不裁剪训练图像。

random_crop
multi_scale_crop
no_crop

scales float list [1.0] multi_scale_crop 中生成裁剪图案的尺度 float list / >0.0
rgb_input_mean float list [0.485, 0.456, 0.406] RGB 帧的输入均值:(input - mean) / std float list / size=1 或 3
rgb_input_std float list [0.229, 0.224, 0.225] RGB 帧的输入标准差:(input - mean) / std float list / size=1 或 3
of_input_mean float list [0.5] OF 帧的输入均值:(input - mean) / std float list / size=1 或 3
of_input_rgb float list [0.5] OF 帧的输入标准差:(input - mean) / std float list / size=1 或 3
val_center_crop bool False 指定是否在验证中中心裁剪图像。

crop_smaller_edge

unsigned int

256

指定是否调整图像大小,在训练中 random_crop 或验证中 center_crop 之前,将 crop_smaller_edge 应用于短边。 >0

使用以下命令运行 ActionRecognitionNet 训练

复制
已复制!
            

tao model action_recognition train [-h] -e <experiment_spec_file> [results_dir=<global_results_dir>] [model.<model_option>=<model_option_value>] [dataset.<dataset_option>=<dataset_option_value>] [train.<train_option>=<train_option_value>] [train.gpu_ids=<gpu indices>] [train.num_gpus=<number of gpus>]

必需参数

唯一必需的参数是实验规范的路径

  • -e, --experiment_spec: 用于设置训练实验的实验规范文件

可选参数

您可以设置可选参数来覆盖实验规范文件中的选项值。

注意

对于训练、评估和推理,我们为每个相应的任务公开 2 个变量:num_gpusgpu_ids,它们分别默认为 1[0]。如果两者都已传递,但不一致,例如 num_gpus = 1gpu_ids = [0, 1],则它们将被修改为遵循具有更多 GPU 的设置,例如 num_gpus = 1 -> num_gpus = 2

检查点和恢复训练

在每个 train.checkpoint_interval,都会保存一个 PyTorch Lightning 检查点。它被称为 model_epoch_<epoch_num>.pth。这些检查点保存在 train.results_dir 中,如下所示

复制
已复制!
            

$ ls /results/train 'model_epoch_000.pth' 'model_epoch_001.pth' 'model_epoch_002.pth' 'model_epoch_003.pth' 'model_epoch_004.pth'

最新的检查点也保存为 ar_model_latest.pth。如果 ar_model_latest.pth 存在于 train.results_dir 中,训练将自动从其恢复。如果提供了 train.resume_training_checkpoint_path,则会覆盖此行为。

此逻辑的主要含义是,如果您希望从头开始全新训练,则可以

  • 指定一个新的空结果目录(推荐)

  • 从结果目录中删除最新的检查点

ActionRecognitionNet 的评估指标是识别准确率。为视频评估提供了两种视频采样策略模式:centerconv

center 评估推理在视频片段的中间部分帧上执行。例如,如果模型需要 32 帧作为输入,而视频片段有 128 帧,则将使用从索引 48 到索引 79 的帧来执行推理。

conv 评估推理在视频片段的多个分段上执行。例如,一个视频片段均匀地分为 10 个部分;每个分段的中心被视为起始点,从中选择 32 个连续帧以形成一个推理分段。以这种方式,为视频被分割成的每个部分生成一个推理分段。视频的最终标签由这 10 个分段的平均得分确定。

使用以下命令运行 ActionRecognitionNet 评估

复制
已复制!
            

tao model action_recognition evaluate -e <experiment_spec_file> evaluate.checkpoint=<model to be evaluated> [evaluate.batch_size=<batch size>] [evaluate.test_dataset_dir=<path to test dataset>] [evaluate.video_eval_mode=<evaluation mode for the video>] [evaluate.video_num_segments=<number of segments for ``conv`` mode>] [evaluate.gpu_ids=<gpu indices>] [evaluate.num_gpus=<number of gpus>]

动作识别目前不支持多 GPU 评估。

必需参数

  • -e, --experiment_spec_file: 用于设置评估实验的实验规范文件。这应与训练规范文件相同。

  • evaluate.checkpoint: .pth 模型。

可选参数

  • evaluate.batch_size: 在评估中执行推理的批次大小。默认值为 1。

  • evaluate.test_dataset_dir: 测试数据集的路径。如果未设置,将使用 experiment_spec 中的验证数据集。

  • evaluate.video_eval_mode: 视频的评估模式

    • center: 评估推理在视频片段的中间部分帧上执行。这是默认模式。

    • conv: 评估推理在视频片段的多个分段上执行。最终预测在所有分段之间取平均值。

  • evaluate.video_num_segments: 在 conv 评估模式下,在一个视频片段中采样的分段数。默认值为 10。

  • evaluate.results_dir: 结果目录。默认为 /results/evaluate

使用以下命令在 ActionRecognitionNet 上使用 .pth 模型运行推理。

复制
已复制!
            

tao model action_recognition inference -e <experiment_spec> inference.checkpoint=<inference model> inference.inference_dataset_dir=<path to dataset to be inferenced> [inference.batch_size=<batch size>] [inference.video_inf_mode=<inference >] [inference.video_num_segments] [inference.gpu_ids=<gpu indices>] [inference.num_gpus=<number of gpus>]

输出格式为 [video_sample_path] [labels list of inference segments in this video]

动作识别目前不支持多 GPU 推理。

必需参数

  • -e, --experiment_spec: 用于设置推理的实验规范文件。这可以与训练规范相同。

  • inference.checkpoint: 用于执行推理的 .pth 模型。

  • inference.inference_dataset_dir: 用于执行推理的数据集的路径。它应为类级别的目录,如准备数据集部分所述。

可选参数

  • inference.batch_size: 在评估中执行推理的批次大小。默认值为 1。

  • inference.video_inf_mode: 视频的推理模式

    • center: 推理在视频片段的中间部分帧上执行。这是默认模式。

    • conv: 推理在视频片段的多个分段上执行。所有分段预测都保存在标签列表中。

  • inference.video_num_segments: 在 conv 推理模式下,在一个视频片段中采样的分段数。

  • inference.results_dir: 结果目录。默认为 /results/inference

fall 类的预期输出如下

复制
已复制!
            

/path/to/fall/video_1 [fall] /path/to/fall/video_2 [fall] ...

使用以下命令将 ActionRecognitionNet 导出为 .etlt 格式以进行部署

复制
已复制!
            

tao model action_recognition export -e <experiment_spec> export.checkpoint=<tlt checkpoint to be exported> [export.gpu_id=<gpu index>] [export.onnx_file=<path to exported file>]

必需参数

  • -e, --experiment_spec: 用于设置导出的实验规范文件。这可以与训练规范相同。

  • export.checkpoint: 要导出的 .pth 模型。

可选参数

  • export.gpu_id: 用于运行导出的 GPU 索引。当机器安装了多个 GPU 时,我们可以指定用于运行导出的 GPU 索引。请注意,导出只能在单个 GPU 上运行

  • export.onnx_file: 用于保存导出模型的路径。默认路径与 \*.pth 模型在同一目录中。

您训练的深度学习和计算机视觉模型可以部署在边缘设备(例如 Jetson Xavier、Jetson Nano 或 Tesla)上,或者在具有 NVIDIA GPU 的云中。导出的 \*.etlt 模型可以在独立的 TensorRT 推理示例或 DeepStream 中使用。

DeepStream SDK 是一种流分析工具包,用于加速构建基于 AI 的视频分析应用程序。TAO 与 DeepStream SDK 集成,因此使用 TAO 训练的模型可以直接与 DeepStream 协同工作。

在 DeepStream 示例中部署 ActionRecognitionNet

获得 .etlt ActionRecognitionNet 模型后,您可以将其部署到 DeepStream 3d-action-recognition 示例应用程序中。有关在 DeepStream 中运行动作识别的详细步骤,请参阅示例应用程序文档

在独立示例上运行 ActionRecognitionNet 推理

还提供了一个独立的 TensorRT 推理示例。它使用 TensorRT 引擎,并支持在图像上使用 2D/3D 输入运行。该示例可以在 Github 上找到。

要使用此示例,您需要使用 trtexec\*.etlt 模型生成 TensorRT 引擎。

使用 trtexec

有关使用 trtexec 命令生成 TensorRT 引擎的说明,请参阅 ActionRecognitionNet 的 trtexec 指南

推理示例的用法

获得 TensorRT 引擎后,您可以在独立示例中部署该引擎。使用以下命令运行推理

复制
已复制!
            

python ar_trt_inference.py --input_images_folder <path to input images folder> \ --trt_engine <path to tensorrt engine> \ [--center_crop] \ [--input_2d]

必需参数
  • --input_images_folder: 输入图像文件夹的路径。它应为 video_<n> 级别的目录,如准备数据集部分所述。

  • --trt_engine: TensorRT 引擎的路径。

可选参数
  • --center_crop: 将输入图像调整大小,使短边为 256,并中心裁剪为 224x224 区域。如果未设置此标志,则输入图像将直接调整大小为 224x224。

  • --input_2d: 如果引擎是从 2D 模型生成的,请设置此标志。

注意

该脚本通过 32 帧滑动窗口(步幅为 1)对文件夹中的图像进行推理,这意味着推理是在以下序列上完成的

复制
已复制!
            

[frame_0, frame_1, frame_2, ..., frame_31] [frame_1, frame_2, frame_3, ..., frame_32] ....

上一篇 ReIdentificationNet
下一篇 BEVFusion
© 版权所有 2024, NVIDIA。 上次更新于 2024 年 10 月 15 日。