Skip to content
 
 

Latest commit

 

History

129 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎵 Tenein — K-pop 안무 유사도 분석 시스템

AI 기반 K-pop 안무 영상 비교 · 분석 · 보고서 자동 생성 웹 서비스
두 K-pop 안무 영상을 업로드하면 AI가 유사 구간을 탐지하고, 신체 부위별 유사도를 분석하여 PDF 보고서를 자동 생성합니다.

image

📋 목차


🎬 프로젝트 소개

K-pop 안무 영상 간 유사도를 자동으로 분석하는 풀스택 AI 웹 서비스입니다. 두 영상을 업로드하면 딥러닝 파이프라인이 동작을 추출하고, 구간별 유사도를 계산한 뒤, LLM이 자연어 분석 보고서를 생성합니다.

🎥 시연 영상

프로젝트 시연 및 소개 영상 링크 : https://youtu.be/C7zSym6TCzI


주요 기능

기능 설명
🎯 전체 유사도 분석 두 안무 영상의 전체 유사도 점수 산출
🔍 구간별 탐지 시간 구간별 유사 안무 구간 자동 탐지
🦴 부위별 분석 왼팔, 오른팔, 왼다리, 오른다리, 몸통 부위별 유사도
📊 AI 보고서 GPT-5.1 기반 자연어 분석 보고서 자동 생성
📄 PDF 내보내기 분석 결과를 PDF 보고서로 다운로드
👤 분석 히스토리 과거 분석 기록 조회 및 상세 보기

웹 주요 화면

🔐 인증 및 메인

메인 화면 로그인 및 회원가입 프로필 및 히스토리 조회
Image Image Image

🎬 분석 기능

영상 업로드 분석 보고서
Image Image

🌟 기대효과

Tenein은 K-pop 산업의 안무 저작권 보호, 댄스 교육 혁신, 콘텐츠 생태계 활성화에 기여합니다.

💼 안무 저작권 분쟁 해결

문제: 주관적 전문가 평가의 한계

솔루션: AI 기반 객관적 정량 측정

가치:

  • 법정 증거 보조지표로 이용 가능한 분석 리포트
  • 시간 구간별·부위별 상세 분석
  • "87.6% 일치" 같은 수치 증거 제공

🎓 댄스 교육 피드백 고도화

문제: 추상적 피드백 ("더 잘 춰")

솔루션: 정량적 구체적 피드백

가치:

  • "팔 각도 15도 더 벌리세요" 정밀 지도
  • 신체 부위별 유사도 점수 제공
  • 학습 성장 추적 및 개선점 시각화
  • 학습자 동기 부여 및 목표 설정

🎬 소셜 미디어 생태계 확장

문제: 주관적 인기도 평가

솔루션: 객관적 자동 순위 시스템

가치:

  • "원곡과 95% 일치" 배지 부여
  • 커버 댄서 실시간 리더보드
  • 공정한 경쟁 환경 조성
  • SNS 챌린지 참여 동기 강화

🎯 브랜드 아이덴티티

Objective (객관성) Interpretable (해석 가능성) Accessible (접근성)
97.66% 정확도
데이터로 말합니다
부위별 상세 분석
객관적 지표를 통한 설명
3초 처리
전문가 수준을 누구나

👥 팀원 소개

Team, Tenein

Tenein — 고대어로 "안무"를 뜻합니다.

suman
김수만(팀장)
PM / AI
jeongin
김정인
AI / QA
moongyeong
배문경
AI / FE
gyeongji
백경지
BE

🛠 Tech Stack

AI / Backend

Python PyTorch FastAPI YOLOv8 HRNet MotionBERT OpenCV

Frontend

React Vite Supabase

External Services

OpenAI Supabase

Deployment

Docker GitHubActions AWS


🏗 서비스 플로우

시스템 아키텍처

🌐 웹 서비스

프론트엔드

항목 내용
프레임워크 React 18 + Vite 5 (JSX, TypeScript 미사용)
디자인 시스템 Glassmorphism (backdrop-filter blur + 반투명 그라디언트)
인증 Supabase Auth (이메일/비밀번호)
PDF 생성 @react-pdf/renderer (브라우저 내 생성, 서버 부하 없음)
폰트 Chakra Petch (제목), Rajdhani (본문), NotoSansKR (PDF)

페이지 구성

페이지 파일 기능
🔐 Login.jsx 로그인 / 회원가입
🏠 home_page.jsx 영상 업로드 + 분석 요청
loading_page.jsx 분석 대기 (단계별 메시지 + 경과시간)
📊 result_page.jsx 분석 결과 + 아코디언 구간 + PDF 다운로드
👤 profile_page.jsx 유저 정보 + 히스토리 + 상세 모달
ℹ️ about_us_page.jsx 서비스 소개

백엔드

항목 내용
프레임워크 FastAPI + AWS
ML 런타임 PyTorch (CPU), YOLO, MediaPipe, MotionBERT, GCN
LLM LangChain + GPT-5.1
DB/Storage Supabase (PostgreSQL + Storage)

API 엔드포인트

POST /api/analyze
Content-Type: application/json

{
  "video_a_id": 1,
  "video_b_id": 2
}
// Response
{
  "overall": {
    "score": 68.0,
    "interpretation": "전체 유사도는 중간 이상으로..."
  },
  "summary": "두 영상의 전체 유사도는...",
  "key_differences": [
    "팔 동작 디테일에서 의도적 변형이 관찰됨",
    "후반부로 갈수록 포즈 일치도가 감소"
  ],
  "segments": [
    {
      "id": 1,
      "score": 66.7,
      "video_a": { "start": 15.0, "end": 20.0 },
      "video_b": { "start": 10.0, "end": 15.0 },
      "description": "영상 A의 15~20초와 영상 B의 10~15초는..."
    }
  ]
}

데이터베이스 구조

-- 사용자 프로필
profiles (
  id          UUID PRIMARY KEY,    -- auth.users.id FK
  user_name   TEXT
)

-- 분석 결과
analyses (
  aid         BIGINT PRIMARY KEY,  -- auto-increment
  user_id     UUID,                -- auth.users.id FK
  created_at  TIMESTAMP,
  result_data JSONB                -- format_result 출력 전체
)

-- Storage: videos 버킷 (public)

📂 폴더 구조

현재 공개 레포지토리 기준 구조입니다.

📦 2026-capstone-28
│
├── 📄 README.md                         # 프로젝트 전체 설명서
├── 📄 .gitignore
│
├── 📁 .github                           # GitHub Actions
│   └── workflows
│       └── deploy.yml                   # CI/CD 배포 워크플로우
│
├── 📁 assets                            # 정적 자산
│   └── images
│       └── poster.png                   # 프로젝트 포스터
│
├── 📁 frontend                          # 프론트엔드 (React + Vite)
│   ├── 📁 public                        # 정적 파일
│   │   ├── logo.png
│   │   └── fonts
│   │       ├── NotoSansKR-Bold.ttf
│   │       └── NotoSansKR-Regular.ttf
│   │
│   ├── 📁 src
│   │   ├── 📁 pages                     # 페이지 컴포넌트
│   │   │   ├── Login.jsx                # 로그인/회원가입
│   │   │   ├── home_page.jsx            # 영상 업로드
│   │   │   ├── loading_page.jsx         # 분석 대기
│   │   │   ├── result_page.jsx          # 분석 결과
│   │   │   ├── profile_page.jsx         # 사용자 프로필
│   │   │   └── about_us_page.jsx        # 서비스 소개
│   │   │
│   │   ├── 📁 hooks                     # Custom Hooks
│   │   │   └── useIsMobile.js
│   │   │
│   │   ├── 📁 lib                       # 외부 라이브러리
│   │   │   └── supabaseClient.js
│   │   │
│   │   ├── 📁 utils                     # 유틸리티
│   │   │   └── generatePDF.jsx          # PDF 보고서 생성
│   │   │
│   │   ├── 📁 assets                    # 이미지 자산
│   │   │   ├── background.png
│   │   │   ├── pdf-cover-bg.png
│   │   │   └── pdf-body-bg.png
│   │   │
│   │   ├── App.jsx                      # 메인 앱 컴포넌트
│   │   └── main.jsx                     # React 진입점
│   │
│   ├── package.json
│   ├── vite.config.js
│   └── README.md
│
├── 📁 backend                           # 백엔드 (FastAPI + PyTorch)
│   ├── 📁 api                           # REST API
│   │   ├── router.py                    # API 라우터
│   │   └── video_upload.py              # 영상 업로드 처리
│   │
│   ├── 📁 core                          # 핵심 설정
│   │   ├── config.py                    # 환경 설정
│   │   └── model_loader.py              # 모델 로더
│   │
│   ├── 📁 models                        # AI 모델
│   │   ├── 📁 yolo
│   │   │   └── detector.py              # YOLOv8 인물 검출
│   │   ├── 📁 HRnet
│   │   │   └── HRnet_loader.py          # HRNet-W48 포즈 추출
│   │   ├── 📁 motion_bert
│   │   │   ├── architecture.py          # MotionBERT 구조
│   │   │   └── embedder.py              # 3D 임베딩 생성
│   │   └── 📁 gcn_mlp
│   │       ├── lightweight_gcn.py       # ST-GCN
│   │       ├── siamese_mlp.py           # Siamese MLP
│   │       └── inferencer.py            # 유사도 추론
│   │
│   ├── 📁 model_pipeline                # AI 파이프라인
│   │   ├── analyze.py                   # 메인 분석 로직
│   │   ├── object_extractor.py          # YOLO 객체 추출
│   │   ├── object_processor.py          # HRNet 포즈 처리
│   │   ├── bert_3d_lifting.py           # 2D→3D 변환
│   │   ├── bert_embedder.py             # MotionBERT 임베딩
│   │   ├── feature_extractor.py         # 특징 추출
│   │   ├── stgcn_pose_encoder.py        # ST-GCN 인코더
│   │   ├── pose_tag.py                  # Pose+Tag 멀티모달
│   │   ├── tag_extractor.py             # Tag Feature 추출
│   │   ├── inferrence.py                # 유사도 추론
│   │   ├── report.py                    # LLM 보고서 생성
│   │   └── result_formatter.py          # 결과 포맷팅
│   │
│   ├── 📁 repository                    # 데이터 레포지토리
│   │   └── video_repository.py
│   │
│   ├── 📁 schemas                       # API 스키마
│   │   ├── analyze_schemas.py
│   │   └── video.py
│   │
│   ├── 📁 utils                         # 유틸리티
│   │   ├── ffmpeg_utils.py              # 영상 처리
│   │   ├── supabase_client.py           # Supabase 클라이언트
│   │   └── validation.py                # 입력 검증
│   │
│   ├── main.py                          # FastAPI 진입점
│   └── requirements.txt                 # Python 의존성

```

Frontend Architecture

프론트엔드는 React 18 + Vite 5 기반 SPA 구조입니다.

디렉터리 역할
pages/ 라우트 단위 페이지 (Login, Home, Result 등)
hooks/ Custom React Hooks (모바일 감지 등)
lib/ 외부 라이브러리 클라이언트 (Supabase)
utils/ 유틸리티 함수 (PDF 생성, 포맷팅)

Backend Architecture

백엔드는 7단계 AI 파이프라인 중심으로 구성됩니다.

디렉터리 역할
api/ REST API 엔드포인트
models/ AI 모델 구현 (YOLO, HRNet, MotionBERT, GCN)
model_pipeline/ 7단계 처리 로직 (추출→임베딩→추론→보고서)
utils/ 영상 처리, DB 연결, 검증

☁️ AWS 배포 아키텍처

┌──────────────────────────────────────────────────────────────────────┐
│                           AWS Cloud                                  │
│                                                                      │
│  ┌─────────────────────┐         ┌─────────────────────┐            │
│  │  EC2 — Frontend     │         │  EC2 — Backend       │            │
│  │  ┌───────┐ ┌──────┐ │         │  ┌────────┐ ┌──────┐ │            │
│  │  │ React │ │ Vite │ │  POST   │  │FastAPI │ │Docker│ │            │
│  │  └───────┘ └──────┘ │ ──────→ │  │Python  │ └──────┘ │            │
│  │       Docker         │/analyze │  └────────┘          │            │
│  └──────────┬──────────┘         └──────────┬───────────┘            │
│             │                               │                        │
└─────────────┼───────────────────────────────┼────────────────────────┘
              │ HTTPS                         │
              │                               ├──→ Supabase DB
              │                               ├──→ Supabase Storage
              │                               └──→ OpenAI API (Report)
              │
    ┌─────────┼──────────────────────────────────────┐
    │         ▼                                      │
    │  ┌─────────────┐                               │
    │  │Supabase Auth│  Login / Create Account       │
    │  └─────────────┘                               │
    │                      Supabase                  │
    └────────────────────────────────────────────────┘
 
┌──────────────────────────────────────────────────────────────────────┐
│                         CI/CD Pipeline                               │
│                                                                      │
│  Developer → GitHub → GitHub Actions → Docker Build → ECR Push      │
│                                            │                         │
│                                            └──→ EC2 자동 배포        │
└──────────────────────────────────────────────────────────────────────┘

인프라 구성

구성 요소 서비스 역할
🖥 EC2 (Frontend) React + Vite 정적 파일 서빙, Docker 컨테이너
🧠 EC2 (Backend) FastAPI + PyTorch ML 파이프라인, Docker 컨테이너
📦 ECR Frontend Image, Backend Image 저장소
🔐 Supabase Auth 사용자 인증 (이메일/비밀번호, Google OAuth)
🗄 Supabase DB PostgreSQL — 분석 결과, 사용자 프로필 저장
📁 Supabase Storage 업로드 영상 파일 관리 (videos 버킷)
🤖 OpenAI API GPT-5.1 기반 분석 보고서 생성

배포 흐름

1. 개발자가 main 브랜치에 push
2. GitHub Actions 트리거
3. Docker 이미지 빌드 (Frontend / Backend)
4. ECR에 이미지 Push
5. EC2에서 최신 이미지 Pull + 컨테이너 재시작

📖 연구 성과

KICS(한국통신학회) 26년 학술대회 발표예정

멀티모달 기반 안무 유사도 검출 기술, 안무 유사도 분석 시스템 구축

Tenein — K-pop Visual Studio

2026 국민대학교 소프트웨어융합대학 캡스톤디자인
산학협력 : 한국콘텐츠진흥원

© 2026 Tenein Team

About

K-pop 안무 영상 간 유사도를 자동으로 분석하는 AI 웹 서비스입니다.

Resources

Stars

23 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages