벡터화를 사용하여 비디오 검색 수행(버전 4.0 미리 보기)

Azure AI Video Retrieval API는 Azure AI Vision의 일부이며 개발자가 인덱스를 만들고, 문서(비디오 및 이미지)를 추가하고, 자연어를 사용하여 검색할 수 있습니다. 개발자는 각 인덱스에 대한 메타데이터 스키마를 정의하고 검색에 도움이 되도록 서비스에 메타데이터를 수집할 수 있습니다. 개발자는 인덱스(비전, 음성)에서 추출할 기능을 지정하고 기능에 따라 검색을 필터링할 수도 있습니다.

필수 조건

  • Azure 구독 - 체험 구독 만들기
  • Azure 구독 이 있으면 포털을 사용하여 Vision 리소스를 만듭니다. 이 미리 보기의 경우 오스트레일리아 동부, 스위스 북부, 스웨덴 중부 또는 미국 동부 지역 중 하나에서 리소스를 만들어야 합니다.
  • Azure Storage 리소스 만들기 - 리소스 만들기

입력 요구 사항

지원되는 형식

파일 형식 설명
asf ASF(고급/활성 스트리밍 형식)
avi AVI(오디오 비디오 인터리브)
flv FLV(플래시 비디오)
matroskamm, webm Matroska / WebM
mov,mp4,,3gpm4a,3g2,mj2 QuickTime/MOV

지원되는 비디오 코덱

Codec 형식
h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 파트 10
h265 H.265/HEVC
libvpx-vp9 libvpx VP9(코덱 vp9)
mpeg4 MPEG-4부 2

지원되는 오디오 코덱

Codec 형식
aac AAC(고급 오디오 코딩)
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를 사용하여 키워드(keyword) 또는 구를 검색합니다.

비디오 검색 API를 사용하면 사용자가 비디오 파일에 메타데이터를 추가할 수 있습니다. 메타데이터는 특정 비디오를 구성, 필터링 및 검색하는 데 사용할 수 있는 "카메라 ID", "타임스탬프" 또는 "위치"와 같은 비디오 파일과 관련된 추가 정보입니다. 이 예제에서는 인덱스를 만들고, 연결된 메타데이터를 사용하여 비디오 파일을 추가하고, 다른 기능을 사용하여 검색을 수행하는 방법을 보여 줍니다.

1단계: 인덱스 만들기

시작하려면 비디오 파일과 해당 메타데이터를 저장하고 구성하는 인덱스 만들기가 필요합니다. 아래 예제에서는 인덱스 만들기 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단계: 인덱스로 비디오 파일 추가

다음으로, 연결된 메타데이터를 사용하여 인덱스로 비디오 파일을 추가할 수 있습니다. 아래 예제에서는 수집 만들기 API와 함께 SAS URL을 사용하여 인덱스에 두 개의 비디오 파일을 추가하는 방법을 보여 줍니다.

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단계: 수집이 완료되기를 기다립니다.

인덱스에 비디오 파일을 추가하면 수집 프로세스가 시작됩니다. 파일의 크기와 수에 따라 다소 시간이 걸릴 수 있습니다. 검색을 수행하기 전에 수집이 완료되었는지 확인하려면 수집 가져오기 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단계: 메타데이터를 사용하여 검색 수행

인덱스로 비디오 파일을 추가한 후 메타데이터를 사용하여 특정 비디오를 검색할 수 있습니다. 이 예제에서는 두 가지 유형의 검색을 보여 줍니다. 하나는 "비전" 기능을 사용하고 다른 하나는 "음성" 기능을 사용하는 것입니다.

"비전" 기능을 사용하여 검색

"비전" 기능을 사용하여 검색을 수행하려면 필터와 함께 vision Search By Text API를 사용하여 쿼리 텍스트 및 기타 원하는 필터를 지정합니다.

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
    },
  ]
}

"음성" 기능을 사용하여 검색

"음성" 기능을 사용하여 검색을 수행하려면 필터와 함께 speech Search By Text API를 사용하여 쿼리 텍스트 및 기타 원하는 필터를 제공합니다.

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
    }
  ]
}

다음 단계

멀티모달 포함 개념