AIVIS 소개
<aside>
AI 기반 영상 감시, PPE(안전장비) 위반 감지, 얼굴 인식을 수행하는 통합 시스템입니다.
GitHub - Ihan0316/AIVIS
최종 발표 ppt.pdf
</aside>
기술 스택
제작 기간
<aside>
2025.09.29 ~ 2025.12.10
</aside>
역할
<aside>
- 모델 튜닝
- 프론트 작업
- 데이터 정제
</aside>
ERD
erDiagram
violation {
ObjectId _id PK
long timestamp
string violation_datetime
int cam_id
string worker_id "FK -> worker.workerId"
string worker_name
string type "위반 유형(안전모, 안전조끼, 넘어짐 등)"
string severity
string status "new|completed 등"
string image_path
string work_zone
bool is_face_recognized
string face_recognition_status
float recognized_confidence
}
worker {
ObjectId _id PK
string workerId UK "고유"
string workerName
string name "workerName과 동일 용도"
string worker_id "workerId와 동일 용도"
}
face {
ObjectId _id PK
string workerId "FK -> worker.workerId"
string workerName
datetime created_at
datetime updated_at
"embedding 등 메타데이터"
}
worker ||--o{ violation : "worker_id"
worker ||--o| face : "workerId"
API 명세서
회고록
<aside>
산업 안전 관제 시스템 'AIVIS' 개발 회고
프로젝트 기간: 2025.09.29 ~ 2025.12.10
주요 기술: React, Vite, aiohttp, MongoDB, YOLO(Ultralytics), AdaFace, FAISS, ONNX Runtime, WebSocket
1. 프로젝트 개요 및 역할
AIVIS는 AI 기반 영상 감시·안전 관리 시스템으로, 실시간 PPE(안전모/안전조끼) 위반 감지, 넘어짐(낙상) 감지, 얼굴 인식을 수행합니다. 팀장으로서 모델 튜닝, 프론트엔드 개발, 데이터 정제 파이프라인을 담당했습니다.
2. 주요 역할 및 성과
① 모델 튜닝 — CCTV 환경에 맞는 임계값 설계 및 환경 변수화
- YOLO 신뢰도, 얼굴 유사도·차이 임계값, 넘어짐 판정 파라미터를 실험적으로 조정해 오인식·미탐지를 줄였습니다.
- 모든 임계값을 config.py에 모아 두고, 환경 변수로 오버라이드 가능하게 해 운영 환경별 튜닝이 가능하도록 했습니다.
코드
② 프론트엔드 — 대시보드 상태 관리 및 실시간 데이터 연동
- KPI·위반 로그·작업자 목록·주간 차트 등 대시보드 전반의 상태를 React로 구성하고, REST API·WebSocket과 연동했습니다.
- 작업자 조회·위반 조회·통계 API를 api.js로 모듈화하고, WebSocket Hook으로 실시간 스트리밍을 관리했습니다.
코드
③ 데이터 정제 — PPE 합성·임베딩 파이프라인 구축
- 등록용 원본 사진에 대해 PPE 착용 합성 → 임베딩용 이미지 저장 → FAISS DB 구축까지 한 번에 돌아가도록 스크립트를 설계·구현했습니다.
- 프롬프트/이미지 경로/병렬 처리 수 등을 설정으로 분리해, 데이터 규모에 맞게 정제 파이프라인을 조정할 수 있게 했습니다.
코드
3. 기술적 도전 및 해결 과정
🛠️ 오인식·미탐지 줄이기
- 문제: 얼굴 유사도만 쓰면 비슷한 얼굴에서 오인식이 나고, YOLO/포즈 신뢰도가 높으면 멀리 있거나 가려진 사람은 미탐지됨.
- 해결:
- 유사도 단일 값 대신 1위·2위 유사도 차이를 두어, 차이가 작으면 “불확실”로 처리하고 Unknown 반환.
- YOLO/Pose 신뢰도를 0.08 수준으로 낮춰 감지율을 높이고, 바운딩 박스 깜빡임은 IoU 매칭·위반 판정 IoU를 조정해 안정화.
- 위 파라미터를 모두 Thresholds와 환경 변수로 분리해, 현장별로 재배포 없이 튜닝 가능하게 함.
🛠️ Frame rate per second(FPS) 높이기
- 문제: 얼굴 인식(AdaFace·FAISS), PPE/포즈(YOLO)를 매 프레임에 돌리다 보니 1프레임 처리 시간이 길어졌고, 카메라 캡처와 WebSocket 전송이 그 속도에 묶여 실시간 스트리밍 FPS가 낮아지고 지연이 쌓였습니다.
프레임 큐가 계속 쌓이면 오래된 프레임 위주로 처리되어 실시간성이 더 떨어졌습니다.
- 해결:
- 캡처 단: 목표 FPS 30 고정, CAP_PROP_FPS·CAP_PROP_BUFFERSIZE(5) 설정으로 캡처 속도와 버퍼를 맞춤. 해상도는 640×480으로 제한해 프레임당 연산량을 줄였습니다.
- 적응형 프레임 간격: 처리 시간이 목표 간격(1/30초)보다 50% 이상 길면, 다음 캡처까지 간격을 processing_time * 0.8(상한 2배)로 완화해 CPU/GPU가 따라갈 수 있게 했습니다.
- 큐·지연 관리:
- 큐가 가득 찼을 때는 큐의 50%를 비워 최신 프레임 위주로 처리하도록 해 FPS 저하와 지연을 줄였습니다.
- WebSocket으로 보낼 프레임을 고를 때는 0.5초 이상 된 프레임은 스킵하고, 최대 15개만 확인해 그중 가장 최신 1장만 전송해 실시간성을 유지했습니다.
- 처리 분리: run_in_executor로 프레임 처리를 전용 스레드 풀에서 돌리고, 2.5초 타임아웃을 두어 한 프레임이 너무 오래 걸리면 끊기지 않고 다음 프레임으로 넘어가도록 했습니다.
- 모니터링: 1초마다 실제 처리 FPS를 계산해 camera_buffers[cam_id]["fps"]에 넣고 로그로 남겨, 운영 중 FPS 저하 구간을 확인할 수 있게 했습니다.
4. 마치며
팀장으로서 모델 튜닝·프론트 연동·데이터 정제를 한 흐름으로 맞추는 데 집중했습니다.
임계값과 데이터 파이프라인을 설정/코드로 명확히 둔 덕분에, 이후 운영·개선 시 재현성과 협업이 수월했고, 프론트의 API·WebSocket 구조는 실시간 대시보드 확장에 잘 맞았습니다.
다음에는 A/B 테스트나 자동 하이퍼파라미터 탐색까지 넓혀 보고 싶습니다.
</aside>