다음을 통해 공유


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

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

필수 조건

입력 요구 사항

지원되는 형식

파일 형식 설명
asf ASF(Advanced / Active Streaming Format)
avi AVI(Audio-Video Interleaved)
flv FLV(Flash Video)
matroskamm, webm Matroska/WebM
mov,mp4,m4a,3gp,3g2,mj2 QuickTime/MOV

지원되는 비디오 코덱

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

지원되는 오디오 형식

코덱 형식
aac AAC(Advanced Audio Coding)
mp3 MP3(MPEG audio layer 3)
pcm PCM(uncompressed)
vorbis Vorbis
wmav2 Windows Media 오디오 2

비디오 검색 API 호출

일반적인 패턴에서 비디오 검색 API를 사용하려면 다음 단계를 수행합니다.

  1. PUT - 인덱스 만들기를 사용하여 인덱스를 만듭니다.
  2. PUT - CreateIngestion사용하여 비디오 문서를 인덱스에 추가합니다.
  3. 수집이 완료되기를 기다렸다가 GET - ListIngestions를 확인합니다.
  4. POST - SearchByText사용하여 키워드나 구문을 검색합니다.

비디오 검색 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을 사용하여 비디오 파일 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단계: 수집이 완료될 때까지 대기

비디오 파일을 인덱스에 추가하면 수집 프로세스가 시작됩니다. 데이터베이스의 크기와 수에 따라 다소 시간이 걸릴 수 있습니다. 검색을 수행하기 전에 수집이 완료되었는지 확인하려면 수집 가져오기 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 필터와 함께 텍스트별 검색 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 필터와 함께 텍스트별 검색 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
    }
  ]
}

다음 단계

다중 모달 포함 개념