์ค์๊ฐ ์์ ๋น์๋ณํ(์ผ๊ตด/๋ฒํธํ ๋ชจ์์ดํฌ)์ ์๋ ๋ นํ/์ ๋ก๋๋ฅผ ์ ๊ณตํ๋ 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.pyserver.app:app ์ง์ ์คํ ํน์ http_video_server.py ๋ก ์ง์ .
- Python 3.10 ~ < 3.13
- FastAPI / Uvicorn
- OpenCV, MediaPipe, YOLO(ultralytics)
- aiohttp, boto3
- uv ํจํค์ง/์คํ ๊ด๋ฆฌ
- Python ๋ฒ์ ํ์ธ (
python --version) - uv ์ค์น (์๋ค๋ฉด ์ ์์ฝ ์ฐธ์กฐ)
- (์ ํ)
.venv/์๋ ์์ฑ (uv sync ์)
uv syncํจํค์ง ์ถ๊ฐ: uv add ํจํค์ง๋ช
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtuv run python http_video_server.py
# ๋๋
uv run uvicorn http_video_server:app --host 0.0.0.0 --port 8000๋ค์ค ์์ปค ์ฌ์ฉ ์ ์ ์ญ ์ํ ๊ณต์ ๋ถ๊ฐ.
ws://{host}:{port}/ws/video์ฐ๊ฒฐ- JPEG ํ๋ ์ ์ ์ก
- ๋ชจ์์ดํฌ ์ฒ๋ฆฌ ํ JPEG ์์
- ์๋ ๋ นํ ์ด๋ฒคํธ ๋ฉ์์ง ์์
| ์กฐ๊ฑด | ์ค๋ช |
|---|---|
| ์์ | 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 ์ง์ | ์กฐ๋ช /ํด์๋/๋ชจ๋ธ ์ค์ ์กฐ์ |
(๋ด๋ถ ์ ์ฑ ์ ๋ฐ๋ผ ์ง์ ์์ )
์ด์๋ ๊ฐ์ ์์ฒญ ํ์.