Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
cfdc7f5
Release: Milestone 1.0 Final Integration 🚀
CHOSOOGEUN Mar 28, 2026
e9ee560
refactor: upgrade CI/CD deployment script for robustness
CHOSOOGEUN Mar 28, 2026
f1431aa
ci: add manual dispatch and fix secrets
CHOSOOGEUN Mar 28, 2026
7d192da
docs: add advanced infra tasks for Choi Tae-yang
CHOSOOGEUN Mar 28, 2026
420f24c
Update S3 bucket task to completed status
sunzx0428 Mar 28, 2026
bc8738a
feat: TimescaleDB 하이퍼테이블 마이그레이션 및 시드 데이터 추가
mingg-00 Mar 29, 2026
1680912
feat: TimescaleDB 하이퍼테이블 마이그레이션 및 시드 데이터 추가
mingg-00 Mar 29, 2026
10b82c9
docs: create admin directory and move weekly report
CHOSOOGEUN Mar 30, 2026
90f3eca
docs: move all TODO files to admin directory
CHOSOOGEUN Mar 30, 2026
01fd6eb
docs: add checkable boxes to M2 TODO
CHOSOOGEUN Mar 30, 2026
36790d4
docs: refine M2 TODO layout and remove slogan
CHOSOOGEUN Mar 30, 2026
21491b9
docs: complete all tasks in Milestone 1.0
CHOSOOGEUN Mar 30, 2026
00f666a
docs: correct Milestone 1.0 TODO status (waiting for Minji's PR)
CHOSOOGEUN Mar 30, 2026
0d130fb
Merge remote-tracking branch 'origin/feature/이지현-dashboard-ui' into d…
CHOSOOGEUN Mar 30, 2026
c5d285d
docs: remove redundant root TODO_Milestone_1.md (use docs/admin/ vers…
CHOSOOGEUN Mar 30, 2026
3675419
docs: finalize Milestone 2.0 TODO based on meeting agenda (Blitz mode)
CHOSOOGEUN Mar 31, 2026
c52895a
docs: upgrade Milestone 2.0 TODO to High-Intensity Blitz mode
CHOSOOGEUN Mar 31, 2026
49ecd79
Merge remote-tracking branch 'origin/feature/김민지-db-setup'
CHOSOOGEUN Mar 31, 2026
9683bbc
merge: integrate Minji's DB setup and resolve TODO_Milestone_1.md con…
CHOSOOGEUN Mar 31, 2026
c1a54c5
docs: finalize Minji's Milestone 1.0 tasks
CHOSOOGEUN Mar 31, 2026
20fd0ca
docs: move AI part from M1 to M2 due to test video absence
CHOSOOGEUN Mar 31, 2026
6a9ff7a
docs: integrate AI tasks from M1 to M2 Blitz plan
CHOSOOGEUN Mar 31, 2026
f7df7d2
docs: create intermediate optimization & cleanup report (Post-M1)
CHOSOOGEUN Mar 31, 2026
571e739
refactor: apply intermediate optimization (type hints, docstrings, do…
CHOSOOGEUN Mar 31, 2026
729e442
docs & refactor: finalize intermediate optimization (Global Handler, …
CHOSOOGEUN Mar 31, 2026
fe0c45f
docs: finalize optimization report with strategic task postponements
CHOSOOGEUN Mar 31, 2026
9d427de
docs: finalized intermediate optimization report post-leader review
CHOSOOGEUN Mar 31, 2026
bc50ad7
refactor: ensure Python < 3.10 compatibility and verify health check
CHOSOOGEUN Mar 31, 2026
f4f91a6
docs: standardize and clean up all project documentation for professi…
CHOSOOGEUN Mar 31, 2026
a425b66
Revert "docs: standardize and clean up all project documentation for …
CHOSOOGEUN Mar 31, 2026
5ac4249
docs: add AI-Backend API integration guide and update M2 TODO
CHOSOOGEUN Mar 31, 2026
b1742be
feat(backend): reinforce security validation and implement 72% test c…
CHOSOOGEUN Mar 31, 2026
14cf023
docs: Update Milestone 2.0 Roadmap & Technical Guides v2.0 & Backend …
CHOSOOGEUN Mar 31, 2026
e25118a
fix: supervision 라이브러리 호환성 수정 및 Windows 카메라 연동 안정화
springflower18-design Mar 31, 2026
725948e
chore: backend optimization (compression, indexes, orjson) and admin …
CHOSOOGEUN Apr 1, 2026
0beccbc
fix: 카메라 백엔드 Mac 기본으로 변경, Windows는 주석 처리
springflower18-design Apr 1, 2026
fc67664
chore: AI 모듈 requirements.txt 추가
springflower18-design Apr 1, 2026
512378f
chore: resolve merge conflict in ai/inference.py
CHOSOOGEUN Apr 1, 2026
5d8cd1a
Merge pull request #12 from CHOSOOGEUN/feature/윤효정-yolo-pipeline
CHOSOOGEUN Apr 1, 2026
c6364b4
docs: update M2 TODO and AI-Backend Integration Guide to v2.1
CHOSOOGEUN Apr 1, 2026
59e4ded
docs: update gemini.md and README.md for AI-Backend v1.0 completion
CHOSOOGEUN Apr 1, 2026
b37b461
docs: include Milestone 2.0 status in gemini.md
CHOSOOGEUN Apr 1, 2026
56dfed3
feat: 서버 리소스 모니터링 스크립트 추가
sunzx0428 Apr 3, 2026
b31f9fa
chore: resolve conflict by removing deleted TODO_Milestone_1.md
CHOSOOGEUN Apr 3, 2026
e6a2c89
[Merged] PR #8: AWS S3 connection and monitoring scripts
CHOSOOGEUN Apr 3, 2026
d2795b7
docs: update milestone 2.0 todo progress
CHOSOOGEUN Apr 3, 2026
9668920
docs: mark domain/ssl task as completed
CHOSOOGEUN Apr 3, 2026
68ef5d7
feat: add test automation script for backend
CHOSOOGEUN Apr 6, 2026
31eb8b4
feat: add deployment notifications and update docs with official domain
CHOSOOGEUN Apr 6, 2026
cb93584
feat: migrate frontend clean
jihyun808 Apr 27, 2026
caf9760
fix: fix login card responsive width on mobile
jihyun808 Apr 27, 2026
db761ab
Merge pull request #15 from CHOSOOGEUN/feature/이지현-clean-frontend
CHOSOOGEUN Apr 28, 2026
94b2937
feat: add GateGuard AI Colab inference notebook
springflower18-design May 4, 2026
443a194
feat: add YOLO11 fine-tuning notebook for person/child detection
springflower18-design May 4, 2026
5409731
feat(ai): run_pipeline8 기반 AI 파이프라인 모듈화 + 백엔드 event_type 연동
springflower18-design May 11, 2026
31f898a
feat: add test_video and update colab pipeline notebook
mingg-00 May 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 42 additions & 7 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
branches: [master]
pull_request:
branches: [master, develop]
workflow_dispatch:

jobs:
# ─────────────────────────────────────────
Expand Down Expand Up @@ -82,16 +83,50 @@ jobs:
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
# 폴더가 없으면 생성 후 클론, 있으면 진입
if [ ! -d "~/GateGuard" ]; then
git clone https://github.com/CHOSOOGEUN/GateGuard.git ~/GateGuard
fi

cd ~/GateGuard

# 최신 코드 pull
git pull origin master
# 최신 코드 강제 동기화 (충돌 방지)
git fetch origin master
git reset --hard origin/master

# 컨테이너 재시작
sudo docker compose down
sudo docker compose up -d --build
# 🔐 GitHub Secrets를 실제 서버의 .env로 주입 (S3 실체화)
cat << EOF > backend/.env
AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION=${{ secrets.AWS_REGION }}
AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}
SECRET_KEY=${{ secrets.SECRET_KEY }}
MASTER_TOKEN=${{ secrets.MASTER_TOKEN }}
ALGORITHM=HS256
POSTGRES_USER=gateguard
POSTGRES_PASSWORD=gateguard
POSTGRES_DB=gateguard
DATABASE_URL=postgresql+asyncpg://gateguard:gateguard@db:5432/gateguard
REDIS_URL=redis://redis:6379/0
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/0
DEBUG=False
EOF

# DB 마이그레이션
sudo docker exec gateguard-backend-1 alembic upgrade head
# 컨테이너 재시작 및 최적화
sudo docker compose pull
sudo docker compose up -d --build --remove-orphans

# DB 마이그레이션 (컨테이너 가동 대기 후 실행)
sleep 5
sudo docker compose exec -T backend alembic upgrade head

echo "✅ 배포 완료: $(date)"

- name: Notify Deployment Success
if: success()
run: |
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"🚀 **GateGuard 배포 성공!**\n🔗 접속 주소: <https://gateguardsystems.com>\n📅 완료 시간: $(date)\"}" \
${{ secrets.DISCORD_WEBHOOK_URL }}
46 changes: 28 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
# 🛡️ GateGuard

> **지하철 개찰구 AI 기반 무임승차 실시간 감지 시스템**
> 경기대학교 AI컴퓨터공학부 캡스톤디자인 2026 — Milestone v1.0 (Core Infrastructure Complete)
> 경기대학교 AI컴퓨터공학부 캡스톤디자인 2026 — <https://gateguardsystems.com>
> Milestone v2.0 (Infra & Automatic Deployment Complete) 🏁

---

## 📌 프로젝트 소개

지하철 무임승차는 연간 **4,135억 원**의 손실을 유발하는 사회적 문제입니다.
GateGuard는 기존 역무원의 육안 감시를 대체하여, **CCTV 영상을 AI가 실시간 분석**하고 무임승차(뒤따라 들어오기, 점점, 비상문 이용 등)를 자동 감지해 **관리자 대시보드에 즉시 실시간 알림(WebSocket)**을 전송하는 최첨단 보안 시스템입니다.
GateGuard는 기존 역무원의 육안 감시를 대체하여, **CCTV 영상을 AI가 실시간 분석**하고 무임승차(뒤따라 들어오기, 점프, 비상문 이용 등)를 자동 감지해 **관리자 대시보드에 즉시 실시간 알림(WebSocket)**을 전송하는 최첨단 보안 시스템입니다.

---

## 🏗️ 시스템 구조

```
```text
CCTV 영상 입력 (실시간 스트림)
비식별화 (Edge/Server) — 얼굴 감지 및 즉시 블러 처리
Expand All @@ -35,28 +36,31 @@ Supervision — 개찰구 라인 크로싱 및 구역(Zone) 통과 감지
## 🔧 기술 스택

### AI / ML

| 기술 | 역할 |
|------|------|
| :--- | :--- |
| YOLOv11 (Ultralytics) | 실시간 사람 감지 |
| ByteTrack | 다중 객체 ID 추적 |
| ByteTrack | 다중 객체 ID 추적 (v0.27.0) |
| Supervision | 라인 크로싱 / 구역 통과 감지 |
| OpenCV | 영상 전처리 및 비식별화 |
| OpenCV | 영상 전처리 및 비식별화 (Gaussian Blur) |

### Backend (Milestone v1.0 구축 완료)

| 기술 | 역할 |
|------|------|
| :--- | :--- |
| Python 3.11 / FastAPI | 고성능 비동기 REST API 서버 |
| **Alembic** | 데이터베이스 마이그레이션 및 버전 관리 |
| **OAuth2 / JWT** | 관리자 권한 기반 보안 체계 (|
| **OAuth2 / JWT** | 관리자 권한 기반 보안 체계 |
| **WebSocket** | 실시간 감지 알림 브로드캐스트 |
| Celery + Redis | 비동기 영상 업로드 및 알림 작업 |
| PostgreSQL + TimescaleDB | 시계열 이벤트 데이터 저장 |
| PostgreSQL + TimescaleDB | 시계열 이벤트 데이터 저장 및 압축 |

---

## 🚀 개발 환경 실행 (Quick Start)

### 사전 준비

- Docker Desktop 설치 및 실행
- Python 3.11+ (백엔드 로컬 테스트용)

Expand All @@ -71,23 +75,26 @@ cd GateGuard
docker-compose up -d

# 3. 데이터베이스 마이그레이션 (중요!)
# 컨테이너 안에서 Alembic을 통해 최신 스카마를 적용합니다.
# 컨테이너 안에서 Alembic을 통해 최신 스키마를 적용합니다.
docker exec gateguard-backend-1 alembic upgrade head

# 4. API 문서 접속
# 주소: http://localhost:8000/docs
# 4. API 문서 접속 (Swagger)
# 로컬: http://localhost:8000/docs
# 서버: https://gateguardsystems.com/docs
```

---

## 📡 개발자 연동 가이드

### 1. 실시간 알림 (Websocket)

- **엔드포인트**: `ws://localhost:8000/ws/events`
- **수신 타입**: `{"type": "NEW_EVENT", "data": {...}}`
- **담당 파트**: 지현(Frontend Dashboard) 연동용

### 2. 관리자 인증 (JWT)

- **인증 방식**: Bearer Token (Bearer <JWT_TOKEN>)
- **획득 경로**: `POST /api/auth/login` (Admin 계정 필요)
- **대상**: Cameras, Events 전체 조회/수정 API
Expand All @@ -98,21 +105,24 @@ docker exec gateguard-backend-1 alembic upgrade head

- `master`: 배포 전용 (직접 push 금지)
- `develop`: 통합 개발 브랜치
- `feature/담당자-기능명`: 개별 기능 전용 브랜드
- `feature/담당자-기능명`: 개별 기능 전용 브랜치

> **[현재 상태]** `feature/조수근-backend-complete-v1` 코드를 `master` 브랜치에 **최종 병합 완료 (Milestone v1.0 정복)** 🏁
> **[현재 상태]** Milestone 1.0 (Core & AI Integration) **전격 완수 (2026-04-01)** 🏁
> - 백엔드 코어 인프라 & 보안 체계 구축 완료 (조수근)
> - AI 파이프라인(ByteTrack + Face Anonymization) 통합 완료 (윤효정)
> - TimescaleDB 시계열 최적화 및 고속 조회 시스템 구축 완료 🛡️

---

## 👥 팀원 구성

| 이름 | 역할 | 담당 파트 |
|------|------|------|
| **조수근** | **백엔드 팀장** | **코어 인프라 · 보안 · 실시간 시스템** |
| **김민지** | **프로젝트 팀장** | **DB 설계 · 마이그레이션** |
| :--- | :--- | :--- |
| **조수근** | **백엔드 팀장** | **코어 인프라 · 보안 · 실시간 시스템 · AI 보조** |
| **김민지** | **프로젝트 팀장** | **DB 설계 · 마이그레이션 · 협업 관리** |
| **이동근** | 인프라 | 서버 구축 · CI/CD |
| **최태양** | 인프라 | 클라우드 인프라 |
| **이지현** | **프론트팀장** | **대시보드 UI/UX** |
| **이지현** | **프론트팀장** | **대시보드 UI/UX 설계** |
| **김유진** | 프론트엔드 | 클라이언트 통계 |
| **양은혜** | 프론트엔드 | 모바일 앱 |
| **윤효정** | AI | 탐지 모델 구축 |
Expand Down
63 changes: 0 additions & 63 deletions TODO_Milestone_1.md

This file was deleted.

1 change: 1 addition & 0 deletions ai/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

10 changes: 9 additions & 1 deletion ai/anonymizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,17 @@

class FaceAnonymizer:
def __init__(self, model_path: str = "yolov11n-face.pt"):
self.model = YOLO(model_path)
try:
self.model = YOLO(model_path)
self._enabled = True
except Exception as e:
print(f"[WARNING] 얼굴 비식별화 모델 로드 실패 ({e}) — 비식별화 비활성화")
self.model = None
self._enabled = False

def blur(self, frame: np.ndarray) -> np.ndarray:
if not self._enabled:
return frame
results = self.model(frame, verbose=False)[0]
for box in results.boxes.xyxy.cpu().numpy().astype(int):
x1, y1, x2, y2 = box
Expand Down
Loading
Loading