我正在关注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 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会为所有标签返回这些偏移而不是 该特定标签所在段的开始和结束时间偏移量 (实体)出现了?(我觉得它与它有关 视频级注释,但我不确定)
答案 0 :(得分:1)
我看到您所关注的教程部分使用了simplest examples available,而示例列表提供了more complete example,其中使用了更多视频智能API功能。
为了达到您想要的目标(有关识别每个注释的时刻的更详细信息),您可以探索两种可能性:
这里的关键点是视频级注释仅适用于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)
我为您的用例提出的第二个选项是使用不同的标签检测模式。 this documentation link中提供了可用的标签检测模式列表。默认情况下,使用 请注意,这个选项非常昂贵,正如我之前解释的那样,例如,我已经为&#34; chicago.mp4&#34;视频在教程中作为示例提供,大约需要30分钟才能完成。但是,实现的细节水平非常高(再次分析每个框架,然后按元素分组注释),这是您可以获得的响应类型: <强> TL; DR: 强> 您希望按照本教程中的简单示例进行调用返回的结果。如果没有特定配置,视频将被视为单个片段,这是您获得的响应识别整个视频中的注释的原因。 如果您想获得有关何时识别元素的更多详细信息,则需要遵循以下两种方法之一:(1)在视频中定义细分(需要您手动操作)指定要分割视频的细分受众群,或(2)使用SHOT_MODE
,它只会提供视频级和镜头级注释,这需要您按照 选项1 中的说明使用细分STRONG>。相反,如果您使用FRAME_MODE
,则会处理帧级注释。这是一个昂贵的选择,因为它分析视频中的所有帧并注释每个帧,但它可能是一个合适的选项,具体取决于您的具体用例。这个模式(实际上,SHOT_AND_FRAME_MODE
一个,这是前两个的组合)用于我在答案开头提到的更完整的例子。 analyze_labels()
function in that code提供了关于如何执行视频/镜头/帧级注释的真实完整示例,特别是frame-level annotation,有关如何获取有关帧的信息的说明。< / p>
"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
},
]
},
FRAME_MODE
(这种做法更加昂贵和精确)。