BLOG
몇시간 동안 비디오 영상으로 특정 인물을 찾기를 원해 본 적이 있으신가요?
이 블로그 포스트에서는 긴 비디오를 특정 인물의 모든 동영상을 보여 주는 하이라이트 비디오로 자동 변환하기 위해 Amazon Rekognition Video와 Amazon Elastic Transcoder의 기능을 결합하는 방법에 대해 알아볼 것입니다.
간단한 시연
이 과정을 시연하기 위해 AWS Technical Trainer의 하루를 담은 비디오를 사용하겠습니다. 비디오를 보시면, 카메라에 대고 이야기하고, 고객들을 훈련시키고, 사무실 여기저기를 돌아다니는 것이 특징이라는 것을 아실 겁니다.
이 동영상은 이 블로그 포스트에서 설명할 프로세스를 통해 실행되었으며, 이 블로그는 특별하게 선정된 사람의 동영상을 자동으로 생성해 줍니다. 다음 결과 비디오를 통해 최종 제품을 확인하십시오.
사실, MJ의 비디오는 두 개의 다른 장면이 자동으로 결합되었기 때문에 하나의 연속적인 장면처럼 보입니다. 장면들이 어디에서 함께 결합되었는지를 발견하기 위해 자세히 살펴봐야 할 것입니다!
과정
다음은 하이라이트 비디오를 만드는 데 사용되는 전체적인 과정입니다.
- 인식되어야 할 사람들을 가르치면서, Amazon Rekognition에서 얼굴 컬렉션을 생성합니다.
- 저장된 비디오 파일에서 얼굴을 검색하려면 Amazon Rekognition 비디오를 사용합니다.
- 얼굴이 인식된 개별 타임 스탬프를 수집하여 지정된 지속 시간의 클립으로 변환합니다.
- Amazon Elastic Transcoder를 사용하여 새 비디오를 함께 고정합니다.
각 단계는 다음과 같이 설명됩니다.
1단계: 얼굴 컬렉션 생성하기
Amazon Rekognition 얼굴 컬렉션에는 사진 및 비디오에서 인식하려는 얼굴에 대한 정보가 포함되어 있습니다. 이는 컬렉션 생성을 호출하여 소프트웨어 SDK 또는 AWS 명령줄 인터페이스를 사용하여 생성할 수 있습니다. 생성-수집 명령을 사용했습니다.
$ aws rekognition create-collection –collection-id trainers
그런 다음 index-faces 명령을 사용하여 영상을 직접 통과시키거나 Amazon S3에 저장된 개체를 참조하여 개별 면을 컬렉션에 로드할 수 있습니다.
$ aws rekognition index-faces
–collection-id trainers
–image “S3Object={Bucket=<my-bucket>,Name=john.jpg}”
–external-image-id John
ExternalImageID는 얼굴에 친근한 이름을 부착하는 데 사용될 수 있습니다. 이 ID는 사진이나 비디오에서 해당 얼굴이 감지될 때 반환됩니다.
저의 비디오를 위해, 저는 직원 디렉토리에서 각 개인의 사진을 가져오거나, 비디오의 프레임에서 그들의 사진을 복사했습니다. 그런 다음 index-face 명령을 실행하여 각 사용자에 대한 얼굴을 로드했습니다.
Amazon Rekognition은 감지된 얼굴들을 실제로 저장하지는 않는 대신, 기본 탐색 알고리즘이 먼저 입력 영상의 면을 탐지하고 얼굴 형상을 형상 벡터로 추출하며, 이 벡터는 백엔드 데이터베이스에 저장됩니다. Amazon Rekognition은 얼굴 일치 및 검색 작업을 수행할 때 이러한 기능 벡터를 사용합니다.
2단계: 비디오에서 얼굴을 검색합니다.
Amazon Rekognition은 사진, 저장된 비디오 및 스트리밍 비디오의 얼굴을 인식할 수 있습니다. 이 프로젝트를 위해, Amazon S3에 저장된 비디오에서 얼굴을 찾고 싶어서, StartFaceSearch를 수행하였습니다.
$ aws rekognition start-face-search
–video “S3Object={Bucket=<my-bucket>,Name=trainers.mp4}”
–collection-id trainers
얼굴 탐색은 비디오 길이에 따라 몇 분 정도 걸릴 것입니다. 원하는 경우 검색이 완료되면 Amazon Simple Notification Service 항목에 통지를 보낼 수 있으며, 이 경우 후속 프로세스가 트리거될 수 있습니다.
얼굴 탐색 결과는 사람, 타임 스탬프 및 얼굴 일치 항목 목록입니다.
{
“Persons”: [
{
“Timestamp”: 7560,
“FaceMatches”: [
{
“Face”: {
“BoundingBox”: {
“Width”: 0.6916670203208923,
“Top”: 0.1909089982509613,
“Left”: 0.14166699349880219,
“Height”: 0.46111100912094116
},
“FaceId”: “6b62481e-06fa-48ea-a892-b8684548958b”,
“ExternalImageId”: “John”,
“Confidence”: 99.99750518798828,
“ImageId”: “ad98b04a-6b06-5ca5-b5ce-4db389c65c18”
},
“Similarity”: 89.65567016601562
}
],
},
{
“Timestamp”: 7640,
…
비디오에서 감지된 모든 얼굴들이 나열되지만, Amazon Rekognition Video가 얼굴 컬렉션에 일치하는 얼굴을 발견할 때마다, 얼굴의 친근한 이름을 포함할 것입니다. 따라서 ‘John’의 ExternalImageID가 있는 어떤 기록들을 찾아야 할 뿐입니다.
또한 신뢰 등급(99.99%이상으로 표시됨)을 사용하여 거짓 일치를 제거할 기회로 사용할 수 있습니다.
얼굴 탐색 결과는 상당히 클 수 있습니다. 3분 17초 비디오에서는 984개의 타임 스탬프를 제공했는데, 이 중 124개의 ‘John’이 프레임에 있는 것으로 식별되었습니다.
3단계: 타임 스탬프를 scene으로 변환하기
마지막 단계는 지정된 사람과 장면만 보여 주는 결과 비디오를 생성하는 것입니다. 하지만 얼굴 탐색 결과는 해당 사람이 나타나는 타임 스탬프 목록에 불과합니다. 그렇다면 어떻게 하면 이러한 타임 스탬프를 기반으로 한 새 비디오를 만들 수 있을까요?
정답은 여러 클립을 결합하여 하나의 출력 비디오를 만들 수 있는 Amazon Elastic Transcoder를 사용하는 것입니다. 이를 클립 스티칭이라고 합니다. 클립은 여러 원본 비디오에서 가져올 수 있으며, 제 경우에는 같은 입력 비디오의 여러 부분에서 가져올 수 있습니다.
Amazon Rekognition Video의 타임 스탬프를 Elastic Transcoder용 입력으로 변환하기 위해 다음과 같은 Python 스크립트를 썼습니다.
- GetfaceSearch를 호출하여 얼굴 탐색 결과를 검색합니다.
- 지정된 사람이 나타날 때마다 타임 스탬프를 추출합니다.
[99800, 99840, 100000, 100040, …]
- 타임 스탬프를 사람이 나타나는 장면으로 변환하고, 각 장면의 시작 및 종료 타임 스탬프를 기록합니다.
[(99800, 101480), (127520, 131760), …]
- Elastic Transcoder에 필요한 장면의 형식을 변환합니다.
[
{‘Key’: ‘trainers.mp4’, ‘TimeSpan’: {‘StartTime’: ‘99.8’, ‘Duration’: ‘1.68’}},
{‘Key’: ‘trainers.mp4’, ‘TimeSpan’: {‘StartTime’: ‘127.52’, ‘Duration’: ‘4.24’}},
…
]
”’
Extract timestamps from Amazon Rekognition Video Face Search
Then use Amazon Elastic Transcoder to stitch the clips together
”’
import boto3
# Connect to Amazon Rekognition
client = boto3.client(‘rekognition’, region_name = ‘ap-southeast-2’)
# Retrieve the face search results
person_to_find = ‘Karthik’
timestamps=[]
search = client.get_face_search(JobId=’…’, SortBy=’INDEX’)
while (True):
for person in search[‘Persons’]:
try:
for face_matches in person[‘FaceMatches’]:
if face_matches[‘Face’][‘ExternalImageId’] == person_to_find:
timestamps.append(person[‘Timestamp’])
except KeyError:
pass
# Retrieve the next set of results
try:
next_token = search[‘NextToken’]
search = client.get_face_search(JobId=’…’, SortBy=’INDEX’, NextToken = search[‘NextToken’])
except KeyError:
break
”’
The timestamps array now looks like:
[99800, 99840, 100000, 100040, …]
”’
# Break into scenes with start & end times
scenes=[]
start = 0
for timestamp in timestamps:
if start == 0:
# First timestamp
start = end = timestamp
else:
# More than 1 second between timestamps? Then scene has ended
if timestamp – end > 1000:
# If the scene is at least 1 second long, record it
if end – start >= 1000:
scenes.append((start, end))
# Start a new scene
start = 0
else:
# Extend scene to current timestamp
end = timestamp
# Append final scene if it is at least 1 second long
if (start != 0) and (end – start >= 1000):
scenes.append((start, end))
”’
The scenes array now looks like:
[(99800, 101480), (127520, 131760), …]
”’
# Convert into format required by Amazon Elastic Transcoder
inputs=[]
for scene in scenes:
start, end = scene
inputs.append({
‘Key’: ‘trainers.mp4’,
‘TimeSpan’: {
‘StartTime’: str(start/1000.),
‘Duration’: str((end-start)/1000.)
}
})
”’
The inputs array now looks like:
[
{‘Key’: ‘trainers.mp4’, ‘TimeSpan’: {‘StartTime’: ‘99.8’, ‘Duration’: ‘1.68’}},
{‘Key’: ‘trainers.mp4’, ‘TimeSpan’: {‘StartTime’: ‘127.52’, ‘Duration’: ‘4.24’}},
…
]
”’
# Call Amazon Elastic Transcoder to stitch together a new video
client = boto3.client(‘elastictranscoder’, region_name = ‘ap-southeast-2’)
job = client.create_job(
PipelineId = ‘…’,
Inputs=inputs,
Output={‘Key’: person_to_find + ‘.mp4’, ‘PresetId’: ‘…’}
)
스크립트는 결과 비디오를 만들기 위해 Elastic Transcoder 생성 작업 명령을 호출하여 종료됩니다. 몇 초 후에, 그 비디오는 Amazon S3 버켓에 나타납니다. 그런 다음 다른 사람의 이름으로 스크립트를 다시 실행하여 해당 사람과 관련된 다른 비디오를 만들었습니다.
그것이 바로 여러분이 자신의 비디오에서 스타가 될 수 있는 방법이에요!
원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/automated-video-editing-with-you-as-the-star/
** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.