옵션
집집 Skill DevOps 및 CI/CD vss-deploy-detection-tracking-3d

vss-deploy-detection-tracking-3d

NVIDIA/skills NVIDIA/skills

다중 카메라 3D 감지 및 추적을 위한 RTVI-CV-3D 마이크로서비스를 배포하고 운영하며, 샘플 데이터셋, 사용자 지정 동영상 및 RTSP 스트림을 지원합니다.

...모든 것을 확장하십시오
0
업데이트 된 시간 2026년 9월 28일

목적

RTVI-CV-3D 마이크로서비스를 MV3DT(MODE=mv3dt) — 카메라별 DeepStream 인식 및 여러 보정된 카메라를 통한 BEV 퓨전 —로 번들된 샘플 데이터셋, 사용자 지정 동영상 또는 실시간 RTSP에 배포 및 운영하되, 전체 웨어하우스 에이전트 및 LLM / VLM 스택을 사용하지 않고 배포 및 운영합니다.

지침

위에서 아래로 순서대로 진행하십시오: ‘경로 선택(Routing)’ 섹션의 경로 선택 질문(Q0–Q3)에 답한 후, 선택한 경로의 참조 자료를 따르십시오. 자세한 단계별 절차는 references/ 디렉터리에 있습니다(배포, 보정 체인, 카메라 구성, 검증, 종료, 문제 해결).

예시

  • 샘플 데이터셋에서 멀티 카메라 추적을 활성화하세요.
  • 여기 <path/to/videos>에 있는 제 동영상에 RTVI-CV-3D를 배포하십시오.
  • 보정 후 RTSP 스트림에서 MV3DT를 실행하십시오.

VSS 배포 감지 및 추적 — 3D (RTVI-CV-3D / MV3DT)

웨어하우스 블루프린트에서 RTVI-CV-3D 마이크로서비스를 MV3DT 스택(MODE=mv3dt)으로 시작합니다: 카메라별 DeepStream 인식 (vss-rtvi-cv-mv3dt) + BEV 퓨전 (vss-rtvi-cv-bev-fusion) + mosquitto MQTT 버스 + 브로커 + VST 센서 스택 — 전체 창고 블루프린트에 포함된 에이전트/ LLM / VLM 스택 없이.

실제 컴포즈 메커니즘은 deploy/docker/industry-profiles/warehouse-operations/warehouse-mv3dt-app/에 위치합니다 . 이 스킬은 환경 오버라이드, 보정 체인 및 검증을 구동합니다.

라우팅

사용자에게 최대 네 가지 질문을 한 후, 작업을 배정합니다.

Q0 — 프로필 크기(오버레이 포함 여부)

사용자가 명시적으로 최소 프로필을 요청하지 않는 한 기본값은 확장 프로필로 설정됩니다. 확장 프로필은 ELK + vss-video-analytics-api-mv3dt + vss-kibana-init을 배포합니다. -mv3dt + vss-import-calibration-output-mv3dt를 MV3DT 코어 위에 배포합니다. 이는 VST 비디오 월이 바운딩 박스 오버레이를 렌더링하는 데 필요한 구성 요소입니다. 이 구성 요소가 없으면 비디오 월은 작동하지만 오버레이가 적용되지 않은 원본 스트림만 표시됩니다.

사용자 답변 MINIMAL_PROFILE 제공되는 기능 선택 시점
확장 (기본값) "" MV3DT 코어 + ELK + 분석 API + Kibana. VST 비디오 월에서 오버레이 기능이 작동합니다. 완벽한 엔드투엔드(e2e) 경험을 원할 때 권장됩니다. "완벽한 엔드투엔드(e2e) 경험을 원합니다", "바운딩 박스를 보고 싶습니다" 또는 선호 사항 미기재
최소 구성 "true" MV3DT 코어만 사용. 컨테이너 수가 약 5개 줄어듭니다. VST에서 오버레이가 표시되지 않습니다. 메타데이터는 여전히 Kafka/Redis에 저장됩니다. "데이터만 필요함", "엣지/Thor 호스트", "최소 리소스 사용"

선택적 ELK에 대한 참고 사항: 현재 컴포즈에는 "최소 + ELK 전용"이라는 중간 경로가 없습니다. 모든 ${MINIMAL_PROFILE:+_extended} 게이트가 적용된 서비스는 함께 시작됩니다(ES, Logstash, Kibana, video-analytics-api, kibana-init, import-calibration). MINIMAL_PROFILE이 설정된 경우, bash의 :+ 매개변수 확장은 _extended 접미사를 생성합니다. extended를 사용하면 게이트 문자열이 활성 컴포즈 프로필과 이미 일치하는 기본 bp_wh_kafka_mv3dt로 다시 전환됩니다. 전체 확장 번들을 수용하거나 최소 구성을 유지해야 합니다.

Q1 — 데이터 소스

사용자의 첫 번째 메시지에 소스가 명시되어 있지 않은 경우 이 질문을 하십시오. "deploy rtvi-cv-3d"와 같은 단순한 요청은 이 MV3DT 스킬(MODE=mv3dt)로 라우팅되지만, 샘플을암시하지는 않습니다.

  • sample — 번들로 제공되는 4대 카메라 합성 데이터셋(warehouse-4cams-20mx20m-synthetic). 보정 데이터는 트리 내에 포함되어 있으므로 AMC 실행이 필요하지 않습니다.
  • videos — 사용자가 로컬 동영상 파일(카메라 이름을 딴 *.mp4 파일)을 보유하고 있는 경우. 보정이 누락된 경우 독립형 AMC(auto_calib 프로필)가 실행됩니다.
  • rtsp — 사용자가 실시간 RTSP URL을 보유하고 있는 경우. VIOS 기반 AMC를 통한 보정; 최종 배포 시에는 해당 RTSP URL이 포함된 센서 정보 파일(camera_info.json)도 필요합니다.

Q2 — 보정 범위 ( 샘플의 경우 건너뛰기)

동영상 및 RTSP의 경우, 퍼셉션 컨테이너가 예상하는 마운트 경로에 보정이 이미 디스크에 있는지 확인합니다:

DATASET="${SAMPLE_VIDEO_DATASET:?}"          # 사용자의 데이터셋 슬러그; Q3 참조
CAL_DIR="${VSS_APPS_DIR}/industry-profiles/warehouse-operations/warehouse-mv3dt-app/calibration/sample-data/${DATASET}"

# 다음 중 하나라도 있는지 확인: calibration.json, 그리고 camInfo/*.yml 또는 *.yaml 파일 중
# 'cam_*' 또는 'Camera*'로 이름이 지정된 파일 (제공된 샘플은 Camera*.yml을 사용하며, AMC는
# cam_*.yml을 생성할 수 있으므로 — 필요에 따라 범위를 확장하십시오)
test -f "${CAL_DIR}/calibration.json" \
  && ls "${CAL_DIR}/camInfo/"*.{yml,yaml} 2>/dev/null

사용자가 직접 보정 경로를 제공한 경우, 해당 경로를 검증하고 재계산하지 마십시오. 카메라 이름 정규화 및 정확한 카메라 수 확인에 대해서는 configure-cameras.md를 참조하십시오( calibration.json을 파싱함).

Q3 — 디텍터 + 데이터셋 슬러그 (Q2가 AMC를 트리거하는 경우에만)

  • resnet (기본값, 빠름) 또는 transformer (더 느리지만, 오클루전 환경에서 더 우수함) — 단계 B에서 AMC /v1/calibrate/ API로 전달됨( vss-generate-video-calibration/SKILL.md:48-62 참조).
  • SAMPLE_VIDEO_DATASET으로 사용되는 짧은 케밥 케이스(kebab-case) 데이터셋 슬러그(예: customer-aisle-4cams). 이는 보정 마운트 경로를 결정하며 .env에 저장됩니다.

라우팅 테이블

Q1 Q2 결과 경로
샘플 (cal 선박은 트리 내에 포함되어 있으며 이미 정규화됨) references/deploy-rtvi-cv-3d-stack.md 직접 참조
동영상 cal 포함 references/configure-cameras.md → references/deploy-rtvi-cv-3d-stack.md
동영상 cal 누락 참조/calibration-workflow.md (비디오 모드) → 참조/configure-cameras.md → 참조/deploy-rtvi-cv-3d-stack.md
rtsp cal 존재 참조/카메라 구성.md → 참조/RTVI-CV-3D 스택 배포.md
rtsp cal 누락 references/calibration-workflow.md (rtsp 모드) → references/configure-cameras.md → references/deploy-rtvi-cv-3d-stack.md

-d가 완료되면 모든 경로는 references/verify-and-view.md 로 수렴합니다. references/troubleshooting.md 및 references/teardown.md는 링크되어 있지만 정상 경로에는 포함되지 않습니다.

의미 명확화 규칙. 이 스킬에서 "RTVI-CV-3D"는 MV3DT 마이크로서비스 배포를 의미하며 MODE=mv3dt를 사용합니다. 사용자가 전체 창고 블루프린트, Sparse4D, MODE=3d 또는 warehouse-3d-app을 요청할 때만 ../vss-deploy-profile/references/warehouse.md로 이동합니다. 이 스킬은 에이전트 스택/LLM/VLM이 포함되지 않은 MV3DT 전용입니다.

필수 조건

1. 저장소 경로

디스크에서 video-search-and-summarization/을 찾습니다. 모든 compose 명령은 /deploy/docker/에서 실행됩니다 . 경로를 알 수 없는 경우 사용자에게 문의하십시오.

2. NGC CLI + 키

$NGC_CLI_API_KEY가 설정되어 있어야 하며, nvidia/vss-core/* 이미지에 대한 액세스 권한이 있어야 합니다. 키가 없는 경우 설정 방법은 vss-deploy-profile/references/ngc.md를 참조하십시오.

사용자가 이전에 ngc config set을 실행했지만 이 셸에서 $NGC_CLI_API_KEY가 내보내지지 않은 경우, 키는 이미 디스크에 존재합니다:

NGC_CLI_API_KEY=$(awk -F'= ' '/^apikey/{print $2}' ~/.ngc/config 2>/dev/null)
test -n "${NGC_CLI_API_KEY}" && echo "키가 ~/.ngc/config에서 가져옴"

키 값이 industry-profiles/warehouse-operations/.env:164 (NGC_CLI_API_KEY=...)에도 반영되었는지 확인하십시오. — compose는 쉘 환경 변수가 아닌 해당 위치에서만 키를 읽습니다.

3. HARDWARE_PROFILE 슬러그

MV3DT에서 지원하는 공개 스트림 수는 ‘Warehouse Quickstart Guide’의 “MV3DT Vision AI Profile Supported Deployment Options” 섹션에 나열되어 있습니다. 아래에서 해당 HARDWARE_PROFILE 슬러그를 선택하십시오.

다음 명령어( nvidia-smi --query-gpu=name --format=csv,noheader)에서 선택하십시오:

GPU 이름 HARDWARE_PROFILE MV3DT 지원 스트림 수
RTX PRO 6000 Blackwell RTXPRO6000BW 18
H100 (NVL, SXM HBM3) H100 13
L40S L40S 7
IGX Thor IGX-THOR 4
DGX 스파크 DGX-SPARK 4

사용자의 GPU가 여기에 나열되어 있지 않은 경우, industry-profiles/warehouse-operations/.env에서 사용 가능한 HARDWARE_PROFILE 값을 확인한 후, blueprint-configurator/blueprint_config.yml에 해당 프로필이 존재하는지 확인한 다음 사용하십시오. 슬러그(slug)만으로 스트림 수를 추측하지 마십시오.

GPU당 MV3DT 상한은 배포 시점에 적용됩니다. vss-configurator-mv3dt는 final_stream_count = min(NUM_STREAMS, max_streams_supported) 로 계산하고, ${VSS_DATA_DIR}/videos/${SAMPLE_VIDEO_DATASET}/에 대해 keep_count 파일 관리 작업을 적용하여 final_stream_count개의 .mp4 파일만 남도록 합니다(사전순으로 정렬하여 마지막 N개만 유지). 사용 중인 GPU의 MV3DT 지원 스트림 수(위 표 참조)가 카메라 수보다 적은 경우, perception / mdx-raw / mdx-bev는 지원되는 스트림 수만큼만 실행됩니다. 지원되는 스트림 수가 더 많은 GPU를 선택하거나, 사용자에게 상한선을 명시적으로 알려 어떤 스트림이 처리될지 알 수 있도록 해야 합니다.

4. 디스크상의 앱 데이터

VSS_DATA_DIR은 추출된 vss-warehouse-app-data 디렉터리 (리포지토리와 별도)를 가리켜야 합니다. 이 경로를 저장소의 deploy/docker/로 지정하면 배포가 중단됩니다. 구성 도구가 데이터셋을 찾을 수 없고, Redis가 로그 파일을 열 수 없으며, perception 상태가 'Created'에 머물러 있게 됩니다. 배포 전에 경로를 확인하십시오.

배포 전 사전 점검:

DATA_DIR="${VSS_DATA_DIR:?VSS_DATA_DIR이 .env에 설정되지 않음}"
DATASET="${SAMPLE_VIDEO_DATASET:-warehouse-4cams-20mx20m-synthetic}"

for sub in videos models data_log; do
  test -d "${DATA_DIR}/${sub}" || { echo "오류: ${DATA_DIR}/${sub}이(가) 없습니다"; exit 1; }
done

# sample / videos 모드의 경우 — videos 디렉터리가 존재해야 함
test -d "${DATA_DIR}/videos/${DATASET}" \
  || { echo "오류: ${DATA_DIR}/videos/${DATASET}이(가) 없습니다 — 슬러그가 잘못되었거나 앱 데이터가 추출되지 않았습니다"; exit 1; }

# 유효성 검사: 동영상 개수가 보정 개수와 일치해야 합니다.
# 공개된 일부 앱 데이터 타르볼의 경우, 데이터셋 이름에서 암시하는 것보다
# 적은 수의 동영상이 포함된 샘플 데이터셋이 제공되는 것으로 알려져 있습니다. GPU의 mv3dt 처리 능력이
# 모든 동영상을 사용할 수 있을 만큼 충분하다면, 누락된 캠을 별도로 확인하고 불러오십시오.
ls "${DATA_DIR}/videos/${DATASET}/"*.mp4 2>/dev/null | wc -l

# data_log/ 아래의 서비스별 하위 디렉터리가 모두 존재하는지 확인하십시오. kafka / elasticsearch /
# redis / postgres 및 비디오 분석 API 업로드 경로 (`/web-api-app/files`)
# 이 바인드 마운트에 대해 비루트 UID로 실행하십시오. 쓰기 권한이 없으면 데몬
# 또는 보정/이미지 가져오기 작업이 권한 오류로 실패할 수 있습니다.
mkdir -p \
  "${DATA_DIR}/data_log/analytics_cache" \
  "${DATA_DIR}/data_log/calibration_toolkit" \
  "${DATA_DIR}/data_log/elastic/data" \
  "${DATA_DIR}/data_log/elastic/logs" \
  "${DATA_DIR}/data_log/kafka" \
  "${DATA_DIR}/data_log/redis/data" \
  "${DATA_DIR}/data_log/redis/log" \
  "${DATA_DIR}/data_log/vss_video_analytics_api"

# 특정 컨테이너 UID에만 쓰기 권한을 부여 — 범위 지정 ACL을 사용하며, 777 권한이나
# chown 명령은 사용하지 마십시오. UID(data-directory.md 기준): postgres=70, redis=999, elasticsearch / VST /
# kafka=1000. 첫 번째 호출은 기존 파일을 처리하며, 두 번째 호출은 *기본* ACL을 설정하여
# 데몬이 실행 시 생성하는 파일/디렉터리(예: postgres PGDATA)가 해당 접근 권한을 상속받도록 합니다.
ACL='u:70:rwx,u:999:rwx,u:1000:rwx'
setfacl -R    -m "$ACL" "${DATA_DIR}/data_log"
setfacl -R -d -m "$ACL" "${DATA_DIR}/data_log"

chmod 777이 아닌 범위 지정 ACL입니다. 이는 알려진 컨테이너 UID에만 액세스 권한을 부여하며, data_log를 모든 사용자가 쓰기 가능하게만들지 않으며, chown을 수행하지도 않습니다 (chown을 수행하면 PostgreSQL이나 Elasticsearch가 첫 실행 시 디렉터리를 재할당하므로 문제가 발생합니다). 에이전트 기반 실행 및 공유 호스트에서는 이 방법을 우선적으로 사용하십시오. 표준 문서인 ../vss-deploy-profile/references/data-directory.md에는 광범위한 chmod -R 777 설정과 컨테이너별 UID 테이블이 설명되어 있지만, 이 스킬은 대신 범위 지정 ACL 방식을 사용합니다. 호스트 권한을 변경하기 전에 사용자에게 확인을 요청합니다.

POSIX-ACL 파일 시스템(ext4 / xfs — 기본값)과 acl 패키지(setfacl)가 필요합니다. 배포 후에도 데몬이 여전히 권한 오류를 기록한다면, 해당 데몬의 UID를 확인(`docker inspect --format '{{.Config.User}}'`)하고 두 호출 모두에 `-m u::rwx`를 추가하십시오.

app-data가 아직 추출되지 않은 경우: ngc 레지스트리 리소스를 통해 다음을 다운로드하십시오. download-version "nvidia/vss-warehouse/vss-warehouse-app-data: "을 통해 다운로드하고 tar -xvf 명령을 실행하십시오(태그 검색 및 전체 단계는 references/deploy-rtvi-cv-3d-stack.md를 참조하십시오).

5. 사전 점검 (시스템)

nvidia-smi, NVIDIA Docker 런타임 표시(docker info | grep -i runtimes) 및 docker run --rm --gpus all ubuntu:24.04 nvidia-smi가 모두 녹색으로 표시되어야 합니다. 드라이버/커널/sysctl에 대한 전체 확인 사항은 vss-deploy-profile/references/prerequisites.md에 나와 있습니다.

검사에서 실패한 항목이 있으면 계속 진행하기 전에 수정하십시오 — 배포를 진행하지 마십시오.

6. 브라우저 연결 가능성 (클라우드/기업 VPN 호스트만 해당)

사용자가 배포 호스트와 다른 네트워크(클라우드 VM, 기업 VPN, SSH 터널링 세션)의 브라우저를 통해 VST 비디오 월을 시청할 경우, 상류 방화벽 규칙으로 인해 VST WebRTC( stun.l.google.com:19302로의 STUN 및 미디어 전송을 위한 임의의 UDP)가 차단될 수 있습니다. 증상 및 해결 방법은 references/verify-and-view.md#browser-reachability를 참조하십시오. 또한, 일부 호스트는 AMC 마이크로서비스의 기본 포트(TCP/8010)를 차단하기도 합니다. 사용자가 :5000 포트의 AMC UI는 작동하지만 데이터 호출이 실패한다고 보고할 경우, 다른 VSS_AUTO_CALIBRATION_PORT 값을 사용하여 다시 시도해 보십시오.

문제 해결

배포, 보정 또는 검증 단계 중 어느 하나라도 실패할 경우, 재시도하기 전에 작업을 중지하고 오류 원인을 파악하십시오. 아래의 빠른 확인 절차는 가장 흔한 MV3DT 오류를 다룹니다. 전체 진단 명령어 및 해결 방법은 references/troubleshooting.md를, AMC 워크플로우 오류는 ../vss-generate-video-calibration/SKILL.md를, 더 광범위한 warehouse-stack 문제는 ../vss-deploy-profile/references/warehouse-debug.md를 참조하십시오.

증상 가능한 원인 첫 번째 확인 또는 해결 방법
vss-rtvi-cv-bev-fusion 상태가 비정상적이거나 /tmp/fusion_ready 파일이 없음 브로커가 준비되지 않았거나, MAX_EXPECTED_SENSORS가 일치하지 않거나, STREAM_TYPE이 일치하지 않음 broker-health-check, docker inspect --format '{{.State.Health.Status}}' vss-rtvi-cv-bev-fusion 및 mdx-raw / mdx-bev를 확인한 후, 스트림 수가 다를 경우 references/configure-cameras.md를 다시 실행하십시오
Perception에 표시된 활성 소스: 0, FPS 없음, 또는 예상보다 적은 카메라 수 VST 센서 상태가 오래된 경우, 잘못된 데이터셋 슬러그, 보정 데이터 누락, 또는 GPU별 스트림 제한 SAMPLE_VIDEO_DATASET, NUM_STREAMS, camInfo/ 및 VST 센서 목록을 확인하십시오. 오래된 센서가 남아 있는 경우, 재배포하기 전에 references/teardown.md의 지침을 따르십시오
vss-rtvi-cv-mv3dt가 MqttCommunicator "invalid node" 오류 또는 트래커 제출 실패로 종료되는 경우 동영상, calibration.json 및 camInfo/에 있는 카메라 이름이 Camera, Camera_01, ... 형식과 일치하지 않음 references/configure-cameras.md의 0단계에 따라 모든 카메라 이름을 표준화한 후, 오래된 VST 상태를 지우고 재배포하십시오
AMC 프로젝트 생성, 업로드, 보정 또는 MV3DT 내보내기가 실패합니다. 이 MV3DT 배포 경로 외부의 AutoMagicCalib 서비스/API 문제 ../vss-generate-video-calibration/SKILL.md를 사용하여 AMC를 배포/디버그한 후, 내보내기가 성공하면 references/calibration-workflow.md로 돌아가십시오
vss-behavior-analytics-mv3dt가 보정 스키마 유효성 검사 오류로 인해 재시작됩니다 AMC 내보내기에서 그룹, 영역 또는 위치 필드가 비어 있습니다 references/calibration-workflow.md의 4a단계에 있는 플레이스홀더 패치를 적용하거나, 내보내기 전에 AMC에서 해당 필드를 채우십시오
확장 프로필에 오버레이가 없고, vss-import-calibration-output-mv3dt에서 imageMetadata.json을 찾을 수 없다는 로그가 출력됩니다 . AMC MV3DT 내보내기에서 images/Top.png 및 images/imageMetadata.json 파일이 생성되지 않았습니다. references/calibration-workflow.md의 4b단계에 따라 두 파일을 모두 생성한 다음, 원샷 임포터를 다시 시작하십시오
이미지 가져오기, 모델 로딩 또는 첫 실행 시 엔진 빌드에 실패했습니다. NGC_CLI_API_KEY가 없거나 만료되었거나, VSS_DATA_IR이 잘못되었거나, BodyPose3DNet 파일이 없거나, GPU OOM 오류 NGC 인증을 재확인하고, ${VSS_DATA_DIR}/models/mv3dt/BodyPose3DNet/ 경로를 확인하며, vss-rtvi-cv-mv3dt 로그를 확인하고, GPU가 소진된 경우 RT_CV_DEVICE_ID를 해제하거나 변경하십시오

파괴적 복구(docker compose down -v, data_log 지우기, VST 센서 상태 삭제 또는 호스트 ACL 변경)를 수행하기 전에, 그 영향을 설명하고 사용자의 동의를 얻으십시오. 상태를 초기화하는 변경을 수행하기 전에 오류가 발생한 명령어, 관련 .env 값, docker compose ps 출력, 그리고 마지막 컨테이너 로그를 기록해 두십시오.

전체적인 구성

SKILL.md (이 파일 — Q0/Q1/Q2/Q3 라우팅)
  └─ 보정 데이터가 없는 경우 ─> calibration-workflow.md
  │                     └─ vss-generate-video-calibration으로 연결 (배포 + 드라이브 API)
  │                     └─ /v1/result/{project_id}/mv3dt_result?result_type=amc 가져오기 (정밀 조정 활성화 시 vggt 추가)
  │                     └─ 보정 파일을 warehouse-mv3dt-app/calibration/sample-data//에 저장
  ├─> configure-cameras.md (카메라 이름 정규화, NUM_STREAMS 동기화, VST 센서 트림)
  └─> deploy-rtvi-cv-3d-stack.md (bp_wh_kafka_mv3dt + extended/minimal을 사용하여 컴포즈 업)
        └─> verify-and-view.md (FPS, fusion_ready, mdx-bev, VST 비디오 월 + WebRTC 검사)

관련 스킬

  • vss-generate-video-calibration — AMC 스킬입니다. AMC 배포, RTSP 캡처, 보정 API 및 이 스킬이 사용하는 /v1/result/.../mv3dt_result 내보내기 훅을 관리합니다. calibration-workflow.md는 이 스킬로 연결됩니다.
  • vss-deploy-profile — 프로필 간 통합 관리 기능입니다. 사용자가 MV3DT뿐만 아니라 전체 웨어하우스 블루프린트 (에이전트 / LLM / VLM 포함)를 원하는 경우 이 기능을 대신 사용하십시오.
  • vss-manage-video-io-storage — VIOS/VST API 스킬입니다. VST 비디오 월(오버레이 시각화) 및 configure-cameras.md에서 참조되는 센서 관리에 유용합니다.

이 저장소의 공식 warehouse-blueprint 참조 문서 (../vss-deploy-profile/references/warehouse.md )는 전체 웨어하우스 스택 내의 2D / 3D / MV3DT를 다룹니다. 이 스킬은 에이전트 / LLM / VLM 계층을 제외한 MV3DT 전용 보조 스킬입니다.

GitHub에서 보기
---
name: vss-deploy-detection-tracking-3d
description: Deploy and operate the RTVI-CV-3D microservice for multi-camera 3D detection and tracking, supporting sample datasets, custom videos, and RTSP streams.
license: Apache-2.0
---

## Purpose

Deploy and operate the RTVI-CV-3D microservice as MV3DT (`MODE=mv3dt`) — per-camera DeepStream perception plus BEV Fusion over multiple calibrated cameras — on the bundled sample dataset, custom videos, or live RTSP, without the full warehouse agent / LLM / VLM stack.

## Instructions

Work top-to-bottom: answer the routing questions (Q0–Q3) under [Routing](#routing), then follow the reference for the chosen path. Detailed step-by-step procedures live in `references/` (deploy, calibration chain, camera configuration, verification, teardown, troubleshooting).

## Examples

- Enable multi-camera tracking on the sample dataset.
- Deploy RTVI-CV-3D on my videos here: `<path/to/videos>`.
- Run MV3DT on RTSP streams after calibration.

# VSS Deploy Detection & Tracking — 3D (RTVI-CV-3D / MV3DT)

Bring up the RTVI-CV-3D microservice as the MV3DT stack (`MODE=mv3dt`) from the warehouse blueprint: per-camera DeepStream perception (`vss-rtvi-cv-mv3dt`) + BEV Fusion (`vss-rtvi-cv-bev-fusion`) + mosquitto MQTT bus + broker + VST sensor stack — without the agent / LLM / VLM stack that comes with the full warehouse blueprint.

The actual compose machinery lives in `deploy/docker/industry-profiles/warehouse-operations/warehouse-mv3dt-app/`. This skill drives the env overrides, calibration chain, and verification.

## Routing

Ask the user **at most four questions**, then dispatch.

### Q0 — Profile size (overlays or not)

Default to **extended** unless the user explicitly asks for minimal. Extended deploys ELK + `vss-video-analytics-api-mv3dt` + `vss-kibana-init-mv3dt` + `vss-import-calibration-output-mv3dt` on top of MV3DT core — these are what the VST video wall needs to render bounding-box overlays. Without them, the video wall works but shows raw streams without overlays.

| User answer | `MINIMAL_PROFILE` | What you get | When to choose |
|---|---|---|---|
| **extended** (default) | `""` | MV3DT core + ELK + analytics API + Kibana. **Overlays work in VST video wall.** Recommended for a complete e2e experience. | "I want the full e2e experience", "I want to see bounding boxes", or no preference stated |
| **minimal** | `"true"` | MV3DT core only. ~5 fewer containers. **No overlays in VST.** Metadata still on Kafka/Redis. | "I only need the data", "edge / Thor host", "minimum footprint" |

> **Note on selective ELK:** there's no "minimal + ELK only" middle path in the current compose. Every `${MINIMAL_PROFILE:+_extended}`-gated service comes up together (ES, Logstash, Kibana, video-analytics-api, kibana-init, import-calibration). `bash`'s `:+` parameter expansion produces the `_extended` suffix when `MINIMAL_PROFILE` is set; extended switches the gating string back to plain `bp_wh_kafka_mv3dt` which the active compose profile already matches. Either you accept the full extended bundle or you stay minimal.

### Q1 — Data source

Ask this unless the source is explicit in the user's first message. A bare request
like "deploy rtvi-cv-3d" routes to this MV3DT skill (`MODE=mv3dt`), but does
**not** imply `sample`.

- **sample** — the bundled 4-camera synthetic dataset (`warehouse-4cams-20mx20m-synthetic`). Calibration ships in-tree; no AMC run needed.
- **videos** — the user has local video files (any `*.mp4` named after their cameras). Standalone AMC (`auto_calib` profile) will run if calibration is missing.
- **rtsp** — the user has live RTSP URLs. Calibration via VIOS-driven AMC; final deploy also needs a Sensor Info File (`camera_info.json`) with those RTSP URLs.

### Q2 — Calibration coverage (skip for `sample`)

For `videos` and `rtsp`, check whether calibration is already on disk at the mount path the perception container expects:

```bash
DATASET="${SAMPLE_VIDEO_DATASET:?}"          # the user's dataset slug; see Q3
CAL_DIR="${VSS_APPS_DIR}/industry-profiles/warehouse-operations/warehouse-mv3dt-app/calibration/sample-data/${DATASET}"

# Look for ANY of: calibration.json, plus camInfo/*.yml or *.yaml with either
# 'cam_*' or 'Camera*' naming (the shipped sample uses Camera*.yml, AMC may
# produce cam_*.yaml — broaden accordingly)
test -f "${CAL_DIR}/calibration.json" \
  && ls "${CAL_DIR}/camInfo/"*.{yml,yaml} 2>/dev/null
```

If the user supplied a calibration path themselves, validate that path instead — don't recompute. See `configure-cameras.md` for camera-name normalization and authoritative camera-count discovery (parses `calibration.json`).

### Q3 — Detector + dataset slug (only when Q2 triggers AMC)

- `resnet` (default, fast) or `transformer` (slower, better under occlusion) — passed to the AMC `/v1/calibrate/<id>` API at Step B (see `vss-generate-video-calibration/SKILL.md:48-62`).
- A short kebab-case dataset slug used as `SAMPLE_VIDEO_DATASET` (e.g. `customer-aisle-4cams`). This drives the calibration mount path and gets persisted in `.env`.

### Routing table

| Q1 | Q2 result | Path |
|---|---|---|
| `sample` | (cal ships in-tree and already normalized) | [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) directly |
| `videos` | cal present | [`references/configure-cameras.md`](references/configure-cameras.md) → [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) |
| `videos` | cal missing | [`references/calibration-workflow.md`](references/calibration-workflow.md) (videos mode) → [`references/configure-cameras.md`](references/configure-cameras.md) → [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) |
| `rtsp` | cal present | [`references/configure-cameras.md`](references/configure-cameras.md) → [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) |
| `rtsp` | cal missing | [`references/calibration-workflow.md`](references/calibration-workflow.md) (rtsp mode) → [`references/configure-cameras.md`](references/configure-cameras.md) → [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) |

Every path converges on [`references/verify-and-view.md`](references/verify-and-view.md) once `up -d` completes. [`references/troubleshooting.md`](references/troubleshooting.md) and [`references/teardown.md`](references/teardown.md) are linked but off the happy path.

**Disambiguation rule.** In this skill, "RTVI-CV-3D" means the MV3DT microservice deployment and uses `MODE=mv3dt`. Route to [`../vss-deploy-profile/references/warehouse.md`](../vss-deploy-profile/references/warehouse.md) only when the user asks for the full warehouse blueprint, Sparse4D, `MODE=3d`, or `warehouse-3d-app`. This skill is for **MV3DT only** without the agent stack / LLM / VLM.

## Prerequisites

### 1. Repo path

Locate `video-search-and-summarization/` on disk. All compose commands run from `<repo>/deploy/docker/`. If unknown, ask the user.

### 2. NGC CLI + key

`$NGC_CLI_API_KEY` must be set and must have access to `nvidia/vss-core/*` images. See `vss-deploy-profile/references/ngc.md` for setup if missing.

If the user previously ran `ngc config set` but `$NGC_CLI_API_KEY` isn't exported in this shell, the key is already on disk:

```bash
NGC_CLI_API_KEY=$(awk -F'= ' '/^apikey/{print $2}' ~/.ngc/config 2>/dev/null)
test -n "${NGC_CLI_API_KEY}" && echo "key sourced from ~/.ngc/config"
```

Make sure the key value also lands in `industry-profiles/warehouse-operations/.env:164` (`NGC_CLI_API_KEY=...`) — compose only reads it from there at `up` time, not from your shell env.

### 3. `HARDWARE_PROFILE` slug

> The public MV3DT supported stream counts are listed in the Warehouse Quickstart Guide under "MV3DT Vision AI Profile Supported Deployment Options." Use the matching `HARDWARE_PROFILE` slug below.

Pick from `nvidia-smi --query-gpu=name --format=csv,noheader`:

| GPU name | `HARDWARE_PROFILE` | MV3DT supported streams |
|---|---|---|
| RTX PRO 6000 Blackwell | `RTXPRO6000BW` | 18 |
| H100 (NVL, SXM HBM3) | `H100` | 13 |
| L40S | `L40S` | 7 |
| IGX Thor | `IGX-THOR` | 4 |
| DGX Spark | `DGX-SPARK` | 4 |

If the user's GPU is not listed here, check `industry-profiles/warehouse-operations/.env` for available `HARDWARE_PROFILE` values, then confirm the matching profile exists in `blueprint-configurator/blueprint_config.yml` before using it. Do not infer a stream count from the slug alone.

**The per-GPU MV3DT cap is enforced at deploy time.** `vss-configurator-mv3dt` computes `final_stream_count = min(NUM_STREAMS, max_streams_supported)` and applies a `keep_count` file-management op against `${VSS_DATA_DIR}/videos/${SAMPLE_VIDEO_DATASET}/` so only `final_stream_count` `.mp4` files remain (sorted lexicographically, last N kept). If your GPU's MV3DT supported stream count (above table) is below your camera count, perception / `mdx-raw` / `mdx-bev` run with the supported stream count. Either pick a GPU with a higher supported stream count or surface the cap explicitly to the user so they're aware which streams will be processed.

### 4. App data on disk

`VSS_DATA_DIR` must point at the **extracted `vss-warehouse-app-data` directory** (separate from the repo). Pointing it at the repo's `deploy/docker/` causes the deploy to stall: the configurator can't find the dataset, redis can't open its log file, and perception stays in `Created`. Verify the path before deploy.

Pre-flight check before deploy:

```bash
DATA_DIR="${VSS_DATA_DIR:?VSS_DATA_DIR not set in .env}"
DATASET="${SAMPLE_VIDEO_DATASET:-warehouse-4cams-20mx20m-synthetic}"

for sub in videos models data_log; do
  test -d "${DATA_DIR}/${sub}" || { echo "ERROR: ${DATA_DIR}/${sub} missing"; exit 1; }
done

# For sample / videos modes — videos directory must exist
test -d "${DATA_DIR}/videos/${DATASET}" \
  || { echo "ERROR: ${DATA_DIR}/videos/${DATASET} missing — wrong slug or app-data not extracted"; exit 1; }

# Sanity: video count should match calibration count.
# Some published app-data tarballs are known to ship the sample dataset with
# fewer videos than the dataset name implies — verify and source any missing
# cams separately if your GPU's mv3dt cap is high enough to use them all.
ls "${DATA_DIR}/videos/${DATASET}/"*.mp4 2>/dev/null | wc -l

# Ensure every per-service subdir under data_log/ exists. kafka / elasticsearch /
# redis / postgres and the video-analytics API upload path (`/web-api-app/files`)
# run as non-root UIDs against these bind mounts. Without write access the daemons
# or calibration/image import can fail with permission errors.
mkdir -p \
  "${DATA_DIR}/data_log/analytics_cache" \
  "${DATA_DIR}/data_log/calibration_toolkit" \
  "${DATA_DIR}/data_log/elastic/data" \
  "${DATA_DIR}/data_log/elastic/logs" \
  "${DATA_DIR}/data_log/kafka" \
  "${DATA_DIR}/data_log/redis/data" \
  "${DATA_DIR}/data_log/redis/log" \
  "${DATA_DIR}/data_log/vss_video_analytics_api"

# Grant write access to the specific container UIDs only — scoped ACLs, NOT 777 and
# NOT chown. UIDs (per data-directory.md): postgres=70, redis=999, elasticsearch / VST /
# kafka=1000. The first call covers existing files; the second sets *default* ACLs so
# files/dirs the daemons create at runtime (e.g. postgres PGDATA) inherit the access.
ACL='u:70:rwx,u:999:rwx,u:1000:rwx'
setfacl -R    -m "$ACL" "${DATA_DIR}/data_log"
setfacl -R -d -m "$ACL" "${DATA_DIR}/data_log"
```

> **Scoped ACLs, not `chmod 777`.** This grants only the known container UIDs access — it does
> **not** make `data_log` world-writable, and it does **not** `chown` (which would break postgres /
> Elasticsearch, since they re-own their dirs on first start). Prefer this for agent-driven runs and
> shared hosts. The canonical [`../vss-deploy-profile/references/data-directory.md`](../vss-deploy-profile/references/data-directory.md)
> documents the broad `chmod -R 777` and the per-container UID table; this skill uses the scoped-ACL
> equivalent instead. **Ask the user for confirmation before changing host permissions.**
>
> Requires a POSIX-ACL filesystem (ext4 / xfs — the default) and the `acl` package (`setfacl`). If a
> daemon still logs a permission error after deploy, find its UID
> (`docker inspect <container> --format '{{.Config.User}}'`) and add `-m u:<uid>:rwx` to both calls.

If app-data isn't extracted yet: download via `ngc registry resource download-version "nvidia/vss-warehouse/vss-warehouse-app-data:<version>"` and `tar -xvf` (see [`references/deploy-rtvi-cv-3d-stack.md`](references/deploy-rtvi-cv-3d-stack.md) for tag discovery and full steps).

### 5. Pre-flight (system)

`nvidia-smi`, NVIDIA Docker runtime visible (`docker info | grep -i runtimes`), and `docker run --rm --gpus all ubuntu:24.04 nvidia-smi` all green. Full driver / kernel / sysctl checks live in `vss-deploy-profile/references/prerequisites.md`.

If any check fails, fix before continuing — don't proceed to deploy.

### 6. Browser reachability (cloud / corp-VPN hosts only)

If the user will view the VST video wall through a browser on a different network than the deploy host (cloud VM, corp VPN, ssh-tunnelled session), upstream firewall rules may block VST WebRTC (STUN to `stun.l.google.com:19302`, plus random UDP for media). See [`references/verify-and-view.md#browser-reachability`](references/verify-and-view.md) for symptoms and workarounds. Also: some hosts block the AMC microservice's default port (TCP/8010); if the user reports the AMC UI on `:5000` works but its data calls fail, retry with a different `VSS_AUTO_CALIBRATION_PORT`.

## Troubleshooting

When any deploy, calibration, or verification step fails, stop and classify the failure before retrying. The quick checks below cover the most common MV3DT errors; use [`references/troubleshooting.md`](references/troubleshooting.md) for full diagnostic commands and fixes, [`../vss-generate-video-calibration/SKILL.md`](../vss-generate-video-calibration/SKILL.md) for AMC workflow failures, and [`../vss-deploy-profile/references/warehouse-debug.md`](../vss-deploy-profile/references/warehouse-debug.md) for broader warehouse-stack issues.

| Symptom | Likely cause | First check or fix |
|---|---|---|
| `vss-rtvi-cv-bev-fusion` is unhealthy or `/tmp/fusion_ready` is missing | Broker not ready, `MAX_EXPECTED_SENSORS` mismatch, or `STREAM_TYPE` mismatch | Check `broker-health-check`, `docker inspect --format '{{.State.Health.Status}}' vss-rtvi-cv-bev-fusion`, and `mdx-raw` / `mdx-bev`; then re-run [`references/configure-cameras.md`](references/configure-cameras.md) if stream counts differ |
| Perception shows `Active sources : 0`, no FPS, or fewer cameras than expected | Stale VST sensor state, wrong dataset slug, missing calibration, or per-GPU stream cap | Verify `SAMPLE_VIDEO_DATASET`, `NUM_STREAMS`, `camInfo/`, and the VST sensor list; if old sensors remain, follow [`references/teardown.md`](references/teardown.md) before redeploying |
| `vss-rtvi-cv-mv3dt` exits with `MqttCommunicator` "invalid node" or tracker submit failures | Camera names in videos, `calibration.json`, and `camInfo/` do not match the `Camera`, `Camera_01`, ... convention | Normalize all camera names together with [`references/configure-cameras.md`](references/configure-cameras.md) Step 0, then clear stale VST state and redeploy |
| AMC project creation, upload, calibration, or MV3DT export fails | AutoMagicCalib service/API issue outside this MV3DT deploy path | Use [`../vss-generate-video-calibration/SKILL.md`](../vss-generate-video-calibration/SKILL.md) to deploy/debug AMC, then return to [`references/calibration-workflow.md`](references/calibration-workflow.md) after export succeeds |
| `vss-behavior-analytics-mv3dt` restarts with calibration schema validation errors | AMC export has empty `group`, `region`, or `place` fields | Apply the placeholder patch in [`references/calibration-workflow.md`](references/calibration-workflow.md) Step 4a, or populate those fields in AMC before export |
| Extended profile has no overlays and `vss-import-calibration-output-mv3dt` logs `imageMetadata.json not found` | AMC MV3DT export did not produce `images/Top.png` and `images/imageMetadata.json` | Synthesize both files with [`references/calibration-workflow.md`](references/calibration-workflow.md) Step 4b, then restart the one-shot importer |
| Image pulls, model load, or first-start engine build fail | Missing / expired `NGC_CLI_API_KEY`, incorrect `VSS_DATA_DIR`, missing BodyPose3DNet files, or GPU OOM | Re-check NGC auth, confirm `${VSS_DATA_DIR}/models/mv3dt/BodyPose3DNet/`, tail `vss-rtvi-cv-mv3dt` logs, and free or change `RT_CV_DEVICE_ID` if the GPU is exhausted |

Before destructive recovery (`docker compose down -v`, clearing `data_log`, deleting VST sensor state, or changing host ACLs), explain the impact and get user confirmation. Capture the failing command, relevant `.env` values, `docker compose ps`, and the last container logs before making state-reset changes.

## How it fits together

```
SKILL.md (this file — Q0/Q1/Q2/Q3 routing)
  └─ if cal missing ─> calibration-workflow.md
  │                     └─ chains to vss-generate-video-calibration (deploy + drive API)
  │                     └─ fetches /v1/result/{project_id}/mv3dt_result?result_type=amc (plus vggt when refinement is enabled)
  │                     └─ lands calibration files at warehouse-mv3dt-app/calibration/sample-data/<slug>/
  ├─> configure-cameras.md (camera-name normalization, NUM_STREAMS sync, VST sensor trim)
  └─> deploy-rtvi-cv-3d-stack.md (compose up with bp_wh_kafka_mv3dt + extended/minimal)
        └─> verify-and-view.md (FPS, fusion_ready, mdx-bev, VST video wall + WebRTC checks)
```

## Related Skills

- [`vss-generate-video-calibration`](../vss-generate-video-calibration/SKILL.md) — the AMC skill. Owns AMC deployment, RTSP capture, calibration API, and the `/v1/result/.../mv3dt_result` export hook this skill consumes. `calibration-workflow.md` chains into it.
- [`vss-deploy-profile`](../vss-deploy-profile/SKILL.md) — cross-profile umbrella. Use that instead when the user wants the **full warehouse blueprint** (with agents / LLM / VLM), not just MV3DT.
- [`vss-manage-video-io-storage`](../vss-manage-video-io-storage/SKILL.md) — VIOS / VST API skill. Useful for the VST video wall (overlay viz) and for sensor management referenced in `configure-cameras.md`.

The repo's authoritative warehouse-blueprint reference at [`../vss-deploy-profile/references/warehouse.md`](../vss-deploy-profile/references/warehouse.md) covers 2D / 3D / MV3DT inside the full warehouse stack — this skill is the **MV3DT-only** companion that trims the agent / LLM / VLM layer.

vss-deploy-detection-tracking-3d 설치

스킬 파일을 다운로드하여 .claude/skills/ 디렉터리에 압축을 풀어주세요.

ZIP 다운로드

저장소를 클론하고 스킬 파일을 프로젝트에 복사하세요.

git clone https://github.com/NVIDIA/skills/tree/main/skills/vss-deploy-detection-tracking-3d # Copy SKILL.md to your .claude/skills/ directory

복사 복사
빠른 설정: 스킬 폴더를 .claude/skills/로 복사하세요. Claude가 해당 스킬을 자동으로 감지하여 사용할 것입니다.
저장소 NVIDIA/skills

관련 스킬

klingai-upgrade-migration
업데이트 된 시간 2026년 7월 3일
Verification &amp; Quality Assurance
업데이트 된 시간 2026년 6월 29일
base44-cli
업데이트 된 시간 2026년 6월 29일
Railway CLI Management
업데이트 된 시간 2026년 7월 2일
OR