首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视频智能API -标签段时间

视频智能API -标签段时间
EN

Stack Overflow用户
提问于 2018-04-12 21:53:49
回答 1查看 669关注 0票数 1

我正在遵循 标签检测教程

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

我们的响应将在AnnotateVideoResponse中包含结果,该结果由一个annotationResults列表组成,每个视频在请求中发送一个。因为我们在请求中只发送了一个视频,所以我们获得了结果的第一个segmentLabelAnnotations。然后我们循环遍历segmentLabelAnnotations中的所有标签。为了本教程的目的,我们只显示视频级注解.为了识别视频级注释,我们从结果中提取segment_label_annotations数据.每个片段标签注释包括描述(segment_label.description)、实体类别(category_entity.description)的列表,以及它们从视频开始到结束时偏移在段中的位置。

代码语言:javascript
复制
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,这基本上是视频的开始和结束。

代码语言:javascript
复制
$ 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会返回所有标签的这些偏移量,而不是某个特定标签(实体)出现的片段的开始和结束时间偏移?(我觉得这与视频级注释有关,但我不确定)
  • 如何才能得到实际出现的段的开始和结束时间偏移?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-13 11:29:03

我看到教程中您所关注的部分使用了最简单的例子,而示例列表提供了一个使用视频智能API更多特性的更完整的例子

为了实现您想要的目标(了解确定每个注释时的时间瞬间的更详细信息),您可以探索两种可能性:

  • 选项1

这里的关键是视频级注释只在细分市场上工作。正如我链接的这个文档页面中所解释的,如果没有指定视频中的片段,API将把视频作为一个单独的片段来处理。因此,如果您希望API返回关于每个注释何时标识的更“特定”的结果,您应该自己将视频分割成不同的片段(可以重叠,可能不需要完整的视频),并将这些参数作为videoContext字段的一部分在注释请求中传递。

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

代码语言:javascript
复制
{
 "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参数,如下所示:

代码语言:javascript
复制
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 1,它是前面两种模式的组合)在我回答的开头提到的更完整的例子中使用。函数在该代码中。提供了一个关于如何执行视频/镜头/帧级注释的真正完整的示例,特别是对于帧级注释,有一个关于在注释发生时如何获取有关帧的信息的解释。

请注意,正如我前面解释的那样,这个选项非常昂贵,例如,我已经为教程中提供的"chicago.mp4“视频运行了它,它花了大约30分钟才完成。但是,所实现的细节级别非常高(同样,分析每个帧,然后按元素对注释进行分组),这是您可以期望得到的响应类型:

代码语言:javascript
复制
"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) use FRAME_MODE (这是成本更高、更精确的方法)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49806443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档