1

我正在关注这个 标签检测教程

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

我们的响应将包含 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 area, traffic, vehicle.. 都相同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 返回所有标签的这些偏移量,而不是该特定标签(实体)出现的片段的开始和结束时间偏移量?(我觉得它与 视频级注释有关,但我不是当然)

  • 如何获得它们实际出现的段的开始和结束时间偏移?
4

1 回答 1

2

我看到您所遵循的教程部分使用了最简单的示例,而示例列表提供了一个更完整的示例,其中使用了 Video Intelligence API 的更多功能。

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

  • 选项1

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

如果您通过 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

我为您的用例建议的第二个选项是使用不同的标签检测模式。此文档链接中提供了可用标签检测模式的列表。默认情况下,SHOT_MODE使用 ,它只会提供视频级别和镜头级别的注释,这要求您按照选项 1中的说明处理片段。相反,如果您使用FRAME_MODE,将处理帧级注释。这是一个成本高昂的选项,因为它会分析视频中的所有帧并为每个帧添加注释,但根据您的具体用例,它可能是一个合适的选项。SHOT_AND_FRAME_MODE我在回答开头提到的更完整的示例中使用了这种模式(实际上是一种,它是前两种的组合)。这analyze_labels()该代码中的函数提供了一个关于如何执行视频/镜头/帧级注释的非常完整的示例,特别是对于帧级注释,有一个关于如何在注释发生时获取有关帧的信息的说明。

请注意,正如我之前解释的那样,这个选项确实很昂贵,例如,我已经为教程中作为示例提供的“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;博士:

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

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

于 2018-04-13T11:29:03.893 回答