准备视频训练数据以进行动作识别

本页面介绍了如何准备视频训练数据,以便在 Vertex AI 数据集中使用,从而训练视频动作识别模型。

以下各部分介绍数据要求、架构文件以及架构定义的数据导入文件(JSONL 和 CSV)的格式。

或者,您也可以导入尚未添加注解的视频,并在之后使用 Google Cloud 控制台添加注解(请参阅使用 Google Cloud 控制台添加标签)。

数据要求

以下要求适用于用于训练 AutoML 或自定义训练的模型的数据集。

  • Vertex AI 支持以下视频格式来训练模型或请求执行预测(为视频添加注释)。

    • .MOV
    • .MPEG4
    • .MP4
    • .AVI
  • 要在网络控制台中查看视频内容或为视频添加注解,视频必须采用浏览器原生支持的格式。由于并非所有浏览器都以原生方式处理 .MOV 或 .AVI 内容,因此建议使用 .MPEG4 或 .MP4 视频格式。

  • 文件大小的上限为 50 GB(时长不超过 3 小时)。不支持容器中格式错误或时间戳为空的单个视频文件。

  • 每个数据集中的最大标签数限制为 1,000。

  • 您可以向导入文件中的视频分配“ML_USE”标签。在训练时,您可以选择使用这些标签将视频及其对应的注释拆分为“训练”集或“测试”集。 对于动作识别,使用 VAR 标签控制台存在一项限制,也就是说,如果您要使用标签工具进行添加标签操作,则必须为该视频中的所有操作添加标签。

用于训练 AutoML 模型的视频数据的最佳做法

以下做法适用于用于训练 AutoML 模型的数据集。

  • 训练数据应尽可能接近要对其执行预测的数据。例如,如果您的用例涉及模糊的低分辨率视频(例如,来自监控摄像头的视频),那么您的训练数据应由模糊的低分辨率视频组成。一般来说,您还应该考虑为训练视频提供多种角度、分辨率和背景。

  • Vertex AI 模型通常不能预测人类无法分配的标签。如果一个人经过训练,仍无法在观看视频 1-2 秒后分配标签,那么模型可能也无法通过训练达到此目的。

  • 如果最常见标签下的视频数量不超过最罕见标签下文档数量的 100 倍,则模型效果最佳。建议移除出现频率较低的标签。 对于操作识别,请注意以下事项:

    • 建议每个标签包含 100 个或更多训练视频帧。
    • 对于远远大于 1024×1024 像素的视频帧分辨率,Vertex AI 使用帧归一化过程,图片质量可能会在一定程度上受损。

架构文件

  • 创建用于导入注释的 jsonl 文件时,请使用以下可公开访问的架构文件。此架构文件规定数据输入文件的格式。文件的结构遵循 OpenAPI 架构测试。

    操作识别架构文件

    gs://google-cloud-aiplatform/schema/dataset/ioformat/video_action_recognition_io_format_1.0.0.yaml

    完整架构文件

    
    title: VideoActionRecognition
    description: >
      Import and export format for importing/exporting videos together with
      action recognition annotations with time segment. Can be used in
      Dataset.import_schema_uri field.
    type: object
    required:
    - videoGcsUri
    properties:
      videoGcsUri:
        type: string
        description: >
          A Cloud Storage URI pointing to a video. Up to 50 GB in size and
          up to 3 hours in duration. Supported file mime types: `video/mp4`,
          `video/avi`, `video/quicktime`.
      timeSegments:
        type: array
        description: Multiple fully-labeled segments.
        items:
          type: object
          description: A time period inside the video.
          properties:
            startTime:
              type: string
              description: >
                The start of the time segment. Expressed as a number of seconds as
                measured from the start of the video, with "s" appended at the end.
                Fractions are allowed, up to a microsecond precision.
              default: 0s
            endTime:
              type: string
              description: >
                The end of the time segment. Expressed as a number of seconds as
                measured from the start of the video, with "s" appended at the end.
                Fractions are allowed, up to a microsecond precision, and "Infinity"
                is allowed, which corresponds to the end of the video.
              default: Infinity
      timeSegmentAnnotations:
        type: array
        description: >
          Multiple action recognition annotations. Each on a time segment of the video.
        items:
          type: object
          description: Annotation with a time segment on media (e.g., video).
          properties:
            displayName:
              type: string
              description: >
                It will be imported as/exported from AnnotationSpec's display name.
            startTime:
              type: string
              description: >
                The start of the time segment. Expressed as a number of seconds as
                measured from the start of the video, with "s" appended at the end.
                Fractions are allowed, up to a microsecond precision.
              default: 0s
            endTime:
              type: string
              description: >
                The end of the time segment. Expressed as a number of seconds as
                measured from the start of the video, with "s" appended at the end.
                Fractions are allowed, up to a microsecond precision, and "Infinity"
                is allowed, which means the end of the video.
              default: Infinity
            annotationResourceLabels:
              description: Resource labels on the Annotation.
              type: object
              additionalProperties:
                type: string
      dataItemResourceLabels:
        description: Resource labels on the DataItem. Overrides values set in
          ImportDataConfig at import time. Can set a user-defined label
          or the predefined `aiplatform.googleapis.com/ml_use` label, which is
          used to determine the data split and can be set to `training` and `test`.
        type: object
        additionalProperties:
          type: string

输入文件

用于视频动作识别的训练数据格式如下。

如需导入数据,请创建 JSONL 或 CSV 文件。

JSONL

每行的 JSON 表示法:
如需了解详情,请参阅动作识别 YAML 文件。
注意:此处的时间段用于计算动作的时间戳。timeSegmentAnnotationsstartTimeendTime 可以相等,并且对应于动作的关键帧。


{
  "videoGcsUri': "gs://bucket/filename.ext",
  "timeSegments": [{
    "startTime": "start_time_of_fully_annotated_segment",
    "endTime": "end_time_of_segment"}],
  "timeSegmentAnnotations": [{
    "displayName": "LABEL",
    "startTime": "start_time_of_segment",
    "endTime": "end_time_of_segment"
  }],
  "dataItemResourceLabels": {
    "ml_use": "train|test"
  }
}

示例 JSONL - 视频动作识别:


{"videoGcsUri": "gs://demo/video1.mp4", "timeSegmentAnnotations": [{"displayName": "cartwheel", "startTime": "1.0s", "endTime": "12.0s"}], "dataItemResourceLabels": {"ml_use": "training"}}
{"videoGcsUri": "gs://demo/video2.mp4", "timeSegmentAnnotations": [{"displayName": "swing", "startTime": "4.0s", "endTime": "9.0s"}], "dataItemResourceLabels": {"ml_use": "test"}}
...

CSV

列的列表
  1. 验证数据。可选TRAININGTEST 规范。
  2. 要分类或添加注释的内容。此字段包含视频的 Cloud Storage URI。Cloud Storage URI 区分大小写。
  3. 标识视频分类方式的标签。标签必须以字母开头,且只能包含字母、数字和下划线。您可以在 CSV 文件中添加多行,每行都标示同一视频片段但采用不同的标签,以此为视频指定多个标签。
  4. 视频片段的开始时间和结束时间。这两个以逗号分隔的字段标识要分析的视频片段的开始时间和结束时间(以秒为单位)。开始时间必须早于结束时间。这两个值必须为非负数,并且必须在视频的时间范围内。例如 0.09845,1.3600555,其中,第一个值 (0.09845) 是要添加标签的视频片段的开始时间,第二个值 (1.3600555) 是结束时间。要使用视频的全部内容,请将开始时间指定为 0,并将结束时间指定为视频全长或“inf”。例如 0,inf
  5. 注释。注释是带有帧时间戳或时间段的标签。

每行必须是以下之一:

VIDEO_URI, TIME_SEGMENT_START, TIME_SEGMENT_END, LABEL, ANNOTATION_FRAME_TIMESTAMP
VIDEO_URI, , , LABEL, ANNOTATION_FRAME_TIMESTAMP
VIDEO_URI, TIME_SEGMENT_START, TIME_SEGMENT_END, LABEL, ANNOTATION_SEGMENT_START, ANNOTATION_SEGMENT_END
VIDEO_URI, , , LABEL, ANNOTATION_SEGMENT_START, ANNOTATION_SEGMENT_END

一些示例

为不同时间的两个动作添加标签:

gs://folder/video1.avi,kick,12.90,,
gs://folder/video1.avi,catch,19.65,,

两个时间范围内没有感兴趣的动作。注意:最后一行表示完全标记的片段不能包含动作。

gs://folder/video1.avi,,,10.0,20.0
gs://folder/video1.avi,,,25.0,40.0

您的训练数据必须至少包含一个标签和一个完全加标签的片段。


同样,您无需指定验证数据来验证经过训练的模型的结果。Vertex AI 会将标识为训练的行自动划分为训练和验证数据。80% 用于训练,20% 用于验证。

将相关内容作为 CSV 文件保存到 Google Cloud 存储分区中。