视频智能API - 标签细分时间

时间:2018-04-12 21:53:50

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

我正在关注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会为所有标签返回这些偏移而不是 该特定标签所在段的开始和结束时间偏移量 (实体)出现了?(我觉得它与它有关 视频级注释,但我不确定)

  • 如何获得段的开始和结束时间偏移 他们真的出现了?

1 个答案:

答案 0 :(得分:1)

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

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

  • 选项1

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

如果您通过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 中的说明使用细分STRONG>。相反,如果您使用FRAME_MODE,则会处理帧级注释。这是一个昂贵的选择,因为它分析视频中的所有帧并注释每个帧,但它可能是一个合适的选项,具体取决于您的具体用例。这个模式(实际上,SHOT_AND_FRAME_MODE一个,这是前两个的组合)用于我在答案开头提到的更完整的例子。 analyze_labels() function in that code提供了关于如何执行视频/镜头/帧级注释的真实完整示例,特别是frame-level annotation,有关如何获取有关帧的信息的说明。< / p>

请注意,这个选项非常昂贵,正如我之前解释的那样,例如,我已经为&#34; chicago.mp4&#34;视频在教程中作为示例提供,大约需要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(这种做法更加昂贵和精确)。