Search

AI 서비스를 활용한 자동 심사 PoC

들어가며

이 문서는 AI 모델을 자체적으로 개발하지 않고, AI 서비스만을 사용하여 영상 분석 시 Rule-Base로 검수 기준에 어느정도 부합할 수 있을지를 검증하기 위한 PoC 내용을 담고 있습니다.
또한 AI 서비스에서 자체 AI 모델로 전환해야되는 시점을 예측하기 위한 추정 비용에 대한 정보를 제공합니다.

영상 검수 기준

1.
영상의 퀄리티가 충분해야함
a.
영상 길이가 최소 20초 이상이어야함
b.
영상에서 컷 전환 및 흔들림이 30% 이하이어야함
c.
얼굴/제품이 정상적으로 인식될 만큼 충분한 화질 및 밝기여야함
2.
제품들이 영상 내 등장해야함
3.
얼굴이 영상 내 등장해야함
a.
얼굴 면적이 최소 절반 이상은 노출되어야함
b.
전체 영상 중 얼굴 등장 시간 70% 이상이어야함
c.
얼굴이 화면의 35% 이상을 차지하는 장면이 전체의 50% 이상 포함해야함
4.
지정된 키워드가 영상 내 등장해야함
a.
기본적으로 Talking, Voiceover, On-Screen Text 중 하나의 형태로 포함해야함
b.
지정된 형태가 있다면 해당 형태로 키워드를 포함해야함
5.
지정된 행동이 영상 내 등장해야함
a.
도포 장면/기기 사용 등 가이드한 행동을 포함해야함
먼저 위의 영상 검수 기준을 통해 필요한 데이터들을 나열할 수 있습니다.
영상 데이터 (길이, 해상도, 비트레이트, 장면 수 등) → ffmpeg
음성 데이터 (transcript + timeline) → STT
분석 데이터 (face detection, label detection 등) → Rekognition
이러한 데이터들을 통해 기준을 만족하는지 Rule-Base로 검증할 수 있다고 판단되었습니다.
또한 데이터를 추출하기 위한 적절한 기술들이 라이브러리 또는 서비스로 존재하는 것을 확인했습니다.

데이터 파이프라인 도식화

분석을 위한 영상은 사용자가 SNS에 업로드한 영상이며 모든 데이터의 원천이 됩니다.
SNS 업로드 후 플랫폼에 제출하게 되면 먼저 이벤트 유실을 방지하기 위해 큐에 적재합니다.
가장 먼저 실행되는 함수는 migrator로 SNS에서 원본 영상을 다운로드 받아서 .mp4, .wav, .jpg 의 필요한 형태로 변환 후 저장합니다.
여기서 저장되는 .mp4, .wav 파일에 대한 PUT 이벤트를 트리거 삼아서 analyzer, extractor가 동작하게 됩니다.
analyzer는 Rekognition을 통해 영상을 분석하고, extractor는 STT API를 통해 음성의 스크립트를 추출합니다.
이로써 앞서 구하고자 했던 데이터들을 영상별로 적재하는 파이프라인을 구축하였습니다.

기술 톺아보기

Speech-to-Text

STT는 사람의 음성 신호를 컴퓨터가 이해할 수 있는 언어적 표현(문장, 단어)로 변환하는 기술입니다.
NHN Cloud Speech-to-Text Document
여기엔 아래와 같은 요소들로 구성됩니다.
음향 모델
음성 신호를 짧은 단위로 나누고, 변화하는 음향적 특징(주파수, 에너지 등)을 수치화된 벡터로 변환합니다.
수치화된 벡터를 통해 어떤 음소(phoneme)나 단어에 해당하는지 확률적으로 판단합니다.
언어 모델
음향 모델을 통해 음성 신호를 매핑한 단어 또는 문장의 시퀀스를 이해하고 다음에 나올 단어를 확률적으로 예측합니다.
특정 언어의 문법, 구문 구조, 어휘 선택 등 언어의 사용 규칙을 통계적으로 학습하여 음향 모델이 제시한 여러 단어 후보 중 문맥상 가장 자연스럽고 가능성이 높은 단어를 선택하도록 돕습니다.
디코딩
음향 모델, 언어 모델, 발음 사전을 모두 활용하여 최종적으로 텍스트를 출력하는 과정입니다.
음향 신호로부터 가능한 모든 단어 조합을 탐색 공간 내에서 검색하고, 음향 확률과 언어 확률을 종합하여 가장 확률이 높은 단어 시퀀스를 찾아냅니다.
이 과정은 Beam Search와 같은 탐색 알고리즘을 사용하여 효율적으로 최적의 경로를 찾습니다.
Google STT는 수백만 시간의 오디오 데이터와 수십억 개의 텍스트 문장으로 학습된 음성 모델인 Chirp를 사용합니다.
100개 이상의 언어/방언을 지원하며, Speech Adaptation 기능을 통해 특정 단어의 인식율을 올릴 수 있습니다.
또한 STT API v2에는 Chirp3 모델을 사용하여 Model Adaptation을 통한 자주 사용되는 단어들에 대한 인식율도 올릴 수 있습니다.
이외에도 자동으로 구두점을 삽입해주고, 단어/문장별 타임스탬프와 정확도를 제공해줍니다.
아래는 Google STT를 사용할 때 선택할 수 있는 옵션들을 조정해가며 정확도를 비교한 내용입니다.
인코딩
case1. MP4 → MP3 30.59%
case2. MP4 → WAV 91.24%
case3. MP4 → FLAC 91.24%
→ 무손실 압축의 음원 파일로 인코딩하는게 정확도가 높은걸 확인할 수 있었습니다.
버전
v1 → v2 90.20%
→ 기능 상 큰 차이를 느끼지 못했으며, 정확도가 오히려 낮아지는걸 확인할 수 있었습니다.
모델
default 모델 + enhanced 옵션 92.81%
video 모델 + enhanced 옵션 91.24%
→ video 모델은 인터뷰 영상 같은 정돈된 영상에 특화되어 잇는 것 같고, default 모델이 좀 더 정확도가 높은걸 확인할 수 있었습니다.
반면에 Google STT를 사용하면서 겪은 이슈들도 있었습니다.
언어 코드 이슈
API를 호출할 때 argument로 language_code를 입력해야 하지만 글로벌 서비스라서 발화자마다 서로 다른 언어를 사용하고 있었습니다.
만약 다른 언어 코드가 입력된다면 아래와 같이 정확도가 달라지는걸 확인할 수 있었습니다.
case1. en-US 92.81%
case2. es-ES 98.07%
이 이슈는 발화자의 언어 식별을 위해 OpenAI 의 whisper 모델을 통해 언어를 감지한 후 STT의 언어 코드와 매핑하여 전달하는 방식으로 대응하였습니다.
음성 길이 제한 이슈
Google Cloud Speech-to-Text Document
Google STT는 음성 파일에 대해 60초 이상이거나 10MB가 넘는다면 Google Cloud Storage 버킷에 파일을 저장한 후 사용하도록 강제하고 있습니다.
분석을 위해 사용되는 영상은 주로 1~3분의 길이를 갖고 있었고, 이 경우 API 응답으로 4xx가 응답됩니다.
이 이슈는 솔루션을 사용하기 위해 강제되는 조건이기 때문에 음성 파일을 59초씩 chunk를 나누어 API를 여러번 호출하는 방식으로 대응하였습니다.
하지만 이 방식은 만약 chunk로 인해 단어가 잘리게 된다면 정확도에 문제를 줄 수 있을걸로 예상됩니다.
배경 음악 정확도 이슈
이 이슈는 PoC 단계에선 cost가 많이 소모될 것으로 판단해서 원본 영상들엔 배경 음악이 없다고 가정하고 대응하지 않았습니다.
하지만 영상에서 발화자의 음성과 배경 음악의 음역대가 다를거라 생각되어 ffmpeg을 통해 음성 파일을 추출할 때 특정 채널만 뽑아서 사용하는 방식으로 시도 해볼 수 있을거라 생각됩니다.

Whisper

앞서 Google STT를 사용하면서 언어 감지를 위해 OpenAI의 Whisper를 사용하였지만 Whisper 역시도 STT를 지원하는 음성 인식 모델입니다.
Google STT와의 차이점은 tiny 와 small 사이즈의 로컬 모델을 제공한다는 점입니다.
로컬 모델을 사용하게 될 시 자체적인 컴퓨팅 리소스를 사용하여 비용이 부과되지 않게 되며, 클라우드 모델을 사용한다고 하더라도 1분 당 $0.006 밖에 발생하지 않습니다.
해당 모델을 실행하는 컴퓨팅 환경에 GPU가 없이 CPU를 사용한다면 처리 속도가 살짝 늦어질 수 있을거라 예상됩니다.
그리고 비용뿐만 아니라 정확도 또한 두 모델이 차이나는걸 확인할 수 있습니다.
Google STT 92.68%
OpenAI Whisper 94.77%
이렇게 Whisper는 강력한 표준 모델을 제공하지만, Google STT의 Speech Adaptation이나 Model Adaptation을 통한 도메인 언어 최적화는 불가능합니다.
또한 단어 간의 타임라인, 정확도 등의 데이터를 제공하지 않습니다.

Rekognition

Rekognition은 AWS에서 제공하는 클라우드 기반 이미지/영상 분석 서비스입니다.
이미지나 영상에서 객체 및 장면을 감지하고 분류하며, 좌표를 통한 위치까지 확인이 가능합니다.
제공하는 기능은 아래와 같습니다.
SegmentDetection
영상 내 의미있는 구간을 자동으로 구분하는 기능입니다.
영상에서 카메라 샷이 전환되는 컷 편집 구간을 감지할 수 있습니다.
{ "JobStatus": "SUCCEEDED", "VideoMetadata": [ { "Codec": "h264", // 비디오 압축 코덱 "DurationMillis": 39166, // 비디오 길이 "Format": "QuickTime / MOV", // 비디오 포맷 "FrameRate": 30, // 초당 프레임 수 "FrameHeight": 1280, // 비디오 높이 "FrameWidth": 720, // 비디오 너비 "ColorRange": "LIMITED" // 색상 레인지 종류 } ], "AudioMetadata": [ { "Codec": "aac", // 오디오 인코딩 방식 "DurationMillis": 39379, // 오디오 길이 "SampleRate": 44100, // 샘플레이트 "NumberOfChannels": 2 // 채널 개수 (1=Mono, 2=Stereo) } ], "Segments": [ { "Type": "SHOT", // Segment 유형 (SHOT은 카메라 컷, 장면 전환 감지) "StartTimestampMillis": 0, // 샷 시작 시점 "EndTimestampMillis": 33, // 샷 종료 시점 "DurationMillis": 33, // Segment 지속 시간 "StartTimecodeSMPTE": "00:00:00:00", // SMPTE 형식의 시작점 "EndTimecodeSMPTE": "00:00:00:01", // SMPTE 형식의 종료점 "DurationSMPTE": "00:00:00:01", // SMPTE 형식의 지속 시간 "ShotSegment": { "Index": 0, // 전체 샷 중 순서 번호 "Confidence": 95.0661239624023 // 장면 전환 정확도 }, "StartFrameNumber": 0, // Segment가 시작되는 프레임 번호 "EndFrameNumber": 1, // Segment가 끝나는 프레임 번호 "DurationFrames": 1 // 프레임 기준 지속 시간 } ], "JobId": "abcd-1234-efgh-5678" }
JSON
복사
LabelDetection
이미지 또는 영상에서 객체, 장면, 활동 등을 자동으로 인식해 라벨 형태로 제공하는 기능입니다.
객체를 인식하면 bounding box 좌표와 함께 정확도를 제공합니다.
{ "JobStatus": "SUCCEEDED", "VideoMetadata": { "Codec": "h264", // 비디오 압축 코덱 "DurationMillis": 39166, // 비디오 길이 "Format": "QuickTime / MOV", // 비디오 포맷 "FrameRate": 30, // 초당 프레임 수 "FrameHeight": 1280, // 비디오 높이 "FrameWidth": 720, // 비디오 너비 "ColorRange": "LIMITED" // 색상 레인지 종류 }, "Labels": [ { "Timestamp": 0, // 라벨이 감지된 시각 "Label": { "Name": "Adult", // 감지된 객체/개념 이름 "Confidence": 92.0456390380859, // 정확도 "Instances": [ { "BoundingBox": { // 감지된 객체/개념 위치 "Width": 0.996494472026825, "Height": 0.767342686653137, "Left": 0.0027968748472631, "Top": 0.230085581541061 }, "Confidence": 92.888786315918 // 정확도 } ], "Parents": [ // 상위 개념 라벨 { "Name": "Person" } ], "Aliases": [], // 동일 개념 라벨 "Categories": [ // 라벨이 포함된 카테고리 { "Name": "Person Description" } ] } } ], "JobId": "abcd-1234-efgh-5678" }
JSON
복사
ContentModeration
이미지 또는 영상에 유해하거나 민감한 컨텐츠가 포함되어 있는지 판단하는 기능입니다.
부적절한 컨텐츠를 인식하면 bounding box 좌표와 함께 위험도 레벨을 제공합니다.
{ "JobStatus": "SUCCEEDED", "VideoMetadata": { "Codec": "h264", // 비디오 압축 코덱 "DurationMillis": 39166, // 비디오 길이 "Format": "QuickTime / MOV", // 비디오 포맷 "FrameRate": 30, // 초당 프레임 수 "FrameHeight": 1280, // 비디오 높이 "FrameWidth": 720, // 비디오 너비 "ColorRange": "LIMITED" // 색상 레인지 종류 }, "ModerationLabels": [ { "Timestamp": 1333, // 라벨이 감지된 시점 "ModerationLabel": { "Confidence": 98.5, // 정확도 "Name": "Nudity", // 유해 요소 라벨 "ParentName": "Explicit Nudity" // 상위 카테고리 } } ], "ModerationModelVersion": "7.0", "JobId": "abcd-1234-efgh-5678" }
JSON
복사
TextDetection
이미지 또는 영상에서 어떤 문자가 포함되어 있는지 판단하는 기능입니다.
문자를 인식하면 bounding box 좌표와 함께 타임스탬프와 정확도를 제공합니다.
{ "JobStatus": "SUCCEEDED", "VideoMetadata": { "Codec": "h264", // 비디오 압축 코덱 "DurationMillis": 39166, // 비디오 길이 "Format": "QuickTime / MOV", // 비디오 포맷 "FrameRate": 30, // 초당 프레임 수 "FrameHeight": 1280, // 비디오 높이 "FrameWidth": 720, // 비디오 너비 "ColorRange": "LIMITED" // 색상 레인지 종류 }, "TextDetections": [ { "Timestamp": 0, // 텍스트가 감지된 시점 "TextDetection": { "DetectedText": "No Makeup,", // 감지된 텍스트 "Type": "LINE", // 유형 (WORD 또는 LINE) "Id": 0, // 텍스트 순서 번호 "Confidence": 99.7391204833984, // 정확도 "Geometry": { "BoundingBox": { // 영상 대비 상대 위치 "Width": 0.352538973093033, "Height": 0.03350830078125, "Left": 0.185546830296516, "Top": 0.255981415510178 }, "Polygon": [ // 텍스트 영역을 이루는 꼭짓점 좌표 { "X": 0.185546830296516, "Y": 0.255981415510178 }, { "X": 0.53808581829071, "Y": 0.255981415510178 }, { "X": 0.53808581829071, "Y": 0.289489716291428 }, { "X": 0.185546830296516, "Y": 0.289489716291428 } ] } } } ], "TextModelVersion": "3.1", "JobId": "abcd-1234-efgh-5678" }
JSON
복사
FaceDetection
이미지 또는 영상에서 사람의 얼굴을 탐지하고 특징, 속성, 감정, 인구통계 등을 분석하는 기능입니다.
얼굴을 인식하면 얼굴이 위치한 bounding box 좌표와 눈/코/입/귀 등의 위치정보를 제공합니다.
나이 범위, 성별, 안경 여부, 마스크 여부, 감정 등을 제공합니다.
{ "JobStatus": "SUCCEEDED", "VideoMetadata": { "Codec": "h264", // 비디오 압축 코덱 "DurationMillis": 39166, // 비디오 길이 "Format": "QuickTime / MOV", // 비디오 포맷 "FrameRate": 30, // 초당 프레임 수 "FrameHeight": 1280, // 비디오 높이 "FrameWidth": 720, // 비디오 너비 "ColorRange": "LIMITED" // 색상 레인지 종류 }, "Faces": [ { "Timestamp": 0, // 얼굴이 감지된 시점 "Face": { "BoundingBox": { // 영상 대비 상대 위치 "Width": 0.392862290143967, "Height": 0.296591132879257, "Left": 0.297679483890533, "Top": 0.299290329217911 }, "Landmarks": [ // 얼굴 특징 포인트 위치 { "Type": "eyeLeft", "X": 0.403123557567596, "Y": 0.406613826751709 }, { "Type": "eyeRight", "X": 0.5893594622612, "Y": 0.405537992715836 }, { "Type": "mouthLeft", "X": 0.422483265399933, "Y": 0.515840172767639 }, { "Type": "mouthRight", "X": 0.578358292579651, "Y": 0.514985918998718 }, { "Type": "nose", "X": 0.499834388494492, "Y": 0.465827316045761 } ], "Pose": { // 얼굴 방향 "Roll": -0.63594925403595, // 좌우로 기울어진 정도 "Yaw": 1.67972433567047, // 좌우로 돌아간 정도 "Pitch": 3.08268308639526 // 위아래로 향한 정도 }, "Quality": { // 화질 "Brightness": 94.3486785888672, // 밝기 "Sharpness": 95.5161895751953 // 선명도 }, "Confidence": 99.9995574951172 // 정확도 } } ] "JobId": "abcd-1234-efgh-5678" }
JSON
복사
PersonTracking
영상에서 사람을 탐지하고 프레임별로 사람의 위치 변화를 추적하는 기능입니다.
사람을 인식하면 각 사람의 bounding box 좌표와 타임스탬프 정보를 제공합니다.
{ "JobStatus": "SUCCEEDED", "VideoMetadata": { "Codec": "h264", // 비디오 압축 코덱 "DurationMillis": 39166, // 비디오 길이 "Format": "QuickTime / MOV", // 비디오 포맷 "FrameRate": 30, // 초당 프레임 수 "FrameHeight": 1280, // 비디오 높이 "FrameWidth": 720, // 비디오 너비 "ColorRange": "LIMITED" // 색상 레인지 종류 }, "Persons": [ { "Timestamp": 0, // 사람이 감지된 시점 "Person": { "Index": 0, // 동일 인물을 추적할 수 있는 고유 ID "BoundingBox": { // 영상 대비 상대 위치 "Width": 0.28, "Height": 0.45, "Left": 0.35, "Top": 0.30 }, "Face": { // 얼굴 위치 (감지된 경우만) "BoundingBox": { "Width": 0.14, "Height": 0.18, "Left": 0.41, "Top": 0.33 }, "Confidence": 99.8 // 정확도 } } } ], "JobId": "abcd-1234-efgh-5678" }
JSON
복사

데이터 유효성 확인

이제 앞서 살펴본 기술들을 통해 얻은 데이터들로 검수 기준에 어떻게 부합할 수 있는지 검증해보도록 하겠습니다.
검수 기준을 다시 확인해보면서 각 항목들을 어떻게 검증할 수 있는지 매칭시키면 다음과 같습니다.
1.
영상의 퀄리티가 충분해야함
a.
영상 길이가 최소 20초 이상이어야함
ffmpeg을 통한 길이 분석 or Rekognition을 통한 VideoMetadata에서 길이 분석
b.
영상에서 컷 전환 및 흔들림이 30% 이하이어야함
Rekognition의 SegmentDetection을 통한 Segment 변화 분석
c.
얼굴/제품이 정상적으로 인식될 만큼 충분한 화질 및 밝기여야함
Rekognition의 FaceDetection을 통한 밝기, 선명도 분석
2.
제품들이 영상 내 등장해야함
Rekognition의 Custom Label 학습을 통해 LabelDetection 분석
3.
얼굴이 영상 내 등장해야함
a.
얼굴 면적이 최소 절반 이상은 노출되어야함
Rekognition의 FaceDetection을 통한 Bounding Box 분석
b.
전체 영상 중 얼굴 등장 시간 70% 이상이어야함
Rekognition의 FaceDetection을 통한 Bounding Box 분석
c.
얼굴이 화면의 35% 이상을 차지하는 장면이 전체의 50% 이상 포함해야함
Rekognition의 FaceDetection을 통한 Bounding Box 분석
4.
지정된 키워드가 영상 내 등장해야함
a.
기본적으로 Talking, Voiceover, On-Screen Text 중 하나의 형태로 포함해야함
b.
지정된 형태가 있다면 해당 형태로 키워드를 포함해야함
Talking 형태의 경우 STT를 통한 스크립트 분석
Voiceover 형태의 경우 STT를 통한 스크립트 분석
On-Screen Text 형태의 경우 Rekognition의 TextDetection을 통한 Text 분석
5.
지정된 행동이 영상 내 등장해야함
a.
도포 장면/기기 사용 등 가이드한 행동을 포함해야함
추가적인 모델 또는 알고리즘을 통한 모션 분석
검수 기준을 하나씩 살펴보면 특정 제품 또는 행동이 영상에 등장해야 하는 경우를 제외하곤 분석이 가능하다고 판단됩니다.
이제 실제로 제출된 영상과 추출된 데이터들로 유효성 검증을 진행해보겠습니다.
실제 유저 영상 (모자이크 처리)
No makeup, just sunscreen and i’m glowing like this.
Ok guys, GRWM in just one minute.
No foundation needed.
This alone gives you that fresh, clean girl look.
This is new sunscreen from medicube.
It’s sunscreen, but it double as skincare with hydrolyzed collagen for extra skin benefits.
No Cast, Just Glow.
Fresh, Effortless, Confident.
On top of that, this product is officially certified as an OTC sunscreen.
It’s perfect for makeup prep as well.
Super Hydrating, Super Lightweight.
So, You Must To Try It.
영상 원본 발화 스크립트
영상 길이
"VideoMetadata": { "Codec": "h264", "DurationMillis": 39166, "Format": "QuickTime / MOV", "FrameRate": 30.0, "FrameHeight": 1280, "FrameWidth": 720, "ColorRange": "LIMITED" }
JSON
복사
Rekognition이 분석한 VideoMetadata에서 DurationMillis는 밀리초(ms)단위로 39166ms = 39.166초로 분석되어서 영상 길이에 대한 검수가 가능한 것이 확인됩니다.
영상 화질
Rekognition의 FaceDetection에서 분석한 각 얼굴 장면마다의 Brightness와 Sharpness의 평균을 구하면 94.40점, 97.19점이 나오며, 기준점을 통해 영상 화질에 대한 검수가 가능한 것이 확인됩니다.
영상 컷 전환/흔들림
Rekognition의 SegmentDetection에서 분석한 각 SHOT마다의 Duration을 장면별로 노출되는 시간으로 간주하고 전체 영상 길이에서 컷 전환으로 인해 유실된 시간이 30% 이하인지 판단하는 방식으로 검수가 가능한 것이 확인됩니다.
흔들림의 경우는 SegmentDetection으론 판단이 불가능하며, FaceDetection을 통해 분석한 Bounding Box의 좌표 오차로 유추할 수 있을거라 생각됩니다.
SegmentDetection의 분석을 통해 영상을 검증한 결과 전체 영상 길이 대비 컷 전환으로 인해 유실된 길이가 1.02%인 것을 확인할 수 있었습니다.
제품
Rekognition Custom Label으로 학습을 통해서만 감지할 수 있다는 한계가 존재합니다.
얼굴
Rekognition의 FaceDetection은 동영상을 샘플 단위(얼굴이 발견된 순간)로 분석해서 결과를 제공합니다.
또한 FaceDetection은 인물의 신체가 아닌 얼굴만을 감지하기 때문에 검수 기준에서 제시한 35%, 50%를 사용하기엔 수치가 알맞지 않다는 문제가 있습니다.
분석된 데이터에선 전체 샘플 수 같은 데이터를 제공하지 않기 때문에 전체 영상 프레임에서 얼굴이 등장한 프레임 비율을 구할 수 없었습니다.
그래서 각 샘플 간의 중앙값을 통해 샘플링 주기를 추정하고 전체 영상 길이로부터 총 샘플 수를 구해서 계산하는 방식으로 대응하였습니다.
그리고 얼굴 면적에 대한 35%, 50%의 기준을 5%, 10%로 낮춰서 계산하는걸로 대응하였습니다.
위처럼 보정을 거치고 영상에 대한 검증을 진행 했을 때 모든 프레임에서 100% 얼굴이 등장했고, 10% 이상의 면적을 가진걸 확인할 수 있었습니다.
키워드
음성에 대한 키워드 검증을 진행할 수 있는 STT와 TextDetection 두 가지 경우에서 모두 검출하고자 했던 키워드인 medicube를 정상적으로 검출한 것을 확인할 수 있었습니다.
행동
Rekognition으론 모션을 감지할 수 없다는 한계가 존재합니다.

추정 비용 계산

이제 구축한 데이터 파이프라인이 어느정도의 비용이 발생하는지 계산해보겠습니다.
모든 비용은 서울 리전(ap-northest-2)을 기준으로 계산하였습니다.
또한 Lambda는 S3 Endpoint 가 존재하는 VPC 안에 있다고 가정하여, Transfer 비용은 제외하였습니다.
SQS(표준 대기열) 요금
Lambda 요금
Rekognition 요금
SNS 요금
S3 요금
요금표들을 기준으로 월당 100만개의 영상이 제출된다고 가정하였을 때
SQS 요금
월 100만개까지는 무과금
Lambda 요금
호출 비용 : 4개의 Instance = $0.8/100만
실행 비용 : 4개의 Instance * 1GB 메모리 * 약 3분의 실행 = $12.024/100만
메모리 비용 : 4개의 Instance * 1GB 메모리 * 약 3분의 실행 = $12,000.024/100만
Google STT 요금
처리 비용 : 영상 당 약 2분 = $48,000/100만
Rekognition 요금
처리 비용 : 영상 당 약 2분 * 5개의 API = $1,200,000/월
SNS 요금
데이터 송신 비용 : Rekognition callback 당 약 1KB의 payload * 5개의 API = $63/월
데이터 수신 비용 : Lambda로 수신하는 경우 무과금
S3 요금
보관 비용 : 500TB 초과 기준 영상 당 약 5MB의 파일 = $115/월
PUT 비용 : 영상 당 약 20개의 파일 = $90/100만
다른 비용들은 미미한 정도지만 Google STT와 Rekognition 비용이 확실히 많이 부과되는걸 확인할 수 있습니다.
반대로 Lambda, STT, Rekognition, SNS 요금만을 계산해서 영상 한 건당 비용을 계산한다면 다음과 같을걸로 추정됩니다.
Lambda 요금
호출 비용 : 4개의 Instance = $0.0000008
실행 비용 : 4개의 Instance * 1GB 메모리 * 약 3분의 실행 = $0.000012024
메모리 비용 : 4개의 Instance * 1GB 메모리 * 약 3분의 실행 = $0.012000024
Google STT 요금
처리 비용 : 영상 당 약 2분 = $0.048
Rekognition 요금
처리 비용 : 영상 당 약 2분 * 5개의 API = $1.2
SNS 요금
데이터 수신 비용 : 5개의 API = $0.00000063
$1.260013478 가 부과됩니다.

결론

위 내용들을 종합 했을 때 AI 모델을 자체적으로 구축할 필요 없이 존재하는 서비스 혹은 라이브러리를 사용하여 대부분의 영상 분석은 가능한 것으로 생각됩니다.
또한 유료 서비스인 Google STT 보다 무료 서비스인 OpenAI Whisper의 정확도가 더 높은 것이 놀라운 부분이었습니다.
하지만 Rekognition의 분석 데이터에 의존적이며, 과도한 Rekognition의 비용이 부담이 될 것 같습니다.
영상 단건 기준으로는 큰 비용이 부과되지 않지만 처리해야하는 영상의 갯수가 많아질 경우 비용도 비례적으로 늘어날 것으로 예상되어서, 서비스의 성장 속도를 모니터링하며 On-premise 의 AI 모델을 구축하는 등의 대안이 필요해보입니다.
그리고 모션 인식에 대한 한계점이 분명하게 존재하여 이를 극복하기 위해서는 다른 모델을 사용할 필요가 있어보입니다.