准备视频数据

本页面介绍了如何准备视频数据以在 Vertex AI 数据集中使用。视频输入数据的格式取决于目标。目前支持的视频目标如下:

  • 动作识别
  • 分类
  • 对象跟踪

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

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

数据要求

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

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

    • .MOV
    • .MPEG4
    • .MP4
    • .AVI

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

  • 每个数据集中的最大标签数目前限制为 1000。

  • 您可以向导入文件中的视频分配“ML_USE”标签。在训练时,您可以选择使用这些标签将视频及其对应的注释拆分为“训练”集或“测试”集。

    动作识别

    • 限制:使用 VAR 标签控制台存在一项限制,也就是说,如果您要使用标签工具进行添加标签操作,则必须为该视频中的所有操作添加标签。

    分类

    • 模型训练需要至少两个不同的类别。例如,“新闻”和“MTV”,或“游戏”和“其他”。
    • 考虑添加一个“None_of_the_above”类别和与您定义的任何类别都不匹配的视频片段。

    对象跟踪

    • 每个数据集中已加标签的视频帧数的上限为 15 万。
    • 每个数据集中已添加注释的边界框总数上限目前为 100 万。
    • 每个注释集中的最大标签数目前限制为 1000。

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

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

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

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

  • 如果最常见标签下的视频数量不超过最罕见标签下文档数量的 100 倍,则模型效果最佳。建议移除出现频率极低的标签。

    动作识别

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

    分类

    建议每个标签下提供大约 1000 个训练视频。每个标签至少应有 10 个训练视频;对于高级模型,至少应有 50 个训练视频。一般来说,每个标签下需要有更多示例,才能训练可为每个视频添加多个标签的模型,这种情况下得分也更难以解读。

    对象跟踪

    • 边界框大小下限:10×10 像素。
    • 对于远远大于 1024×1024 像素的视频帧分辨率,在 AutoML 对象跟踪的帧归一化过程中,图片质量可能会在一定程度上受损。
    • 每个唯一标签必须存在于至少 3 个不同的视频帧中。且必须具有至少 10 个注释。

架构文件

  • 创建用于导入注释的 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 ofthe 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`, `test`,
          and `validation`.
        type: object
        additionalProperties:
          type: string

    分类

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

    
    title: VideoClassification
    description: >
      Import and export format for importing/exporting videos together with
      classification 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`.
      timeSegmentAnnotations:
        type: array
        description: >
          Multiple classification 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 corresponds to 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.
        type: object
        additionalProperties:
          type: string
    

    对象跟踪

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

    
    title: VideoObjectTracking
    version: 1.0.0
    description: >
      Import and export format for importing/exporting videos together with
      temporal bounding box annotations.
    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`.
      TemporalBoundingBoxAnnotations:
        type: array
        description: Multiple temporal bounding box annotations. Each on a frame of the video.
        items:
          type: object
          description: >
            Temporal bounding box anntoation on video. `xMin`, `xMax`, `yMin`, and
            `yMax` are relative to the video frame size, and the point 0,0 is in the
            top left of the frame.
          properties:
            displayName:
              type: string
              description: >
                It will be imported as/exported from AnnotationSpec's display name,
                i.e., the name of the label/class.
            xMin:
              description: The leftmost coordinate of the bounding box.
              type: number
              format: double
            xMax:
              description: The rightmost coordinate of the bounding box.
              type: number
              format: double
            yMin:
              description: The topmost coordinate of the bounding box.
              type: number
              format: double
            yMax:
              description: The bottommost coordinate of the bounding box.
              type: number
              format: double
            timeOffset:
              type: string
              description: >
                A time offset of a video in which the object has been detected.
                Expressed as a number of seconds as measured from the
                start of the video, with fractions up to a microsecond precision, and
                with "s" appended at the end.
            instanceId:
              type: number
              format: integer
              description: >
                The instance of the object, expressed as a positive integer. Used to
                tell apart objects of the same type when multiple are present on a
                single video.
            annotationResourceLabels:
              description: Resource labels on the Annotation.
              type: object
              additionalProperties:
                type: string
      dataItemResourceLabels:
        description: Resource labels on the DataItem.
        type: object
        additionalProperties:
          type: string

输入文件

训练数据的格式取决于您的目标。视频有 3 个可能的目标:

  • 动作识别
  • 分类
  • 对象跟踪

动作识别

创建 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://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

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


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

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

分类

创建 JSONL 或 CSV 文件以导入数据。

JSONL

每行的 JSON 表示法:
如需了解详情,请参阅分类架构(全局)文件。


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

示例 JSONL - 视频分类:


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

CSV

CSV 中一行的格式:

[ML_USE,]VIDEO_URI,LABEL,START,END

列的列表

  1. ML_USE(可选)。在训练模型时用于拆分数据。使用 TRAINING 或 TEST。
  2. VIDEO_URI。此字段包含视频的 Cloud Storage URI。Cloud Storage URI 区分大小写。
  3. LABEL。标签必须以字母开头,且只能包含字母、数字和下划线。您可以在 CSV 文件中添加多行,每行都标示同一视频片段但采用不同的标签,以此为视频指定多个标签。
  4. START,END。START 和 END 这两列分别标识要分析的视频片段的开始时间和结束时间(以秒为单位)。开始时间必须早于结束时间。这两个值必须为非负数,并且必须在视频的时间范围内。例如,0.09845,1.36005。要使用视频的全部内容,请将开始时间指定为 0,并将结束时间指定为视频全长或“inf”。例如 0,inf

示例 CSV - 使用单个标签进行分类

同一视频片段的单个标签:

  TRAINING,gs://YOUR_VIDEO_PATH/vehicle.mp4,mustang,0,5.4
  ...
  

示例 CSV - 多个标签:

同一视频片段的多个标签:

  gs://YOUR_VIDEO_PATH/vehicle.mp4,fiesta,0,8.285
  gs://YOUR_VIDEO_PATH/vehicle.mp4,ranger,0,8.285
  gs://YOUR_VIDEO_PATH/vehicle.mp4,explorer,0,8.285
  ...
  

示例 CSV - 无标签:

您也可以在数据文件中提供视频,但不指定任何标签。然后,在训练模型之前,您必须使用 Google Cloud Console 将标签应用于数据。为此,您只需提供视频的 Cloud Storage URI,后跟三个英文逗号,如以下示例所示。

  gs://YOUR_VIDEO_PATH/vehicle.mp4
  ...
  

对象跟踪

创建 JSONL 或 CSV 文件以导入数据。

JSONL

每行的 JSON 表示法:
如需了解详情,请参阅对象跟踪 yaml 文件。


{
	"videoGcsUri": "gs://bucket/filename.ext",
	"TemporalBoundingBoxAnnotations": [{
		"displayName": "LABEL",
		"xMin": "leftmost_coordinate_of_the_bounding box",
		"xMax": "rightmost_coordinate_of_the_bounding box",
		"yMin": "topmost_coordinate_of_the_bounding box",
		"yMax": "bottommost_coordinate_of_the_bounding box",
		"timeOffset": "timeframe_object-detected"
                "instanceId": "instance_of_object
                "annotationResourceLabels": "resource_labels"
	}],
	"dataItemResourceLabels": {
		"aiplatform.googleapis.com/ml_use": "train|test"
	}
}

示例 JSONL - 视频对象跟踪:


{'videoGcsUri': 'gs://demo-data/video1.mp4', 'temporal_bounding_box_annotations': [{'displayName': 'horse', 'instance_id': '-1', 'time_offset': '4.000000s', 'xMin': '0.668912', 'yMin': '0.560642', 'xMax': '1.000000', 'yMax': '1.000000'}], "dataItemResourceLabels": {"aiplatform.googleapis.com/ml_use": "training"}}
{'videoGcsUri': 'gs://demo-data/video2.mp4', 'temporal_bounding_box_annotations': [{'displayName': 'horse', 'instance_id': '-1', 'time_offset': '71.000000s', 'xMin': '0.679056', 'yMin': '0.070957', 'xMax': '0.801716', 'yMax': '0.290358'}], "dataItemResourceLabels": {"aiplatform.googleapis.com/ml_use": "test"}}
...

CSV

CSV 文件中一行的格式:

[ML_USE,]VIDEO_URI,LABEL,[INSTANCE_ID],TIME_OFFSET,BOUNDING_BOX

列的列表

  • ML_USE(可选)。在训练模型时用于拆分数据。使用 TRAINING 或 TEST。
  • VIDEO_URI。此字段包含视频的 Cloud Storage URI。Cloud Storage URI 区分大小写。
  • LABEL。标签必须以字母开头,且只能包含字母、数字和下划线。您可以在 CSV 文件中添加多行,每行都标示同一视频片段但采用不同的标签,以此为视频指定多个标签。
  • INSTANCE_ID(可选)。用于标识视频中跨视频帧的对象实例的实例 ID。如果提供此 ID,AutoML 对象跟踪会将其用于对象跟踪调整、训练和评估。不同视频帧中出现的同一对象实例的边界框会标记为同一实例 ID。实例 ID 仅在每个视频中具有唯一性,但在数据集中并不唯一。例如,如果来自两个不同视频的两个对象具有同一实例 ID,这并不意味着它们是同一对象实例。
  • TIME_OFFSET。指示相对于视频开始时的时长偏移量的视频帧。时间偏移是浮点数,单位为秒。
  • BOUNDING_BOX。视频帧中对象的边界框。指定边界框涉及多个列。
    边界框
    A. x_relative_min,y_relative_min
    B. x_relative_max,y_relative_min
    C. x_relative_max,y_relative_max
    D. x_relative_min,y_relative_max

    每个顶点由 x、y 坐标值指定。 坐标值必须是 0 到 1 范围内的浮点数,其中 0 表示最小 x 或 y 值,1 表示最大 x 或 y 值。
    例如,(0,0) 表示左上角,(1,1) 表示右下角;整个图片的边界框表示为 (0,0,,,1,1,,) 或 (0,0,1,0,1,1,0,1)。
    AutoML 对象跟踪不需要进行特定的顶点排序。此外,如果 4 个指定顶点未形成与图片边缘平行的矩形,Vertex AI 会指定可形成此类矩形的顶点。
    可以通过以下两种方式之一指定对象的边界框:
    1. 指定两个顶点,顶点由一组 x,y 坐标组成(如果它们是矩形的对角点):
      A. x_relative_min,y_relative_min
      D. x_relative_min,y_relative_max
      如以下示例所示:
      x_relative_min, y_relative_min,,,x_relative_max,y_relative_max,,
    2. 指定全部四个顶点,如下所示:
      x_relative_min,y_relative_min, x_relative_max,y_relative_min, x_relative_max,y_relative_max, x_relative_min,y_relative_max,
      如果指定的四个顶点未形成与图片边缘平行的矩形,Vertex AI 会指定可形成此类矩形的顶点。

数据集文件中的行的示例

以下行演示了如何在数据集中指定数据。该示例包括 Cloud Storage 上的视频路径、对象的标签、开始跟踪的时间偏移值以及两个对角顶点。VIDEO_URI.,LABEL,INSTANCE_ID,TIME_OFFSET,x_relative_min,y_relative_min,x_relative_max,y_relative_min,x_relative_max,y_relative_max,x_relative_min,y_relative_max

gs://folder/video1.avi,car,,12.90,0.8,0.2,,,0.9,0.3,,
gs://folder/video1.avi,bike,,12.50,0.45,0.45,,,0.55,0.55,,
其中,

  • VIDEO_URIgs://folder/video1.avi
  • LABELcar
  • INSTANCE_ID,(未指定)
  • TIME_OFFSET12.90
  • x_relative_min,y_relative_min0.8,0.2
  • x_relative_max,y_relative_min 未指定,
  • x_relative_max,y_relative_max0.9,0.3
  • x_relative_min,y_relative_max 未指定

如前所述,您还可以通过提供所有四个顶点来指定边界框,如以下示例所示。

gs://folder/video1.avi,car,,12.10,0.8,0.8,0.9,0.8,0.9,0.9,0.8,0.9 gs://folder/video1.avi,car,,12.90,0.4,0.8,0.5,0.8,0.5,0.9,0.4,0.9 gs://folder/video1.avi,car,,12.10,0.4,0.2,0.5,0.2,0.5,0.3,0.4,0.3

示例 CSV - 无标签:

您也可以在数据文件中提供视频,但不指定任何标签。然后,在训练模型之前,您必须使用 Google Cloud Console 将标签应用于数据。为此,您只需提供视频的 Cloud Storage URI,后跟 11 个英文逗号,如以下示例所示。

未分配 ml_use 的示例:

  gs://folder/video1.avi
  ...
  

分配了 ml_use 的示例:

  TRAINING,gs://folder/video1.avi
  TEST,gs://folder/video2.avi
  ...
  

后续步骤