ベクトル化を使用してビデオ検索を行う (バージョン 4.0 プレビュー)

Azure AI ビデオ検索 API は Azure AI Vision の一部であり、開発者はインデックスを作成し、それにドキュメント (ビデオと画像) を追加し、自然言語で検索できます。 開発者は、各インデックスのメタデータ スキーマを定義し、検索に役立つメタデータをサービスに取り込むことができます。 開発者は、インデックスから抽出する機能 (ビジョン、音声) を指定し、特徴に基づいて検索をフィルター処理することもできます。

前提条件

入力の要件

サポートされている形式

ファイル形式 説明
asf ASF (Advanced/Active Streaming Format)
avi AVI (Audio Video Interleaved)
flv FLV (フラッシュ ビデオ)
matroskammwebm Matroska / WebM
movmp4m4a3gp3g2mj2 QuickTime / MOV

サポートされるビデオ コーデック

コーデック 形式
h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 パート 10
h265 H.265/HEVC
libvpx-vp9 libvpx VP9 (codec vp9)
mpeg4 MPEG-4 パート 2

サポートされているオーディオ コーデック

コーデック 形式
aac AAC (Advanced Audio Coding)
mp3 MP3 (MPEG オーディオ レイヤー 3)
pcm PCM (非圧縮)
vorbis Vorbis
wmav2 Windows Media Audio 2

ビデオ検索 API を呼び出す

一般的なパターンでビデオ検索 API を使用するには、次の手順を実行します。

  1. PUT - インデックスを作成するを使用して、インデックスを作成します。
  2. PUT - CreateIngestion を使用して、インデックスにビデオ ドキュメントを追加します。
  3. GET - ListIngestions を使用して確認し、インジェストが完了するまで待ちます。
  4. POST - SearchByText を使用して、キーワードまたは語句を検索します。

ビデオ検索 API を使用すると、ユーザーはビデオ ファイルにメタデータを追加できます。 メタデータは、"カメラ ID"、"タイムスタンプ"、特定のビデオの整理、フィルター処理、検索に使用できる "場所" などのビデオ ファイルに関連付けられている追加情報です。 この例では、インデックスを作成し、関連するメタデータを含むビデオ ファイルを追加し、さまざまな機能を使用して検索を実行する方法を示します。

手順 1: インデックスを作成する

まず、ビデオ ファイルとそのメタデータを格納および整理するためのインデックスを作成する必要があります。 次の例は、Create Index API を使用し、"my-video-index" という名前のインデックスを作成する方法を示しています。

curl.exe -v -X PUT "https://<YOUR_ENDPOINT_URL>/computervision/retrieval/indexes/my-video-index?api-version=2023-05-01-preview" -H "Ocp-Apim-Subscription-Key: <YOUR_SUBSCRIPTION_KEY>" -H "Content-Type: application/json" --data-ascii "
{
  'metadataSchema': {
    'fields': [
      {
        'name': 'cameraId',
        'searchable': false,
        'filterable': true,
        'type': 'string'
      },
      {
        'name': 'timestamp',
        'searchable': false,
        'filterable': true,
        'type': 'datetime'
      }
    ]
  },
  'features': [
    {
      'name': 'vision',
      'domain': 'surveillance'
    },
    {
      'name': 'speech'
    }
  ]
}"

応答:

HTTP/1.1 201 Created
Content-Length: 530
Content-Type: application/json; charset=utf-8
request-id: cb036529-d1cf-4b44-a1ef-0a4e9fc62885
api-supported-versions: 2023-01-15-preview,2023-05-01-preview
x-envoy-upstream-service-time: 202
Date: Thu, 06 Jul 2023 18:05:05 GMT
Connection: close

{
  "name": "my-video-index",
  "metadataSchema": {
    "language": "en",
    "fields": [
      {
        "name": "cameraid",
        "searchable": false,
        "filterable": true,
        "type": "string"
      },
      {
        "name": "timestamp",
        "searchable": false,
        "filterable": true,
        "type": "datetime"
      }
    ]
  },
  "userData": {},
  "features": [
    {
      "name": "vision",
      "modelVersion": "2023-05-31",
      "domain": "surveillance"
    },
    {
      "name": "speech",
      "modelVersion": "2023-06-30",
      "domain": "generic"
    }
  ],
  "eTag": "\"7966244a79384cca9880d67a4daa9eb1\"",
  "createdDateTime": "2023-07-06T18:05:06.7582534Z",
  "lastModifiedDateTime": "2023-07-06T18:05:06.7582534Z"
}

手順 2: インデックスにビデオ ファイルを追加する

次に、関連するメタデータを使用して、ビデオ ファイルをインデックスに追加します。 次の例は、SAS URL と Create Ingestion API を使用し、2 つのビデオ ファイルをインデックスに追加する方法を示しています。

curl.exe -v -X PUT "https://<YOUR_ENDPOINT_URL>/computervision/retrieval/indexes/my-video-index/ingestions/my-ingestion?api-version=2023-05-01-preview" -H "Ocp-Apim-Subscription-Key: <YOUR_SUBSCRIPTION_KEY>" -H "Content-Type: application/json" --data-ascii "
{
  'videos': [
    {
      'mode': 'add',
      'documentId': '02a504c9cd28296a8b74394ed7488045',
      'documentUrl': 'https://example.blob.core.windows.net/videos/02a504c9cd28296a8b74394ed7488045.mp4?sas_token_here',
      'metadata': {
        'cameraId': 'camera1',
        'timestamp': '2023-06-30 17:40:33'
      }
    },
    {
      'mode': 'add',
      'documentId': '043ad56daad86cdaa6e493aa11ebdab3',
      'documentUrl': '[https://example.blob.core.windows.net/videos/043ad56daad86cdaa6e493aa11ebdab3.mp4?sas_token_here',
      'metadata': {
        'cameraId': 'camera2'
      }
    }
  ]
}"

応答:

HTTP/1.1 202 Accepted
Content-Length: 152
Content-Type: application/json; charset=utf-8
request-id: ee5e48df-13f8-4a87-a337-026947144321
operation-location: http://api.example.com.trafficmanager.net/retrieval/indexes/my-test-index/ingestions/my-ingestion
api-supported-versions: 2023-01-15-preview,2023-05-01-preview
x-envoy-upstream-service-time: 709
Date: Thu, 06 Jul 2023 18:15:34 GMT
Connection: close

{
  "name": "my-ingestion",
  "state": "Running",
  "createdDateTime": "2023-07-06T18:15:33.8105687Z",
  "lastModifiedDateTime": "2023-07-06T18:15:34.3418564Z"
}

手順 3: インジェストが完了するまで待つ

インデックスにビデオ ファイルを追加すると、インジェスト プロセスが開始されます。 ファイルのサイズと数によっては、これに時間がかかる場合があります。 Get Ingestion API を使用して状態を確認し、検索を実行する前にインジェストの完了を確認できます。 この呼び出しによって "state" = "Completed" が返されるのを待ってから、次の手順に進みます。

curl.exe -v -X GET "https://<YOUR_ENDPOINT_URL>/computervision/retrieval/indexes/my-video-index/ingestions?api-version=2023-05-01-preview&$top=20" -H "ocp-apim-subscription-key: <YOUR_SUBSCRIPTION_KEY>"

応答:

HTTP/1.1 200 OK
Content-Length: 164
Content-Type: application/json; charset=utf-8
request-id: 4907feaf-88f1-4009-a1a5-ad366f04ee31
api-supported-versions: 2023-01-15-preview,2023-05-01-preview
x-envoy-upstream-service-time: 12
Date: Thu, 06 Jul 2023 18:17:47 GMT
Connection: close

{
  "value": [
    {
      "name": "my-ingestion",
      "state": "Completed",
      "createdDateTime": "2023-07-06T18:15:33.8105687Z",
      "lastModifiedDateTime": "2023-07-06T18:15:34.3418564Z"
    }
  ]
}

手順 4: メタデータを使用して検索を実行する

インデックスにビデオ ファイルを追加したら、メタデータを使用して特定のビデオを検索することができます。 この例は、2 種類の検索を示しています。1 つは "ビジョン" 機能を使用し、もう 1 つは "音声" 機能を使用します。

"ビジョン" 機能を使用して検索する

"ビジョン" 機能を使用して検索を実行するには、Search By Text API と vision フィルターを使用します。その際、クエリ テキストと、必要なフィルターが他にもあればそれを指定します。

curl.exe -v -X POST "https://<YOUR_ENDPOINT_URL>/computervision/retrieval/indexes/my-video-index:queryByText?api-version=2023-05-01-preview" -H "Ocp-Apim-Subscription-Key: <YOUR_SUBSCRIPTION_KEY>" -H "Content-Type: application/json" --data-ascii "
{
  'queryText': 'a man with black hoodie',
  'filters': {
    'stringFilters': [
      {
        'fieldName': 'cameraId',
        'values': [
          'camera1'
        ]
      }
    ],
    'featureFilters': ['vision']
  }
}"

応答:

HTTP/1.1 200 OK
Content-Length: 3289
Content-Type: application/json; charset=utf-8
request-id: 4c2477df-d89d-4a98-b433-611083324a3f
api-supported-versions: 2023-05-01-preview
x-envoy-upstream-service-time: 233
Date: Thu, 06 Jul 2023 18:42:08 GMT
Connection: close

{
  "value": [
    {
      "documentId": "02a504c9cd28296a8b74394ed7488045",
      "documentKind": "VideoFrame",
      "start": "00:01:58",
      "end": "00:02:09",
      "best": "00:02:03",
      "relevance": 0.23974405229091644
    },
    {
      "documentId": "02a504c9cd28296a8b74394ed7488045",
      "documentKind": "VideoFrame",
      "start": "00:02:27",
      "end": "00:02:29",
      "best": "00:02:27",
      "relevance": 0.23762696981430054
    },
    {
      "documentId": "02a504c9cd28296a8b74394ed7488045",
      "documentKind": "VideoFrame",
      "start": "00:00:26",
      "end": "00:00:27",
      "best": "00:00:26",
      "relevance": 0.23250913619995117
    },
  ]
}

"音声" 機能で検索する

"スピーチ" 機能を使用して検索を実行するには、Search By Text API と speech フィルターを使用します。その際、クエリ テキストと、必要なフィルターが他にもあればそれを指定します。

curl.exe -v -X POST "https://<YOUR_ENDPOINT_URL>com/computervision/retrieval/indexes/my-video-index:queryByText?api-version=2023-05-01-preview" -H "Ocp-Apim-Subscription-Key: <YOUR_SUBSCRIPTION_KEY>" -H "Content-Type: application/json" --data-ascii "
{
  'queryText': 'leave the area',
  'dedup': false,
  'filters': {
    'stringFilters': [
      {
        'fieldName': 'cameraId',
        'values': [
          'camera1'
        ]
      }
    ],
    'featureFilters': ['speech']
  }
}"

応答:

HTTP/1.1 200 OK
Content-Length: 49001
Content-Type: application/json; charset=utf-8
request-id: b54577bb-1f46-44d8-9a91-c9326df3ac23
api-supported-versions: 2023-05-01-preview
x-envoy-upstream-service-time: 148
Date: Thu, 06 Jul 2023 18:43:07 GMT
Connection: close

{
  "value": [
    {
      "documentId": "02a504c9cd28296a8b74394ed7488045",
      "documentKind": "SpeechTextSegment",
      "start": "00:07:07.8400000",
      "end": "00:07:08.4400000",
      "best": "00:07:07.8400000",
      "relevance": 0.8597901463508606
    },
    {
      "documentId": "02a504c9cd28296a8b74394ed7488045",
      "documentKind": "SpeechTextSegment",
      "start": "00:07:02.0400000",
      "end": "00:07:03.0400000",
      "best": "00:07:02.0400000",
      "relevance": 0.8506758213043213
    },
    {
      "documentId": "02a504c9cd28296a8b74394ed7488045",
      "documentKind": "SpeechTextSegment",
      "start": "00:07:10.4400000",
      "end": "00:07:11.5200000",
      "best": "00:07:10.4400000",
      "relevance": 0.8474636673927307
    }
  ]
}

次のステップ

マルチモーダル埋め込みの概念