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



我正在遵循这个标签检测教程

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

我们的回复将包含注释视频回复中的结果, 它由注释结果列表组成,每个发送的视频一个 在请求中。由于我们在请求中仅发送了一个视频,因此我们采用 第一个段标签结果的注释。然后我们循环通过 段标签批注中的所有标签。为此 教程,我们只显示视频级注释。要识别 视频级注释,我们从中提取segment_label_annotations数据 结果。每个段标签注释都包含说明 (segment_label.description),实体类别列表 (category_entity.描述)以及它们在分段中出现的位置 开始和结束时间与视频开头的偏移。

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

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

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

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

  • 选项 1

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

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

{
"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(成本更高且更精确)。

最新更新