"Pitching" 플랫폼의 인공지능 모델을 활용하여 비디오 분석을 수행하여 발표에 대하여 피드백을 제공하는 모델 입니다. FastAPI와 Swagger UI를 사용하여 CV(Computer Vision) & VLM(Video Language Model)를 활용한 영상 처리 서버입니다. 이를 AWS EC2에 Docker로 배포한 후 프론트엔드(FE) 애플리케이션과 연동하는 과정을 다룹니다. 서버는 영상 업로드를 처리하고, 피드백 데이터를 생성하여 프론트엔드에 제공합니다. 또한, OpenCV와 FFmpeg를 활용하여 영상 코덱 변환 및 비디오 길이 계산 등의 기능을 포함합니다.
- FastAPI: 백엔드 프레임워크.
- Swagger UI: API 문서화 및 테스트 도구.
- FFmpeg: 비디오 코덱 변환 및 정보 추출 도구.
- OpenCV: 비디오 처리 및 분석 라이브러리.
- requirements.txt: 라이브러리 설치 파일.
- 프론트엔드 애플리케이션: 백엔드 서버와 연동하는 클라이언트 애플리케이션.
- AWS EC2 인스턴스: FastAPI의 경우 8000번 포트 등 필요한 포트가 허용되도록 보안 그룹 설정.
- Docker: EC2 인스턴스에 설치 필요.
├── LICENSE
├── README.md
├── Research
├── __pycache__
├── logging_config.json
├── logs
│ ├── access.log
│ └── app.log
├── main.py
├── prompt.txt
├── requirements.txt
├── storage
│ ├── input_video
│ └── output_feedback_frame
├── tests
│ ├── conftest.py
│ ├── test_main.py
│ └── vlm_model
│ ├── test_routers
│ │ ├── test_delete_files.py
│ │ ├── test_send_feedback.py
│ │ └── test_upload_video.py
│ └── test_utils
│ ├── test_analysis.py
│ ├── test_analysis_video
│ │ ├── test_load_prompt.py
│ │ └── test_parse_feedback.py
│ ├── test_cv_mediapipe_analysis
│ │ ├── test_analyze_mediapipe_main.py
│ │ ├── test_calculate_gesture.py
│ │ ├── test_calculate_hand_move.py
│ │ ├── test_gaze_analysis.py
│ │ ├── test_gesture_analysis.py
│ │ ├── test_mediapipe_initializer.py
│ │ ├── test_movement_analysis.py
│ │ └── test_posture_analysis.py
│ ├── test_download_video.py
│ ├── test_encoding_feedback_image.py
│ ├── test_encoding_image.py
│ ├── test_processing_video.py
│ ├── test_read_video.py
│ ├── test_video_codec_conversion.py
│ └── test_video_duration.py
└── vlm_model
├── README.md
├── __init__.py
├── __pycache__
├── config.py
├── constants
│ ├── __init__.py
│ ├── __pycache__
│ └── behaviors.py
├── routers
│ ├── __init__.py
│ ├── __pycache__
│ ├── send_feedback.py
│ └── upload_video.py
├── schemas
│ ├── __init__.py
│ ├── __pycache__
│ └── feedback.py
├── utils
│ ├── __init__.py
│ ├── __pycache__
│ ├── analysis.py
│ ├── download_video.py
│ ├── encoding_image.py
│ ├── read_video.py
│ ├── user_prompt.py
│ ├── video_duration.py
│ └── visualization.py
└── video_processor(test_local).py
git clone https://github.com/KakaoTech-14-All-in-one-move/AIM-14-AI-VLM.git
.env
파일을 생성하여 필요한 환경 변수를 설정합니다. 예:
OPENAI_API_KEY=your_openai_api_key
PROMPT_PATH=./prompt.txt
UPLOAD_DIR=storage/input_video
FEEDBACK_DIR=storage/output_feedback_frame
SENTRY_DSN=your_sentry_api_key
TRACE_SAMPLE_RATE=1.0
# 폰트 관련 환경 변수
FONT_DIR=fonts
FONT_FILE=NotoSans-VariableFont_wdth,wght.ttf
FONT_SIZE=15
FFmpeg는 비디오 코덱 변환에 필수적입니다. 사용 중인 운영체제에 맞게 설치하세요.
brew install ffmpeg
sudo apt update
sudo apt install ffmpeg
- FFmpeg 공식 웹사이트에서 Windows용 바이너리를 다운로드합니다.
- FFmpeg 설치 디렉토리를 시스템 경로에 추가합니다.
Dockerfile
에 FFmpeg와 OpenCV 등의 필요한 모든 의존성이 포함되어 있는지 확인합니다.
build-essential \
libffi-dev \
libssl-dev \
ffmpeg \
libsndfile1 \
libgl1-mesa-glx \
libglib2.0-0 \
libjpeg-dev \
zlib1g-dev \
libcairo2 \
libpango-1.0-0 \
libpangocairo-1.0-0 \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt . RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt
### Docker 이미지 빌드
```bash
docker build -t vlm-video-processing .
docker run -d -p 8000:8000 --name vlm-container vlm-video-processing
- Python 3.9 이상
- FFmpeg 설치 (코덱 변환 기능 사용 시 필요)
- OpenCV 설치
git clone https://github.com/KakaoTech-14-All-in-one-move/AIM-14-AI-VLM.git
python3 -m venv venv
source venv/bin/activate # MacOS/Linux
venv\Scripts\activate # Windows
pip install -r requirements.txt
UPLOAD_DIR=storage/input_video
FEEDBACK_DIR=storage/output_feedback_frame
uvicorn main:app --host 0.0.0.0 --port 8000 --reload --log-config logging_config.json
http://127.0.0.1:8000/docs에서 Swagger UI로 API를 테스트할 수 있습니다.
CORS 정책으로 인해 프론트엔드와의 연결
문제가 발생할 수 있습니다.
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # 프론트엔드 URL로 변경
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
import cv2
def get_video_duration(video_path: str) -> float:
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
duration = frame_count / fps
cap.release()
return duration
import subprocess
def convert_to_vp9(input_path: str, output_path: str) -> bool:
command = [
"ffmpeg", "-i", input_path,
"-c:v", "libvpx-vp9", "-b:v", "1M",
"-c:a", "libopus", output_path
]
try:
subprocess.run(command, check=True)
return True
except subprocess.CalledProcessError:
return False
POST api/video/receive-video/
GET /api/video/video-send-feedback/{video_id}/
- FastAPI 문서: https://fastapi.tiangolo.com/
- Docker 문서: https://docs.docker.com/
- FFmpeg 문서: https://ffmpeg.org/documentation.html
- OpenCV 문서: https://docs.opencv.org/
- Mediapipe 문서: https://google.github.io/mediapipe/
- OpenAI Vision API 문서: https://platform.openai.com/docs/
- FastAPI CORS 미들웨어: https://fastapi.tiangolo.com/tutorial/cors/
__pycache__
*.pyc
*.pyo
*.pyd
.env
.git
.gitignore
*.md
*.ipynb
storage/
logs/
- Python 캐시 파일:
__pycache__
,.pyc
,.pyo
,.pyd
- 환경 파일:
.env
- Git 관련 파일:
.git
,.gitignore
- 문서 파일:
*.md
,*.ipynb
- 데이터 및 로그 디렉토리:
storage/
,logs/
- 기타:
fonts/
,htmlcov/
openai
pillow
tqdm
opencv-python
python-dotenv
numpy
fastapi
uvicorn
python-multipart
python-json-logger
colorlog
sentry-sdk[fastapi]
mediapipe
pytest
pytest-cov
pytest-mock
httpx
- 베이스 이미지 선택
python:3.12-slim
: 가벼운 Python 3.12 이미지를 사용하여 최종 이미지 크기를 최소화합니다.
- 환경 변수 설정
PYTHONDONTWRITEBYTECODE=1
: Python이.pyc
파일을 생성하지 않도록 설정.PYTHONUNBUFFERED=1
: Python 출력이 버퍼링되지 않고 즉시 터미널에 출력되도록 설정.
- 작업 디렉터리 설정
/app
디렉터리를 작업 디렉터리로 설정합니다.
- 시스템 종속성 설치
build-essential
,libffi-dev
,libssl-dev
,ffmpeg
,libsndfile1
등을 설치합니다.ffmpeg
: 오디오 및 비디오 처리에 필요합니다.libsndfile1
: 오디오 파일 처리를 위한 라이브러리입니다.
- Python 종속성 설치
requirements.txt
파일을 복사한 후,pip
을 업그레이드하고 필요한 Python 패키지를 설치합니다.
- 프로젝트 파일 복사
- 현재 디렉터리의 모든 파일을 컨테이너의
/app
디렉터리로 복사합니다.
- 현재 디렉터리의 모든 파일을 컨테이너의