CCTV/์์ ํ์ฅ ์์์์ ์์ ์๋ฐ์ ์๋์ผ๋ก ์ฐพ์๋ด๊ณ , ์ํ๋ ์์ผ๋ก ์ฐ์ ์์๋ฅผ ๋งค๊ธฐ๊ณ , ์ฌ๋์ด ๋ฐ๋ก ์ดํดํ ์ ์๋ ๋ฌธ์ฅ์ผ๋ก ์ค๋ช ํด์ฃผ๋ ์์ ๊ด๋ฆฌ์์ฉ ์์ฌ๊ฒฐ์ ๋ณด์กฐ ์๋น์ค์ ๋๋ค.
ํ์ฅ์ ์นด๋ฉ๋ผ๊ฐ ๋ง์๋ ์์ ๊ด๋ฆฌ์๋ ๋ณดํต ํ๋ ๋ช ์ ๋๋ค. ํ ํ๋ฉด์ ๋ณด๋ ์ฌ์ด ๋ค๋ฅธ ํ๋ฉด์์ ํฌ๋ฉง ์์ด ํฌ๋ ์ธ ๋ฐ์ ์ง๋๊ฐ๋ ์ฌ๋์ด ์์ด๋ ๋์น๊ณ , ๊ฒฐ๊ตญ ์ฌ๊ณ ๊ฐ ๋ ๋ค์์ผ CCTV๋ฅผ ๋๋๋ ค๋ณด๊ณ ํ์ธํ๋ ์ผ์ด ๋ฐ๋ณต๋ฉ๋๋ค. ์ค์๊ฐ ํ์ง ์์คํ ์ด ์์ด๋ ํฌ๊ฒ ๋ฌ๋ผ์ง์ง ์์ต๋๋ค. ํฌ๋ ์ธ ๊ตฌ์ญ์์ ํฌ๋ฉง ๋ฏธ์ฐฉ์ฉ์๊ฐ ๋จ๋ ๋์์ ์ผ๋ฐ ํต๋ก์์ ์กฐ๋ผ ๋ฏธ์ฐฉ์ฉ์๋ ๋จ๋ฉด, ๊ฒฐ๊ตญ ์ฌ๋์ด ๋ ์ค ๋ญ ๋จผ์ ํ์ธํ ์ง ํ๋จํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. SEEN์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ ๋ฐ์ ๊ทธ์น์ง ์๊ณ , ์ํ๋ ์์ผ๋ก ์ ๋ฆฌํด์ ๋ฐ๋ก ์ฝ์ ์ ์๋ ๋ฌธ์ฅ์ผ๋ก ์์ฝํด์ค๋๋ค.
- ์ค์๊ฐ ํ์ง โ ์น์บ /CCTV ์คํธ๋ฆผ์์ ์ฌ๋ยทํฌ๋ฉงยท์กฐ๋ผ๋ฅผ ๋งค ํ๋ ์ ํ์งํ๊ณ ํ๋ฉด์ ๋ฐ๋ก ํ์
- ์ํ๋ ์๋ ์ค์ฝ์ด๋ง โ ๊ตฌ์ญ ๊ฐ์ค์นยท์ง์์๊ฐยท๋์ ์๋ฐ์ ์๋ฅผ ๋ฐ์ํด ์๋ฐ ์ฐ์ ์์๋ฅผ ๊ณ์ฐ
- ์์ฐ์ด ๋ฆฌํฌํธ โ ์๋ฐ ์ํฉ์ ์ค๋ช ํ๋ ์บก์ ๊ณผ ์กฐ์น ๊ถ๊ณ ๋ฌธ๊ตฌ๋ฅผ VLM/LLM์ผ๋ก ์๋ ์์ฑ
- ๊ตฌ์ญ ์ค์ โ ์บ๋ฒ์ค์ ํด๋ฆญ๋ง์ผ๋ก ๊ฐ์ ๊ตฌ์ญ์ ๊ทธ๋ฆฌ๊ณ ๊ตฌ์ญ๋ณ ์ํ ๊ฐ์ค์น ์ง์
- ์๋ฐ ๋์๋ณด๋ โ ๊ฐ์ง๋ ์๋ฐ์ ์ต์ ์/์ํ๋์์ผ๋ก ํํฐ๋งยท์กฐํยท์ญ์
- ์ค์น ์๋ ์น UI โ ๋ธ๋ผ์ฐ์ ๋ง ์์ผ๋ฉด ๋ณ๋ ํด๋ผ์ด์ธํธ ์์ด ๋ฐ๋ก ์ฌ์ฉ
๊ฐ์ง๋๋ ์ด๋ฒคํธ๋ ๋ ์ข ๋ฅ์ ๋๋ค.
- ์ฅ๋น ์๋ฐ(no_helmet/no_vest) โ ๊ตฌ์ญ๋ณ ์ํ ๊ฐ์ค์นยท์ง์์๊ฐยท๋์ ์๋ฐ์ ์๋ฅผ ๋ฐ์ํด ์ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ํ๋ = ๊ธฐ๋ณธ ์ฌ๊ฐ๋ ร ๊ตฌ์ญ ๊ฐ์ค์น ร ์ง์์๊ฐ ๋ฐฐ์ ร ๋์ ์๋ฐ์ ๋ฐฐ์
- ๊ตฌ์ญ ์ง์ ๊ฐ์ง(zone_entry) โ ์ฌ๋์ด ๊ตฌ์ญ์ ๋ค์ด์ค๋ ์ฆ์ ๋ฎ์ ์ํ๋๋ก ํ ๋ฒ ๊ธฐ๋ก๋ฉ๋๋ค. ์ง์์๊ฐ ์กฐ๊ฑด์ ์์ต๋๋ค.
YOLO ํ์ง๋ ๋งค ํ๋ ์ ์ค์๊ฐ์ผ๋ก ๋๊ณ , VLM ์บก์ ๊ณผ LLM ๊ถ๊ณ ๋ ์ ์๋ฐ์ด ๋ฐ ๋๋ง ํธ์ถํฉ๋๋ค.
๊ณต๊ฐ PPE ๋ฐ์ดํฐ์ 3์ข ์ ์กฐํฉํด ํ์ตํ์ต๋๋ค. ์ด๋ฏธ์งยท๋ผ๋ฒจ์ ์ฉ๋ ๋ฌธ์ ๋ก ๋ ํฌ์ ํฌํจํ์ง ์์ต๋๋ค.
| ๋ฐ์ดํฐ์ | ์ถ์ฒ | ๋ผ์ด์ ์ค | ์์ ์ ์ด์ฉ | ๋น๊ณ |
|---|---|---|---|---|
| SFCHD (Safety Clothing & Helmet Detection) | github.com/lijfrank-open/SFCHD-SCALE | ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ ํ์ธ | ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ ํ์ธ | 12,373์ฅ / 50,558๊ฐ ๊ฐ์ฒด, ํํ๊ณต์ฅ ์์ ์ PPE. helmet/no_helmet/vest/no_vest ์ฃผ๋ ฅ ์์ค๋ก ์ฑํ |
| Construction Site Safety (Roboflow Universe) | universe.roboflow.com/roboflow-universe-projects/construction-site-safety | CC BY 4.0 | ๊ฐ๋ฅ | 717์ฅ(raw), 25๊ฐ ํด๋์ค ์ค Person/Hardhat/NO-Hardhat/Safety Vest/NO-Safety Vest๊ฐ ํ๋ก์ ํธ ํด๋์ค์ ๊ฑฐ์ 1:1 ๋งค์นญ. ๊ฑด์คํ์ฅ ๋๋ฉ์ธ ๋ค์์ฑ ํ๋ณด์ฉ |
| SHWD (Safety Helmet Wearing Dataset) | github.com/njvisionpower/Safety-Helmet-Wearing-Dataset | MIT License | ๊ฐ๋ฅ | 7,581์ฅ / ์ฝ 12๋ง ๊ฐ ๊ฐ์ฒด, Helmet/Head 2ํด๋์ค. no_helmet ํ๋ณธ ๋ถ์กฑ ์ ๋ณด๊ฐ์ฉ (head โ no_helmet ์ฌํด์) |
3๊ฐ ๋ฐ์ดํฐ์ ์ ์๋ณธ ๋ผ๋ฒจ(YOLO/COCO/VOC ํฌ๋งท)์ ํ๋ก์ ํธ 5๊ฐ ํด๋์ค(person/helmet/no_helmet/vest/no_vest)๋ก ๋งคํํด Superb AI ํ๋ซํผ์ ์ํฌํธํ๊ณ , Zero ์คํ ๋ผ๋ฒจ๋ง๊ณผ ์๋ ๋ผ๋ฒจ๋ง์ ์ ๋ ๋น๊ตํ๋ ์คํ๋ ์งํํ์ต๋๋ค. ๋ผ๋ฒจ๋ง ํ์ดํ๋ผ์ธ๊ณผ ์คํ ๊ฒฐ๊ณผ๋ data/README.md์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
YOLOv8n์ ํ์ธํ๋ํ ๊ฒฐ๊ณผ์ ๋๋ค (๊ฒ์ฆ์ 2,260์ฅ). ์ ์ฒด ํ์ต ๋ก๊ทธ๋ training/runs/seen-ppe-v1.md์ ์์ต๋๋ค.
| ํด๋์ค | Precision | Recall | mAP50 | mAP50-95 |
|---|---|---|---|---|
| ์ ์ฒด | 0.883 | 0.765 | 0.843 | 0.531 |
| person | 0.911 | 0.811 | 0.883 | 0.625 |
| helmet | 0.916 | 0.836 | 0.896 | 0.611 |
| no_helmet | 0.908 | 0.849 | 0.910 | 0.454 |
| vest | 0.864 | 0.855 | 0.887 | 0.578 |
| no_vest | 0.814 | 0.475 | 0.642 | 0.387 |
git clone https://github.com/0euun/SEEN.git
cd SEENpython -m venv venv
# Windows
venv\Scripts\activate
# macOS / Linux
source venv/bin/activatepip install -r requirements.txtcp .env.example .env.env ํ์ผ์ ์ด์ด ์๋ ๊ฐ์ ์ฑ์์ฃผ์ธ์.
| ๋ณ์ | ์ค๋ช |
|---|---|
SUPERB_AI_API_KEY |
Superb AI VLM/LLM ๊ฒ์ดํธ์จ์ด API ํค. ์๋ฐ ์บก์ ยท์กฐ์น ๊ถ๊ณ ๋ฌธ๊ตฌ๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ํฉ๋๋ค. |
SUPERB_AI_TENANT |
Superb AI ํ
๋ํธ ์ด๋ฆ. ๋น์๋๋ฉด seen์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฐ์
๋๋ค. |
SEEN_WEIGHTS_PATH |
ํ์ธํ๋ํ YOLOv8 ๊ฐ์ค์น ๊ฒฝ๋ก. ๋น์๋๋ฉด ์ผ๋ฐ COCO ์ฌ์ ํ์ต ๋ชจ๋ธ(yolov8n.pt)๋ก ๋์ฒด๋๋ฉฐ, ์ด ๊ฒฝ์ฐ PPE ํด๋์ค(ํฌ๋ฉง/์กฐ๋ผ)๋ ๊ฐ์ง๋์ง ์์ต๋๋ค. |
uvicorn app.main:app --reload๋ธ๋ผ์ฐ์ ์์ http://localhost:8000์ ์ ์ํ๋ฉด ๋๋ฉ ํ์ด์ง๊ฐ ๋น๋๋ค.
- ๊ตฌ์ญ ํธ์ง๊ธฐ์์ ์นด๋ฉ๋ผ ํ๋ฉด ์์ ๊ฐ์ ๊ตฌ์ญ์ ๊ทธ๋ฆฌ๊ณ ์ํ ๊ฐ์ค์น๋ฅผ ์ง์ ํฉ๋๋ค.
- ์ค์๊ฐ ํ์ง์์ ์น์บ ์ ์ผ๊ณ ํ์ง ๋ฐ์ค์ ์๋ฐ ํผ๋๋ฅผ ํ์ธํฉ๋๋ค.
- ์๋ฐ ๋์๋ณด๋์์ ์ง๊ธ๊น์ง ๊ฐ์ง๋ ์๋ฐ์ ์ต์ ์/์ํ๋์์ผ๋ก ํ์ธํฉ๋๋ค.
ํ๋ฉด๋ณ ์์ธํ ์ฌ์ฉ๋ฒ์ ์คํฌ๋ฆฐ์ท๊ณผ ํจ๊ป docs/manual/MANUAL.md์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
.github/
โโ ISSUE_TEMPLATE/task.md ์ด์ ํ
ํ๋ฆฟ
โโ PULL_REQUEST_TEMPLATE.md PR ํ
ํ๋ฆฟ
app/ FastAPI ๋ฐฑ์๋
โโ main.py ์ง์
์ โ .env ๋ก๋, ๋ผ์ฐํฐ/์ ์ ํ์ผ ๋ง์ดํธ
โโ db.py SQLite ์ฐ๊ฒฐ, zones/violations ์คํค๋ง ์์ฑ
โโ api/
โ โโ detect.py WebSocket ํ์ง ์๋ํฌ์ธํธ (YOLO โ ํธ๋์ปค โ ๊ตฌ์ญ โ ์ค์ฝ์ด๋ง โ ๋ฆฌํฌํธ ํธ๋ฆฌ๊ฑฐ)
โ โโ zones.py ๊ตฌ์ญ CRUD (GET/PUT /api/zones/{camera_id})
โ โโ violations.py ์๋ฐ ์ด๋ ฅ ์กฐํยท์ญ์ (GET/DELETE /api/violations)
โ โโ report.py VLM ์บก์
+ LLM ๊ถ๊ณ ์์ฑ, DB ์ ์ฅ (์ค๋ณต ๋ณํฉ ํฌํจ)
โโ core/
โ โโ tracker.py ๊ฒฝ๋ IoU ๊ธฐ๋ฐ ํธ๋์ปค (track_id ๋ถ์ฌ)
โ โโ zone.py point-in-polygon ํ์ , bbox ์ ํธ
โ โโ risk_scoring.py ์ํ๋ ์ค์ฝ์ด๋ง ๊ณต์ (์์ ํจ์)
โ โโ vlm_client.py Superb AI VLM/LLM ๊ฒ์ดํธ์จ์ด ํธ์ถ wrapper
โโ models/
โโ yolo_infer.py YOLOv8 ์ถ๋ก wrapper
training/ YOLOv8 ํ์ต
โโ train_yolo.py ํ์ธํ๋ ์คํฌ๋ฆฝํธ (python training/train_yolo.py --epochs ...)
โโ colab_train_yolo.ipynb Colab์์ ํ์ต ๋๋ฆด ๋ ์ฐ๋ ๋
ธํธ๋ถ
โโ configs/data.yaml ํด๋์ค ์ ์ (person/helmet/no_helmet/vest/no_vest) + ๋ฐ์ดํฐ ๊ฒฝ๋ก
โโ runs/seen-ppe-v1.md ํ์ต ์คํ ๋ก๊ทธ (์ํญ๋ณ mAP/precision/recall, ํด๋์ค๋ณ ์ต์ข
์งํ)
frontend/ ์ ์ ํ๋ก ํธ์๋ (์์ HTML/JS)
โโ index.html ๋๋ฉ ํ์ด์ง
โโ zone_editor.html ๊ตฌ์ญ ํธ์ง๊ธฐ โ ์บ๋ฒ์ค์ ํด๋ฆฌ๊ณค ๊ทธ๋ฆฌ๊ธฐ
โโ live.html ์ค์๊ฐ ํ์ง โ ์น์บ ์คํธ๋ฆผ + WebSocket
โโ dashboard.html ์๋ฐ ๋์๋ณด๋ โ ํํฐ/์ ๋ ฌ/์ญ์
โโ manual.html ์ธ์ฑ ์ฌ์ฉ ๋งค๋ด์ผ
โโ manual/ manual.html์ฉ ์คํฌ๋ฆฐ์ท
โโ 1_zone_editor.png
โโ 2_live.png
โโ 3_dashboard.png
data/ ๋ฐ์ดํฐ์
๊ด๋ จ (์๋ณธ ์ด๋ฏธ์งยท๋ผ๋ฒจ์ ์ฉ๋ ๋ฌธ์ ๋ก ๋ฏธํฌํจ)
โโ README.md ๋ผ๋ฒจ๋ง ํ์ดํ๋ผ์ธ, Zero ์คํ ๋ผ๋ฒจ๋ง ๋น๊ต ์คํ ๊ธฐ๋ก
โโ zero_experiment_result.json ์ ์คํ์ ์๋ณธ ๊ฒฐ๊ณผ (์ ๋ ๋น๊ต ์คํฌ๋ฆฝํธ ์ถ๋ ฅ)
โโ zero_experiment_analysis.ipynb ์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํ๋ ๋
ธํธ๋ถ (ํด๋์ค๋ณ precision/recall/F1, ์์์๊ฐ ๋น๊ต)
โโ zero_experiment_precision_recall.png / zero_experiment_time_comparison.png ๋
ธํธ๋ถ ์คํ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง
โโ raw/ ์๋ณธ ์ด๋ฏธ์ง (gitignore, ์ง์ ๋ค์ด๋ก๋ํด์ ์ฑ์์ผ ํจ)
โโ superbai_export/ Superb AI ํ๋ก์ ํธ์์ exportํ YOLO ํฌ๋งท ๋ผ๋ฒจ (gitignore)
docs/ ๋ ํฌ ๋ฌธ์ (GitHub์์ ๋ฐ๋ก ๋ณด๋ ๋ฌธ์์ฉ)
โโ pipeline.svg ์ ํ์ดํ๋ผ์ธ ๋ค์ด์ด๊ทธ๋จ
โโ manual/
โโ MANUAL.md ํ๋ฉด๋ณ ์ฌ์ฉ ์ค๋ช
์
โโ 1_zone_editor.png
โโ 2_live.png
โโ 3_dashboard.png
scripts/ Superb AI ์ฐ๋ ์คํฌ๋ฆฝํธ (๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์์๋๋ก)
โโ upload_to_superbai.py 1. ๋ก์ปฌ ์ด๋ฏธ์ง๋ฅผ Superb AI ๋ฐ์ดํฐ์
์ ์
๋ก๋
โโ import_labels_to_superbai.py 2. 3๊ฐ ์์ค ๋ฐ์ดํฐ์
์ ์๋ณธ ๋ผ๋ฒจ์ 5๊ฐ ํด๋์ค๋ก ๋งคํํด ์ํฌํธ
โโ tag_assets_by_source.py 3. ์ถ์ฒ๋ณ ํ๊ทธ ๋ถ์ฐฉ (๊ฒ์ ์ ํํฐ๋ง์ฉ)
โโ zero_vs_manual_experiment.py 4. Zero ์คํ ๋ผ๋ฒจ๋ง vs ์๋ ๋ผ๋ฒจ๋ง ์ ๋ ๋น๊ต ์คํ
โโ create_superbai_project.py ๋ผ๋ฒจ๋ง ํ๋ก์ ํธ ์์ฑ
โโ export_from_superbai.py ํ์ต ์ง์ , ํ๋ก์ ํธ๋ฅผ ๋ฒ์ ๊ณ ์ ํ YOLO ํฌ๋งท์ผ๋ก export
weights/ ํ์ต๋ YOLOv8 ๊ฐ์ค์น (best.pt)
snapshots/ ์๋ฐ ์ค๋
์ท ์ ์ฅ ์์น (๋ฐํ์์ ์์ฑ, gitignore)
Dockerfile Railway ๋ฑ ๋ฐฐํฌ์ฉ โ opencv ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ
requirements.txt Python ์์กด์ฑ
.env.example ํ๊ฒฝ ๋ณ์ ํ
ํ๋ฆฟ (SUPERB_AI_API_KEY ๋ฑ)
.gitignore
LICENSE MIT
- ์๋ฐ ์ค๋ ์ท์ ์ผ๊ตด์ด ๊ทธ๋๋ก ๋ ธ์ถ๋จ โ ์ผ๊ตด ์์ญ ๋ธ๋ฌ๋ง ํ์ (ํฌ๋ฉง ํ์ ๋ถ์์ ๊ฒน์ณ์ ์ ์ฒด ๋ธ๋ฌ๋ ๋ถ์ ํฉ, ๋ ์ฃผ๋ณ๋ง ๊ฐ๋ฆฌ๋ ๋ฐฉ์ ๊ฒํ ํ์)
- ๊ตฌ์ญ ์ง์ ๊ฐ์ง๋ฅผ "๋ฌด๋จ ์นจ์ "์ผ๋ก ๋จ์ ํ์ง ์์ โ ์นด๋ฉ๋ผ๋ง์ผ๋ก๋ ์ง์ ์์ ๊ถํ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ. ์ ๋ขฐ์ฑ ์๊ฒ ํ๋ณํ๋ ค๋ฉด ๋ฐฐ์ง/ID ํ๊ทธ ๊ฐ์ ์ถ์ ์ธ์ฆ ์์คํ ์ฐ๋ ํ์
no_vestrecall(0.475)์ด ๋ค๋ฅธ ํด๋์ค(0.81~0.86) ๋๋น ํ์ฐํ ๋ฎ์ โ ์ค์ ์กฐ๋ผ ๋ฏธ์ฐฉ์ฉ ์ํฉ์ ์ ๋ฐ ๊ฐ๊น์ด๋ฅผ ๋์น ์ ์๋ค๋ ๋ป. ํ์ ๊ฐ์ ์ no_vest ์ํ ๋ณด๊ฐ์ด ์ฐ์ ์์