개요 : 특정인물의 이미지를 바탕으로 비디오에서 특정인물이 담긴 구간만을 편집해 하나의 비디오로 추출하는 서비스
이 아이디어는 최근 영상 편집 분야에서 주목을 받았던 'AI 기반 자동 편집' 기능에서 영감을 받았다.
프리미어 프로의 플러그인 스타일로 지원을 하는 것으로 기억하는데, 이를 AWS에서 지원하는 AI기술로도 비슷하게 구현해볼 수 있지 않을까라는 생각에 진행하게 되었다.
Rekognition
AWS에서 제공하는 딥 러닝 기반의 이미지/동영상 분석 서비스로, 객체감지, 이미지 분석, 이미지 내의 텍스트 추출과 같은 분석을 할 수 있다.
이미지/동영상 분석을 활용할 수 있는 여러가지 솔루션을 제공해주는 모습을 볼 수 있다.
이번 프로젝트에서 주로 사용할 부분은 Rekognition을 이용해 비디오(인터뷰 영상이나 무대/공연 영상 등)에서 원하는 인물이 나온 구간만 편집해 새로운 하나의 비디오로 결과물을 추출하고자 한다.
Rekognition API Docs
아키텍쳐 구조
완전 서버리스 식으로도 구성할 수 있으나, 백엔드랑 배포 관련해서 공부나 할 겸 해서 FastAPI로 백엔드를 구성하고자 한다.
분석-Cliping 워크로드가 정리되면 실제 서비스 배포에 가깝게 cloudfront나 로드밸런서 등을 추가적으로 도입할 수도 있다.
서비스 스택
- Rekognition : 특정인물 탐지 API
- Elastic Transcoder : 영상 작업(인물이 탐지된 구간만 Cliping 후 이어붙이기)
- S3 : 비디오와 이미지를 업로드, 결과 비디오도 저장
- DynamoDB : job과 관련된 정보 삽입(job_id, 파일 이름 등)
- Lambda : 각 api 호출, 작업
- SNS : 작업 결과 등을 publish
- SQS : 다수의 비디오 작업을 처리 시 쓰로틀링 방지
가장 핵심이 되는 서비스인 Rekognition은 인물을 탐지하는 전 구간에서 이 서비스의 API가 사용된다.
Rekognition API
이번 프로젝트에서 사용되는 Rekognition API는 CreateCollection, IndexFaces, StartFaceSearch와 GetFaceSearch이다.
Rekognition은 실제 얼굴 데이터를 저장하지 않고, 자체 얼굴 탐지 알고리즘을 통해 Facial Feature를 Feature Factor로 추출해 저장한다고 한다. 이렇게 추출한 Feature Factor는 Collection이라는 객체로 저장을 한다.
각 Rekognition API의 동작은 아래 표와 같다.
API명 | 설명 |
CreateCollection | 얼굴 정보(Face)가 담길 Collection을 생성 |
IndexFaces | 주어진 이미지에서 얼굴을 탐지하고 얼굴 정보(Face)를 Collection에 저장 |
StartFaceSearch | Collection에 존재하는 Face를 저장된 Video에서 탐색하는 작업을 시작 |
GetFaceSearch | StartFaceSearch 작업id를 검색해 작업결과를 반환 |
따라서 이 프로젝트에서는 한 작업(job_id)에 대해 Collection을 생성한 뒤, 비디오와 함께 업로드된 탐지 대상의 이미지 파일에서 IndexFace를 통해 해당 얼굴의 Feature Factor를 추출해 Collection에 저장한다.
그 다음으로 Collection과 비디오 파일을 통해 StartFaceSearch를 시작한다. GetFaceSearch로 StartFaceSearch의 job id로 작업결과를 조회하고 가져오면 비디오에서 주어진 이미지의 얼굴을 탐지한 결과를 얻을 수 있다.
Video 분석과정
- 얼굴 이미지와 비디오를 s3에 저장 (FastAPI)
- 작업id에 따른 Collection을 만들고 검색할 얼굴이 담긴 이미지를 Collection에 저장 (IndexFaces)
(Lambda 1 - S3 notification으로 트리거) - IndexFace 작업이 끝나면 결과 내용을 SNS Publish
- StartFaceSearch 작업 시작
(Lambda 2 - SNS로 트리거) - video 분석의 completion status를 SNS topic에 publish
- status가 successful (SQS 큐나 lambda로 연결가능) → GetFaceSearch 호출
- 얼굴이 탐지된 timestamp들의 목록을 리턴받음
- timestamp 목록을 Elastic Transcoder가 Clip Stitching 후 결과 영상 버킷에 저장
작업 Repository