【问题标题】:Video Intelligence API - Label Segment timeVideo Intelligence API - 标签分段时间
【发布时间】:2018-09-23 04:34:27
【问题描述】:

我正在关注this标签检测教程

下面的代码执行以下操作(在得到响应后)

我们的响应将在 AnnotateVideoResponse 中包含结果, 其中包含一个 annotationResults 列表,每个发送的视频一个 在请求中。因为我们在请求中只发送了一个视频,所以我们采取 第一个segmentLabelAnnotations的结果。然后我们循环遍历 segmentLabelAnnotations 中的所有标签。为此目的 教程中,我们只显示视频级别的注释。识别 视频级别的注释,我们从中提取 segment_label_annotations 数据 结果。每个段标签注释都包含一个描述 (segment_label.description),实体类别列表 (category_entity.description) 以及它们分段出现的位置 开始和结束时间与视频开头的偏移量。

segment_labels = result.annotation_results[0].segment_label_annotations
for i, segment_label in enumerate(segment_labels):
    print('Video label description: {}'.format(
        segment_label.entity.description))
    for category_entity in segment_label.category_entities:
        print('\tLabel category description: {}'.format(
            category_entity.description))

    for i, segment in enumerate(segment_label.segments):
        start_time = (segment.segment.start_time_offset.seconds +
                      segment.segment.start_time_offset.nanos / 1e9)
        end_time = (segment.segment.end_time_offset.seconds +
                    segment.segment.end_time_offset.nanos / 1e9)
        positions = '{}s to {}s'.format(start_time, end_time)
        confidence = segment.confidence
        print('\tSegment {}: {}'.format(i, positions))
        print('\tConfidence: {}'.format(confidence))
    print('\n')

因此,它说“每个段标签注释包括一个描述 (segment_label.description)、一个实体类别列表 (category_entity.description) 和 它们在段中按开始和结束时间偏移视频的开头。”

但是,在输出中,所有标签urban areatrafficvehicle.. 都有相同的start and end time offsets,它们基本上是视频的开始和结束。

$ python label_det.py gs://cloud-ml-sandbox/video/chicago.mp4
Operation us-west1.4757250774497581229 started: 2017-01-30T01:46:30.158989Z
Operation processing ...
The video has been successfully processed.

Video label description: urban area
        Label category description: city
        Segment 0: 0.0s to 38.752016s  
        Confidence: 0.946980476379

Video label description: traffic
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.94105899334

Video label description: vehicle
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.919958174229
...
  • 为什么会这样?

  • 为什么 API 返回所有标签的这些偏移量,而不是 该特定标签所在的段的开始和结束时间偏移 (实体)出现?(我觉得它与 视频级注释,但我不确定)

  • 如何获取段的开始和结束时间偏移,其中 它们真的出现了吗?

【问题讨论】:

    标签: python google-cloud-platform video-intelligence-api


    【解决方案1】:

    我看到您所遵循的教程部分使用了simplest examples available,而示例列表提供了more complete example,其中使用了视频智能 API 的更多功能。

    为了实现您想要的目标(获得有关识别每个注释的时刻的更详细信息),您可以探索两种可能性:

    • 选项 1

    这里的关键点是视频级注释仅适用于segments。如我链接的本文档页面中所述,如果未指定视频中的片段,API 会将视频视为单个片段。因此,如果您希望 API 返回关于何时识别每个注释的更“具体”结果,您应该自己将视频拆分为多个片段,将其拆分为不同的片段(可能重叠并且可能不需要完整的视频),并且将这些参数作为annotate requestvideoContext 字段的一部分传递。

    如果您通过 API 请求执行这些操作,则可以执行如下请求,通过指定开始和结束 TimeOffsets 来定义任意数量的段:

    {
     "inputUri": "gs://cloud-ml-sandbox/video/chicago.mp4",
     "features": [
      "LABEL_DETECTION"
     ],
     "videoContext": {
      "segments": [
       {
        "startTimeOffset": "TO_DO",
        "endTimeOffset": "TO_DO"
       }
       {
        "startTimeOffset": "TO_DO",
        "endTimeOffset": "TO_DO"
       }
      ]
     }
    }
    

    如果您愿意使用 Python 客户端库,则可以改用 video_context 参数,如下面的代码所示:

    video_client = videointelligence.VideoIntelligenceServiceClient()
    features = [videointelligence.enums.Feature.LABEL_DETECTION]
    
    mode = videointelligence.enums.LabelDetectionMode.SHOT_AND_FRAME_MODE
    config = videointelligence.types.LabelDetectionConfig(label_detection_mode=mode)
    context = videointelligence.types.VideoContext(label_detection_config=config)
    
    operation = video_client.annotate_video("gs://cloud-ml-sandbox/video/chicago.mp4", features=features, video_context=context)
    
    • 选项 2

    我为您的用例建议的第二个选项是使用不同的标签检测模式。 this documentation link 中提供了可用标签检测模式的列表。默认情况下,使用SHOT_MODE,它只会提供视频级别和镜头级别的注释,这需要您按照选项 1 中的说明处理片段.相反,如果您使用FRAME_MODE,则会处理帧级注释。这是一个成本高昂的选项,因为它会分析视频中的所有帧并注释每个帧,但根据您的特定用例,它可能是一个合适的选项。这种模式(嗯,实际上是SHOT_AND_FRAME_MODE 一种,它是前两种的组合)用于我在答案开头提到的更完整的示例中。 analyze_labels() function in that code 提供了一个关于如何执行视频/镜头/帧级别注释的非常完整的示例,特别是对于 frame-level annotation,有一个关于如何在发生注释时获取有关帧的信息的说明。

    请注意,正如我之前解释的那样,此选项非常昂贵,例如,我已经为教程中作为示例提供的“chicago.mp4”视频运行了它,大约需要 30 分钟才能完成。但是,实现的详细程度非常高(再次分析每一帧,然后按元素对注释进行分组),这是您可以期望获得的响应:

    "frameLabelAnnotations": [
         {
          "entity": {
           "entityId": "/m/088l6h",
           "description": "family car",
           "languageCode": "en-US"
          },
          "categoryEntities": [
           {
            "entityId": "/m/0k4j",
            "description": "car",
            "languageCode": "en-US"
           }
          ],
          "frames": [
           {
            "timeOffset": "0.570808s",
            "confidence": 0.76606256
           },
           {
            "timeOffset": "1.381775s",
            "confidence": 0.74966145
           },
           {
            "timeOffset": "2.468091s",
            "confidence": 0.85502887
           },
           {
            "timeOffset": "3.426006s",
            "confidence": 0.78749716
           },
          ]
         },
    

    TL;DR:

    按照教程中的简单示例进行的调用类型返回的结果是预期的。如果没有特定配置,则视频将被视为单个片段,这就是您收到的响应标识整个视频中的注释的原因。

    如果您想了解有关何时识别元素的更多详细信息,您需要遵循以下两种方法之一:(1) 在视频中定义片段(这需要您手动指定要在其中分割视频的片段),或(2)使用FRAME_MODE(成本更高且更精确)。

    【讨论】:

    • 谢谢你的帮助,抱歉耽搁了:)
    • 没问题!我很高兴能帮上忙 :)
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多