Skip to content

Latest commit

Β 

History

History
117 lines (100 loc) Β· 3.65 KB

File metadata and controls

117 lines (100 loc) Β· 3.65 KB

SafeView FastAPI Server

μ‹€μ‹œκ°„ μ˜μƒ 비식별화(μ–Όκ΅΄/번호판 λͺ¨μžμ΄ν¬)와 μžλ™ λ…Ήν™”/μ—…λ‘œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” FastAPI 기반 μ„œλ²„μž…λ‹ˆλ‹€. WebSocket으둜 μ˜μƒμ„ λ°›μ•„ λͺ¨μžμ΄ν¬ 처리 ν›„ μŠ€νŠΈλ¦¬λ°ν•˜κ³ , 쑰건에 따라 처리본/원본을 λ™μ‹œμ— λ…Ήν™”ν•©λ‹ˆλ‹€. κ²°κ³ΌλŠ” S3에 μ—…λ‘œλ“œλ˜λ©° μ™„λ£Œ μ‹œ Spring μ„œλ²„μ— μ½œλ°±μ„ λ³΄λƒ…λ‹ˆλ‹€. μ˜€ν”„λΌμΈ μ˜μƒμ— λŒ€ν•΄ νŠΉμ • μ‹œκ°„ κ΅¬κ°„μ˜ 얼꡴을 μΆ”μΆœν•˜λŠ” API도 ν¬ν•¨λ©λ‹ˆλ‹€.

μžμ„Έν•œ ꡬ쑰와 λ™μž‘ 흐름은 docs/ARCHITECTURE.md μ°Έκ³ .

μ£Όμš” κΈ°λŠ₯

  • WebSocket μ‹€μ‹œκ°„ μž…λ ₯ + λͺ¨μžμ΄ν¬ 슀트리밍 (JPEG 전솑, FPS μ œν•œ, μ½”μ–Όλ ˆμ‹±)
  • μ˜†λͺ¨μŠ΅ 지속 λͺ¨μžμ΄ν¬: 머리 좔적(IoU+TTL) + HOG 보쑰
  • μžλ™ λ…Ήν™”: 처리본/원본 이쀑 μ €μž₯, presence 히트 & λΆ€μž¬ νƒ€μž„μ•„μ›ƒ 기반 μ‹œμž‘/쀑단
  • S3 μ—…λ‘œλ“œ 및 둜컬 폴백, Spring 콜백으둜 URL 전달
  • μ‹œκ°„ 기반 μ–Όκ΅΄ κ²€μΆœ API: 파일 μ—…λ‘œλ“œ, blob/data URL, http(s), S3 지원

λΉ λ₯Έ μ‹€ν–‰ μš”μ•½

git clone https://github.com/SafeView/Python_AI.git
cd Python_AI
curl -LsSf https://astral.sh/uv/install.sh | sh  # λ˜λŠ” brew install uv
uv sync
uv run uvicorn server.app:app --host 0.0.0.0 --port 8000
# λ˜λŠ”
uv run python http_video_server.py

server.app:app 직접 μ‹€ν–‰ ν˜Ήμ€ http_video_server.py 둜 μ§„μž….

기술 μŠ€νƒ

  • Python 3.10 ~ < 3.13
  • FastAPI / Uvicorn
  • OpenCV, MediaPipe, YOLO(ultralytics)
  • aiohttp, boto3
  • uv νŒ¨ν‚€μ§€/μ‹€ν–‰ 관리

사전 μ€€λΉ„

  1. Python 버전 확인 (python --version)
  2. uv μ„€μΉ˜ (μ—†λ‹€λ©΄ μœ„ μš”μ•½ μ°Έμ‘°)
  3. (선택) .venv/ μžλ™ 생성 (uv sync μ‹œ)

μ„€μΉ˜ (uv ꢌμž₯)

uv sync

νŒ¨ν‚€μ§€ μΆ”κ°€: uv add νŒ¨ν‚€μ§€λͺ…

(λŒ€μ•ˆ) pip

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

μ‹€ν–‰

uv run python http_video_server.py
# λ˜λŠ”
uv run uvicorn http_video_server:app --host 0.0.0.0 --port 8000

닀쀑 μ›Œμ»€ μ‚¬μš© μ‹œ μ „μ—­ μƒνƒœ 곡유 λΆˆκ°€.

WebSocket μ‚¬μš© 흐름

  1. ws://{host}:{port}/ws/video μ—°κ²°
  2. JPEG ν”„λ ˆμž„ 전솑
  3. λͺ¨μžμ΄ν¬ 처리 ν›„ JPEG μˆ˜μ‹ 
  4. μžλ™ λ…Ήν™” 이벀트 λ©”μ‹œμ§€ μˆ˜μ‹ 

μžλ™ λ…Ήν™” μš”μ•½

쑰건 μ„€λͺ…
μ‹œμž‘ pcnt >= AUTO_RECORD_THRESHOLD AND presence 히트 μΆ©μ‘±
쀑단 연속 λΆ€μž¬ μ‹œκ°„ β‰₯ AUTO_ZERO_TIMEOUT_SEC
메타 μ΅œλŒ€ 인원 _recording_max_persons 기둝

μ£Όμš” μ—”λ“œν¬μΈνŠΈ

λ©”μ†Œλ“œ 경둜 μ„€λͺ…
GET /health ν—¬μŠ€ 체크
WS /ws/video μ‹€μ‹œκ°„ 슀트림
POST /start_recording μˆ˜λ™ λ…Ήν™” μš”μ²­
POST /stop_recording λ…Ήν™” 쀑단
GET /recording_status λ…Ήν™” μƒνƒœ
GET /recordings λ…Ήν™” λͺ©λ‘
POST /face-detection/upload-video μ˜€ν”„λΌμΈ μ—…λ‘œλ“œ
POST /face-detection/detect-faces νŠΉμ • μ‹œμ  μ–Όκ΅΄ μΆ”μΆœ

디렉토리 κ°œμš”

server/
  app.py
  websocket_stream.py
  recording.py
  verification.py
  face_time_api.py
  core/state.py
  analytics/person_count.py
AI_processor.py
http_video_server.py
docs/ARCHITECTURE.md

개발 μ›Œν¬ν”Œλ‘œ

uv add some-package
uv run python -c "import requests;print(requests.get('http://localhost:8000/health').json())"

문제 ν•΄κ²°

증상 쑰치
μžλ™ λ…Ήν™” μ‹œμž‘ μ•ˆ 됨 μž„κ³„/히트 μ‘°μ •, DETECT_EVERY_N=1 ν…ŒμŠ€νŠΈ
VideoWriter μ‹€νŒ¨ 코덱 지원 확인, MJPG 폴백 둜그 확인
S3 μ—…λ‘œλ“œ μ‹€νŒ¨ 자격/κΆŒν•œ 및 ꡬ성 점검
μ‚¬λžŒ 수 0 지속 μ‘°λͺ…/해상도/λͺ¨λΈ μ„€μ • μ‘°μ •

λΌμ΄μ„ μŠ€

(λ‚΄λΆ€ 정책에 따라 μ§€μ • μ˜ˆμ •)


μ΄μŠˆλ‚˜ κ°œμ„  μš”μ²­ ν™˜μ˜.