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

动作识别网络架构
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
数据集的根目录包含多个子目录,用于不同的类别。每个类别目录都有子文件夹,用于不同的视频,并且每个子文件夹都包含 rgb、u 和 v 文件夹,分别用于存放 RGB 帧、光流 x 轴灰度图像和光流 y 轴灰度图像。如果您想训练仅 RGB 模型,u 和 v 文件夹可以为空。我们提供了一个脚本来仅生成 RGB 帧。
常见的数据处理流程可以使用以下图表描述

仅 RGB 数据处理流程

仅 OF 数据处理流程
ActionRecognitionNet 的规范文件包括 model
、train
和 dataset
参数。以下是训练 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 | 模型的输入类型。可以是 2d 或 3d。 | 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 |
|
string |
MultiStep |
学习率调度器。提供了两个调度器 |
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
参数 | 数据类型 | 默认值 | 描述 | 支持的值 |
|
string |
random_crop |
训练时的裁剪类型 |
random_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 | 指定是否在验证中中心裁剪图像。 | |
|
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
: 用于设置训练实验的实验规范文件
可选参数
您可以设置可选参数来覆盖实验规范文件中的选项值。
-h, --help
: 显示此帮助消息并退出。model.<model_option>
: 模型选项。dataset.<dataset_option>
: 数据集选项。train.<train_option>
: 训练选项。train.optim.<optim_option>
: 优化器选项
对于训练、评估和推理,我们为每个相应的任务公开 2 个变量:num_gpus
和 gpu_ids
,它们分别默认为 1
和 [0]
。如果两者都已传递,但不一致,例如 num_gpus = 1
,gpu_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 的评估指标是识别准确率。为视频评估提供了两种视频采样策略模式:center
和 conv
。
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]
....