Computer Vision / Video Analytics

NVIDIA Metropolis 마이크로서비스 및 API를 사용하여 엣지에서 비전 AI 애플리케이션 구축

Reading Time: 8 minutes

NVIDIA Metropolis 마이크로서비스는 비전 AI 애플리케이션 및 솔루션 개발을 위한 강력하고 사용자 정의 가능한 클라우드 네이티브 API 및 마이크로서비스를 제공합니다. 이제 이 프레임워크에는 NVIDIA Jetson이 포함되어 개발자가 엣지에서 고성능의 성숙한 비전 AI 애플리케이션을 빠르게 빌드하고 제품화할 수 있습니다.

API는 서로 다른 애플리케이션과 서비스 간의 원활한 통신 및 통합을 지원하여 소프트웨어 개발의 유연성, 상호 운용성 및 효율성을 향상시킵니다. 비디오 분석 애플리케이션을 구축하기 위한 두 가지 일반적인 기능은 비디오 스트리밍과 AI 기반 인사이트 및 분석 생성입니다.

이 게시물에서는 비전 AI 애플리케이션을 구축하고 이를 모든 클라이언트 애플리케이션에 통합하기 위한 API 워크플로우를 소개합니다. 애플리케이션 구축을 위한 세 가지 핵심 단계를 설명합니다:

  • API를 사용하여 WebRTC를 통해 엣지에서 모든 디바이스로 비디오 스트리밍하기.
  • API를 통해 액세스하는 tripwire 기능을 사용하여 사람/사물의 움직임에 대한 인사이트와 경고를 생성합니다.
  • 레퍼런스 클라우드를 사용하여 안전한 원격 디바이스 API 액세스를 지원합니다.

모듈식 아키텍처

Jetson용 NVIDIA Metropolis 마이크로서비스는 비전 AI 애플리케이션 구축을 위한 사용자 지정 및 재사용 가능한 마이크로서비스를 비롯한 다양한 소프트웨어 모음이 포함된 모듈식 아키텍처를 제공합니다. 이 제품군은 인프라 기능 및 레퍼런스 클라우드를 위한 플랫폼 서비스도 제공합니다. 다양한 마이크로서비스에는 비디오 스토리지 툴킷(VST), NVIDIA DeepStream 기반 AI 인식 서비스, 애널리틱스 서비스가 포함됩니다. 각 마이크로서비스는 마이크로서비스의 기능을 구성하고 액세스할 수 있는 API를 제공합니다.

이러한 API는 클라우드 네이티브 아키텍처에서 단일 게이트웨이를 사용하여 시스템 내에서 API를 노출하는 데 사용되는 표준 패턴을 기반으로 하는 Ingress 플랫폼 서비스를 사용하여 시스템 외부에 제공됩니다. 클라이언트 애플리케이션은 Ingress 서비스를 통해 각 API를 호출하여 마이크로서비스 기능을 실행합니다. 또한 NVIDIA Metropolis 마이크로서비스는 클라이언트가 이러한 API에 원격으로 액세스할 때 인증 및 권한 부여를 받을 수 있는 IoT 클라우드 모듈을 제공합니다.

그림 1. Jetson용 클라우드 네이티브 NVIDIA Metropolis 마이크로서비스

WebRTC를 통한 비디오 스트리밍

모바일 앱이나 브라우저와 같은 클라이언트 앱을 사용하여 시스템에 연결된 카메라의 비디오 스트림을 보는 것은 비디오 분석 시스템의 일반적인 요구 사항입니다. 이 기능은 VST API에 기반한 표준화된 호출 흐름을 통해 지원됩니다. VST 마이크로서비스는 인터넷을 통한 비디오 및 기타 데이터의 안정적인 P2P 전송을 위해 설계된 WebRTC(웹 실시간 통신) 프로토콜을 사용하여 원격 스트리밍을 지원합니다.

이 섹션에서는 WebRTC 프로토콜의 근간이 되는 주요 개념에 대한 개요와 VST API를 사용하여 WebRTC 기반 스트리밍을 활성화하는 방법을 설명합니다. WebRTC는 웹 브라우저와 VST를 실행하는 Jetson 장치와 같은 두 피어 간에 직접 실시간 통신을 가능하게 하는 강력한 오픈 소스 프로젝트입니다.

WebRTC 스트리밍을 위한 요소

일반적인 WebRTC 세션에는 아래에 나열된 몇 가지 요소가 포함됩니다:

사용자 에이전트: VST API를 사용하여 통신을 시작하는 모바일, 브라우저 또는 웹 애플리케이션을 나타냅니다.

시그널링 서버: WebRTC 세션의 통신 채널 설정에 관여하는 VST 내에 구현된 웹 서버입니다.

ICE(대화형 연결 설정) 서버: 피어(peer) 간의 최적의 연결 경로를 결정하기 위해 VST-WebRTC 스택 내에 구현된 논리 모듈입니다. 방화벽 및 NAT(네트워크 주소 변환기)를 통과하는 데 필요합니다.

STUN(NAT용 세션 트래버설 유틸리티) 서버: 공용 IP 주소와 포트를 검색하는 데 도움이 되는 ICE 서버의 한 유형입니다. 피어가 사설(NAT 기반) IP 주소를 사용할 때 필요합니다. 퍼블릭 클라우드 네트워크에서 호스팅되는 타사 엔티티입니다.
TURN(NAT 주변 릴레이를 사용한 트래버스) 서버: 직접 피어 투 피어 통신이 실패할 경우 릴레이 역할을 하며, 피어가 서로 다른 네트워크에 있는 경우에만 필요합니다. 이는 Twilio와 같은 타사 서비스를 통해 지원됩니다.

그림 2. WebRTC 스트리밍을 위한 엔티티

WebRTC 세션 단계

WebRTC 세션은 제어 경로와 데이터 경로를 사용하여 세션 생성 및 스트리밍을 활성화합니다.

제어 경로는 초기화, 시그널링, ICE 후보 교환, 연결 설정 등의 단계로 구성된 피어 간 세션을 설정하고 관리할 수 있게 해줍니다. VST는 사용자 에이전트가 API를 통해 이러한 작업을 원격으로 수행할 수 있도록 지원합니다.

데이터 경로는 실시간 미디어 데이터 전송과 함께 적응 및 품질 관리, 최종적으로 연결 종료를 가능하게 합니다.

VST API를 통해 WebRTC 스트리밍 활성화하기

그림 3은 WebRTC 세션을 활성화하기 위한 제어 및 데이터 경로를 캡처한 클라이언트와 VST 간의 호출 흐름을 보여줍니다.

그림 3. VST를 사용한 WebRTC 콜 플로우


콜 플로우는 클라이언트가 api/v1/sensor/list API를 사용하여 다양한 비디오 스트림을 검색하는 것으로 시작됩니다.

제어 및 데이터 경로는 다음 호출 흐름에 따라 구현됩니다:

  • 클라이언트가 GET api/v1/live/iceServers 또는 api/v1/replay/iceServers를 호출하여 VST에서 ICE 서버 목록을 가져옵니다.
  • 클라이언트가 로컬 오퍼를 생성하고 POST api/v1/live/stream/start 또는 api/v1/replay/stream/start를 사용하여 VST로 오퍼를 보냅니다.
  • VST는 클라이언트에 대한 응답을 생성하고 이를 응답으로 반환합니다.
  • 클라이언트는 peerid를 쿼리 파라미터로 사용하여 api/v1/live/iceCandidate 또는 api/v1/replay/iceCandidate에 대한 GETPOST 요청을 사용하여 ICE 교환을 완료합니다.
  • 피어 연결이 완료되면 비디오 데이터가 전송되기 시작합니다.

스트리밍이 진행 중일 때 클라이언트는 다음 스트림 API를 사용하여 스트리밍을 제어할 수 있습니다:

비디오 파이프라인 일시 중지: api/v1/replay/stream/pause
비디오 파이프라인 재개: API/V1/REPLAY/STREAM/ RESUME
동영상에서 특정 시간 찾기: API/V1/REPLAY/STREAM/SEEK

클라이언트 애플리케이션 빌드

이러한 개념은 대부분의 브라우저에서 지원하는 자바스크립트의 WebRTC 지원을 활용하면서 자바스크립트에서 HTTP를 통해 VST API를 호출하여 브라우저 기반 웹 애플리케이션에 비디오 스트리밍 기능을 추가하는 데 적용할 수 있습니다. 네이티브 WebRTC 클라이언트 애플리케이션을 구축하는 데에도 유사한 개념을 적용할 수 있습니다.

JavaScript를 사용하여 WebRTC 스트리밍을 설정하려면 다음 단계를 따르세요:

피어 연결 초기화하기

적절한 구성 설정으로 새 RTCPeerConnection 객체를 만듭니다.

트랙 추가 처리

  • 온트랙 이벤트에 대한 이벤트 리스너를 설정합니다.
  • 새 트랙이 추가되면 들어오는 비디오 스트림을 표시하도록 원격 비디오 요소를 업데이트합니다.

오퍼 생성

  • createOffer 메서드를 사용하여 피어 연결에 대한 오퍼를 생성합니다.
  • 생성된 오퍼에 피어 연결에 대한 로컬 설명을 설정합니다.

VST로 오퍼 보내기

  • peerConnection.localDescription을 사용하여 로컬 설명(오퍼)을 가져옵니다.
  • 적절한 시작 API(예: api/v1/live/stream/start)를 사용하여 VST에 오퍼를 보냅니다.

VST로부터 응답 받기

VST로부터 시작 API 응답으로 SDP 응답을 받으면 peerConnection.setRemoteDescription을 사용하여 이를 원격 설명으로 설정합니다.

ICE 후보 처리

  • api/v1/live/iceCandidate API의 GETPOST 요청을 사용하여 ICE 후보를 교환합니다.
  • 수신된 ICE 후보를 peerConnection.addIceCandidate를 사용하여 피어 연결에 추가합니다.

객체 이동에 대한 공간 인사이트 및 알림 생성하기

애널리틱스 마이크로서비스는 세 가지 사람 또는 객체 애널리틱스 모듈을 지원합니다:

  • 시야각(FOV): 카메라 시야에 있는 사람이나 물체의 수를 계산합니다.
  • tripwire: 사용자가 정의한 tripwire 선 세그먼트(tripwire line segments)를 가로지르는 사람이나 물체를 감지합니다.
  • 관심 영역(ROI): 정의된 관심 영역에 있는 사람이나 물체의 수를 계산합니다.

이러한 모듈을 함께 사용하면 물리적 공간에서 사람이나 물체의 움직임을 파악할 수 있는 강력한 도구 세트를 제공하며, 소매 창고, 보안 및 안전 분야에서 다양한 사용 사례가 있습니다. 클라이언트 애플리케이션은 API를 사용하여 센서 목록을 식별하고, tripwire를 생성하고, 이러한 각 기능에 대한 횟수 및 경고를 검색합니다.

이 섹션에서는 tripwire에 대한 이러한 작업의 엔드투엔드 예제를 살펴봅니다. 유사한 방법론을 사용하여 FOV 및 ROI를 활성화할 수 있습니다. 각 경우에 대해 원하는 프로그래밍 언어 또는 HTTP 클라이언트로 HTTP API를 호출하세요.

센서 목록 검색

첫 번째 단계로, tripwire를 구성할 센서의 이름을 검색합니다.
모든 센서를 나열하기 위해 VST API를 호출합니다. 반환된 목록에서 관심 있는 센서를 식별합니다. 센서 개체의 name 속성은 tripwire 횟수 및 경고를 구성하고 검색하기 위한 후속 단계에서 센서 ID로 사용됩니다. 를 장치의 IP 주소로 바꿉니다.

http://<device-ip>:30080/vst/api/v1/sensor/list

tripwire 컨피규레이션 만들기

이 단계에서는 tripwire를 구성하여 횡단하는 사람의 수를 계산할 라인을 지정합니다.

tripwire를 구성할 때 다음 속성을 지정합니다:

  • Sensor ID: tripwire를 구성할 센서의 식별입니다.
  • Tripwire ID tripwire의 식별입니다. 하나의 센서에 여러 가지 정의가 있을 수 있습니다. 각 tripwire에는 고유한 식별자가 있어야 합니다.
  • Wire: tripwire를 구성하는 선분을 나타내는 일련의 점입니다.
  • 방향: 교차점(입구/출구)의 방향성을 나타내는 벡터(두 점)입니다.

점의 좌표는 카메라 좌표(이미지 평면)에 있습니다. 왼쪽 위 모서리는 (0,0)입니다.

NVIDIA Metropolis 마이크로서비스와 함께 제공되는 레퍼런스 모바일 앱과 같은 클라이언트 애플리케이션은 (x, y) 위치를 수동으로 결정할 필요 없이 점을 선택할 수 있는 시각적 지원을 제공합니다. 그림 4는 모바일 앱을 통해 생성 및 렌더링된 tripwire의 예를 보여줍니다. 사용자가 앱의 터치 인터페이스를 사용하여 tripwire 앵커 포인트를 선택하면 방향성(빨간색 화살표)과 함께 tripwire(녹색 선)가 그려집니다.

그림 4. NVIDIA Metropolis 마이크로서비스와 함께 제공되는 레퍼런스 모바일 앱의 tripwire 시각적 렌더링

Id = Amcrest_3인 센서에 대해 Id = main_door로 tripwire를 구성하려면 원하는 프로그래밍 언어로 다음 HTTP API 콜을 호출합니다:

http://<device-ip>:30080/emdx/api/config/tripwire?sensorId=Amcrest_3
{
  "deleteIfPresent": false,
  "tripwires": [
    {
        "direction": {
          "entry": {
            "name": "Inside the room"
          },
          "exit": {
            "name": "Outside of the room"
          },
          "p1": { "x": 753, "y": 744},
          "p2": { "x": 448, "y": 856}
        },
        "id": "main_door",
        "name": "Main door",
        "wire": [
          { "x": 321, "y": 664 },
          { "x": 544, "y": 648 },
          { "x": 656, "y": 953 },
          { "x": 323, "y": 1067}
        ]
      }
  ],
  "sensorId": "Amcrest_3"
}

tripwire 알림 규칙 구성(선택 사항)

특정 tripwire에 대한 알림 규칙을 구성하는 것은 선택 사항입니다. 알림 규칙은 특정 조건이 충족되면 알림 이벤트가 생성되는 특정 조건입니다.

한 사람이 tripwire(main door)를 진입 방향으로 통과할 때마다 알림을 발생시키는 알림 규칙을 구성하려면 다음 API 요청을 호출하세요:

http://<device-ip>:30080/emdx/api/config/rule/alerts/tripwire
{
  "sensorId": "Amcrest_3",
  "rules": [
    {
      "rule_id": "cd2218f6-e4d2-4ad4-9b15-3396e4336064",
      "id": "main_door",
      "type": "tripwire",
      "rule_type": "increment",
      "time_interval": 1,
      "count_threshold": 1,
      "direction": "entry"
    }
  ]
}

tripwire 횟수 및 알림 검색하기

이 단계에서는 이전에 정의한 tripwire를 통과한 사람의 수를 검색하는 방법을 설명합니다. 원하는 경우 해당 tripwire에 대해 구성된 알림 규칙에 따라 생성된 알림을 검색할 수도 있습니다.

특정 tripwire(sensorId, tripwireId)에 대해, 시간 범위(fromTimestamp, toTimestamp)에 대해 횟수를 쿼리하고 지정된 시간 창(fixedInterval)으로 집계할 수 있습니다. 선택적으로, alerts 쿼리 매개변수를 true로 설정하여 알림 및 횟수를 검색할 수 있습니다:

http://<device-ip>:30080/emdx/api/metrics/tripwire/histogram?sensorId=Amcrest_3&tripwireId=main_door&fromTimestamp=2020-10-30T20:00:00.000Z&toTimestamp=2020-10-30T20:01:00.000Z&fixedInterval=1000&alerts=true
{
    "alerts": [
     {
            "count": 1,
            "description": "1 people entered tripwire",
            "duration": 1.000,
            "startTimestamp": "2020-10-30T20:00:59.000Z",
            "endTimestamp": "2020-10-30T20:01:00.000Z",
            "id": "unique-alert-id",
            "rule_type": "increment",
            "rule_id": "cd2218f6-e4d2-4ad4-9b15-3396e4336064",
            "sensorId": "Amcrest_3",
            "type": "tripwire",
            "direction": "entry",
            "directionName": "Inside the room", 
            "attributes": [..],
        }
     ],
    "counts": [
      {
        "agg_window": "1 sec",
        "histogram": [
          {
            "end": "2020-10-30T20:00:01.000Z",
            "start": "2020-10-30T20:00:00.000Z",
            "sum_count": 1
          }
        ],
        "attributes": [...],
        "sensorId": "Amcrest_3",
        "type": "exit"
      },
      {
        "agg_window": "1 sec",
        "histogram": [
          {
            "end": "2020-10-30T20:00:01.000Z",
            "start": "2020-10-30T20:00:00.000Z",
            "sum_count": 0
          },
          …..
        ],
        "attributes": [.. ],
        "sensorId": "Amcrest_3",
        "type": "entry"
      }
    ]
  }

히스토그램은 각 방향에 대해 개별적으로 반환됩니다. 전체 시간 범위는 fixedInterval의 시간 창으로 나뉩니다. 각 시간 윈도우의 시작, 종료에 대한 교차점은 sum_count로 보고됩니다.

tripwire 알림 조회하기

특정 센서에 대한 모든 알림을 조회하려면 다음 API를 호출하세요:

http://<device-ip>:30080/emdx/api/alerts?sensorId=Amcrest_3&fromTimestamp=2020-10-30T20:00:00.000Z&toTimestamp=2020-10-31T01:00:00.000Z

안전한 원격 클라우드 기반 API 액세스

API를 통해 클라이언트는 HTTP 프로토콜을 사용하여 원격으로 디바이스 구성 및 기능에 액세스할 수 있습니다. 개발 단계에서는 HTTP 요청을 디바이스 IP 주소로 전달하는 방식으로 API를 호출하는 것이 좋습니다. 그러나 프로덕션 시나리오에서는 일반적으로 클라이언트가 디바이스의 IP 주소를 알 수 없습니다.

또한 Jetson 장치가 방화벽 뒤에 위치하여 연결할 수 없거나 외부에서 유효하지 않을 수 있는 NAT 기반 IP 주소를 사용할 수 있습니다. IoT 클라우드는 네트워크에서 분리된 클라이언트의 요청을 안전한 방식으로 장치에 전달하는 메커니즘을 제공하여 제품 수준의 원격 API 호출을 용이하게 합니다.

이 섹션에서는 클라이언트가 보안 토큰을 획득하고 이를 사용하여 클라우드를 통해 HTTP를 만들어 적절한 디바이스로 전달할 수 있는 메커니즘에 대해 설명합니다.

이 섹션의 초점은 클라이언트가 클라우드를 통해 디바이스 API를 호출하는 방법을 소개하는 것이지만, 클라우드 아키텍처는 클라우드를 통해 특정 디바이스에 대한 승인된 액세스를 위한 안전한 ‘디바이스 클레임’ 메커니즘을 제공한다는 점에 유의하세요. 클라우드를 통한 모든 사용자 디바이스 액세스는 인증 및 권한 부여를 거치며, 사용자는 이전에 클레임한 디바이스에만 액세스할 수 있습니다.

이 기능은 높은 사용자 지정 기능으로 설계되어 ODM(주문자 상표 부착 생산) 및 OEM(주문자 상표 부착 생산) 사업자의 기존 보안 프레임워크 및 클라우드 백엔드 인프라와 원활하게 통합할 수 있습니다.

IoT 클라우드를 통한 디바이스 API 호출을 위한 워크플로우

참조 IoT 클라우드 구현에서는 Amazon Cognito를 IdP(ID 공급자)로 사용하지만, 사용자는 어떤 타사 ID 공급자라도 사용할 수 있습니다. 클라우드 엔드포인트를 통해 장치 API에 액세스하려면 아래에 설명된 인증 및 권한 부여 호출 흐름을 사용하세요.

Amazon Cognito로 인증하기

웹 콘솔을 사용하여 로그인 URI 페이지에 로그인하여 Amazon Cognito로 인증합니다. 인증에 성공하면 Amazon Cognito가 고유한 인증 코드를 반환합니다. 인증 코드를 사용하여 Amazon Cognito에 시간 제한 ID 토큰을 발급하도록 요청합니다. IoT 클라우드 보안 API를 호출할 때 이 ID 토큰을 제시합니다.

그림 5. IDP로 인증하기 위한 호출 흐름

JWT 토큰을 생성하고 디바이스 API 호출하기

IoT 장치 API에 액세스하려면 먼저 IoT 클라우드 보안에 인증 토큰을 요청하세요. 유효한 요청이 있으면 IoT 클라우드 보안에서 임시 서명된 권한 부여 JWT 토큰을 발급합니다. 그런 다음 이 토큰을 사용하여 IoT 클라우드 전송을 통해 장치 API를 호출하면 이 토큰이 유효성을 검사하고 요청을 장치로 전달합니다.

사용자에게 장치 클레임에 따라 작업을 수행할 수 있는 권한이 없는 경우 권한이 없는 HTTP 오류 코드가 반환됩니다.

그림 6. IoT 클라우드로 사용자에게 권한을 부여하기 위한 호출 흐름

요약

NVIDIA Metropolis API 및 마이크로서비스를 사용하여 엣지에서 시장에 출시할 수 있는 강력한 비전 AI 애플리케이션을 빌드하세요. API는 다양한 NVIDIA Metropolis 마이크로서비스의 기능을 실행할 수 있는 표준화되고 안전하며 분산된 수단을 제공합니다. 이번 릴리스에 포함된 레퍼런스 모바일 애플리케이션은 구성, 비디오 스트리밍, 분석, 알림, 클라우드 통합 및 디바이스 클레임을 캡처하는 사용자 친화적인 인터페이스를 갖춘 이러한 API를 사용하여 구축된 성숙한 최종 사용자 애플리케이션을 보여줍니다. 이 애플리케이션에는 소스 코드가 포함되어 있으며, 릴리스 문서의 모바일 앱 섹션에서 다양한 모듈에 대한 안내를 확인할 수 있습니다.

Jetson용 NVIDIA 메트로폴리스 마이크로서비스를 다운로드하세요. 그리고 2부로 구성된 웨비나, Jetson용 메트로폴리스 API 및 마이크로서비스로 엣지 AI 개발 가속화(1부) 및 Jetson용 메트로폴리스 마이크로서비스로 구축하는 방법(2부)에 등록하여 참여하세요.

관련 리소스

GTC 세션: 생성형 AI를 통한 새로운 차원의 클라우드 네이티브 애플리케이션을 구현하는 방법
GTC 세션: 픽셀에서 성능까지: 비전 AI 애플리케이션 가속화를 위한 핵심 기술
GTC 세션 Connect With the Experts: 비전 AI 툴박스
SDK: 비디오 효과 SDK
웨비나: Jetson의 Metropolis API 및 마이크로서비스로 엣지 AI 개발 가속화하기
웨비나: Gen AI로 비전 AI 애플리케이션 혁신

Discuss (0)

Tags