deep-park-test.deep-i.org›
고객사 검증 환경›
고객사
추적 차량
–
빈 주차면
–
점유율
–
분석 지연
–
처리 속도
–
누적 이벤트
0
--
카메라를 선택하고 재생을 누르세요.
검증 영상 선택한 순서대로 이어서 재생
클립 더블클릭 = 추적 상태 초기화 후 그 클립 첫 프레임부터 다시 분석 (▶ 표시 = 현재 분석 중인 클립)
주차면 상태
| ROI | 상태 | 차량 | 진입 중 | 머문 시간 (시:분:초) |
|---|
이벤트 로그
연동 방식 요약 고객사 주차관제 프로그램이 분석 결과를 받는 방법
영상 입력고객사가 프레임을 보내지 않습니다. 엔진이 CCTV 의 RTSP 주소(검증 환경에서는 전달받은 영상 파일)에 직접 붙어 영상을 읽습니다.
설정주차면 ROI 는 이 화면의 ROI 설정에서 그리거나, 고객사 프로그램이 REST 로 좌표를 보내 저장합니다. 분석 시작 / 정지도 명령 한 줄입니다.
결과 수신고객사 프로그램은 WebSocket 으로 프레임별 결과 JSON(차량 id · 박스 · 중심좌표 · 주차면 상태 · 진입 / 이탈 / 점유 이벤트)을 받기만 하면 됩니다.
REST API http://
| Method | Path | 설명 |
|---|---|---|
| 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
(재생하면 여기에 실제 메시지가 표시됩니다)