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 ์ง€์† ์กฐ๋ช…/ํ•ด์ƒ๋„/๋ชจ๋ธ ์„ค์ • ์กฐ์ •

๋ผ์ด์„ ์Šค

(๋‚ด๋ถ€ ์ •์ฑ…์— ๋”ฐ๋ผ ์ง€์ • ์˜ˆ์ •)


์ด์Šˆ๋‚˜ ๊ฐœ์„  ์š”์ฒญ ํ™˜์˜.