deep-park-test.deep-i.org 고객사 검증 환경 고객사
대기 검증 진행 중
분석 옵션
추적 차량
빈 주차면
점유율
분석 지연
처리 속도
누적 이벤트
0
--
카메라를 선택하고 재생을 누르세요.
검증 영상 선택한 순서대로 이어서 재생
클립 더블클릭 = 추적 상태 초기화 후 그 클립 첫 프레임부터 다시 분석 (▶ 표시 = 현재 분석 중인 클립)
주차면 상태
ROI상태차량진입 중머문 시간 (시:분:초)
이벤트 로그
연동 방식 요약 고객사 주차관제 프로그램이 분석 결과를 받는 방법
영상 입력고객사가 프레임을 보내지 않습니다. 엔진이 CCTV 의 RTSP 주소(검증 환경에서는 전달받은 영상 파일)에 직접 붙어 영상을 읽습니다.
설정주차면 ROI 는 이 화면의 ROI 설정에서 그리거나, 고객사 프로그램이 REST 로 좌표를 보내 저장합니다. 분석 시작 / 정지도 명령 한 줄입니다.
결과 수신고객사 프로그램은 WebSocket 으로 프레임별 결과 JSON(차량 id · 박스 · 중심좌표 · 주차면 상태 · 진입 / 이탈 / 점유 이벤트)을 받기만 하면 됩니다.
REST API http://
MethodPath설명
GET/api/project검증 프로젝트 · 요구사항 체크리스트
GET/api/engine엔진 버전 · GPU
GET/api/scenes카메라(시나리오) 목록 · 클립 정보
GET/api/scenes/{n}/rois주차면 ROI 조회
PUT/api/scenes/{n}/rois주차면 ROI 저장 (파일에 영구 저장)
GET/api/scenes/{n}/preview.jpg?clip=&frame=정지 프레임
GET/api/models분석 모델 목록
GET/api/state마지막 분석 결과 (frame 메시지와 동일)
WebSocket ws:///ws
방향메시지설명
{"cmd":"start","scene":1,"clips":[...],"model":"...","stride":3,"method":"nearest_iou",...}분석 시작
{"cmd":"pause"} {"cmd":"resume"} {"cmd":"stop"}제어
{"cmd":"seek","pos":N} {"cmd":"next"} {"cmd":"prev"}탐색
{"cmd":"reload_rois"}저장된 ROI 즉시 반영
{"type":"info"} {"type":"status"} {"type":"rois"} {"type":"end"} {"type":"error"}스트림 상태
{"type":"frame", ...} + binary JPEG프레임별 분석 결과 (아래 형식)

현장 RTSP 카메라 입력 시에도 같은 메시지 형식으로 전달됩니다. 고객사 프로그램은 frame / event JSON 만 소비하면 되고, 영상 프레임을 보낼 필요가 없습니다.

frame 메시지 형식
{
  "type": "frame", "sid": "…", "scene": 1,
  "clip": "1_001_0.mp4", "frame": 483, "pos": 483, "time": "00:16.1",
  "infer_ms": 62.4,
  "vehicles": [
    { "id": 7,                  // track id (사라진 뒤에도 'ID 유지' 시간 동안 유지)
      "cls": "vehicle",         // car / bus / truck 을 단일 객체로 취급 (이륜차 제외)
      "cls_raw": "car", "conf": 0.93,
      "visible": true,          // false = 시야에서 사라졌지만 id · 마지막 정보 유지 중
      "lost_sec": 0,            // 사라진 뒤 경과 시간(초)
      "box": [x1, y1, x2, y2],  // bounding box (원본 해상도 px)
      "center": [cx, cy],       // 중심좌표
      "foot": [x1, y1, x2, y2], // 바닥 footprint
      "trail": [[x, y], ...],   // 이동 경로 (최근 N점)
      "heading": [dx, dy],      // 진행 방향 벡터
      "roi": "P3" }             // 배정된 주차면 (없으면 null)
  ],
  "spaces": [ { "id": "P3", "state": "FULL", "vehicle": 7, "inside": 7,
                "dwell_sec": 135.2 } ],   // 차량이 들어온 뒤 머문 시간(초)
  "events": [ { "time": "00:16.1", "roi": "P3", "event": "ENTER|EXIT|FULL|EMPTY", "vehicle": 7 } ],
  "free": 4, "total_spaces": 7
}
외부 프로그램 연동 예시 Python · web/client_example.py
import json, requests, websockets, asyncio

HOST = "localhost:8000"
scenes = requests.get(f"http://{HOST}/api/scenes").json()          # 카메라 · 클립 목록
rois   = requests.get(f"http://{HOST}/api/scenes/1/rois").json()   # 주차면 ROI

async def main():
    async with websockets.connect(f"ws://{HOST}/ws", max_size=2**24) as ws:
        await ws.send(json.dumps({"cmd": "start", "scene": 1, "clips": ["1_001_0.mp4"],
                                  "model": "vehicle-pro", "stride": 3, "keep_sec": 30}))
        while True:
            msg = await ws.recv()
            if isinstance(msg, bytes):            # JPEG 프레임 (필요 없으면 무시)
                continue
            m = json.loads(msg)
            if m["type"] == "frame":
                for e in m["events"]:             # ENTER / EXIT / FULL / EMPTY
                    print(m["clip"], e["time"], e["roi"], e["event"], "vehicle", e["vehicle"])
                for v in m["vehicles"]:           # id, box, center, visible, lost_sec, roi ...
                    pass
asyncio.run(main())
실시간 수신 메시지 마지막 frame
(재생하면 여기에 실제 메시지가 표시됩니다)