Video Intelligence API - время сегмента метки
Я слежу за этим УЧЕБНЫМ ОБУЧЕНИЕМ.
Код ниже делает следующее (после получения ответа)
Наш ответ будет содержать результат в AnnotateVideoResponse, который состоит из списка annotationResults, по одному для каждого видео, отправленного в запросе. Поскольку мы отправили только одно видео в запросе, мы берем первый сегмент LabelAnnotations результатов. Затем мы перебираем все метки в сегменте LabelAnnotations. В этом руководстве мы показываем только аннотации на уровне видео. Чтобы идентифицировать аннотации на уровне видео, мы извлекаем данные сегмента сегмента из результатов. Каждая аннотация метки сегмента включает в себя описание (plot_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')
Таким образом, в нем говорится: "Каждая аннотация метки сегмента включает в себя описание (plot_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 возвращает эти смещения для всех меток, а не смещения времени начала и конца сегмента, где появляется эта конкретная метка (сущность)?(Я чувствую, что это как-то связано саннотацией на уровне видео, но я не конечно)
- Как я могу получить начальные и конечные смещения времени сегмента, где они действительно появляются?
1 ответ
Я вижу, что в части учебника, которую вы читаете, используются самые простые доступные примеры, а в списке примеров представлен более полный пример, в котором используются дополнительные функции API-интерфейса Video Intelligence.
Чтобы достичь желаемой цели (иметь более подробную информацию о моментах времени, когда идентифицируется каждая аннотация), есть две возможности, которые вы можете изучить:
- Опция 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; DR:
Ожидаются результаты, возвращаемые типом вызова, который вы делаете, следуя простому примеру из учебника. Если нет конкретной конфигурации, видео будет рассматриваться как один сегмент, причина, по которой полученный ответ идентифицирует аннотации во всем видео.
Если вы хотите получить более подробную информацию о том, когда идентифицируются элементы, вам нужно будет использовать один из двух следующих подходов: (1) определить сегменты в вашем видео (для этого необходимо вручную указать сегменты, на которые вы хотите разделить видео) или (2) использовать FRAME_MODE
(что намного дороже и точнее).