BLOG

Amazon Rekognition Video를 사용하여 확장 및 적용 가능한 비디오 처리 파이프 라인 구축하기
작성일: 2018-07-19

이 게시물은 VidMob의 소프트웨어 엔지니어인 Joe Monti의 게스트 포스팅입니다. Vidmob은, 그들이 설명하길, “고도로 숙련 된 제작자 네트워크를 통해 통찰력 중심의 개인화되고 확장 가능한 마케팅 커뮤니케이션을 개발할 수 있는 혁신적인 기술 솔루션을 갖춘 세계 최고의 비디오 제작 플랫폼입니다. VidMob 제작자는 모든 소셜/ 디지털 채널, 형식 및 언어에서 전체 비디오 콘텐츠를 제작할 수 있도록 교육을 받았습니다.”라고 했습니다.

 

비디오는 자동화된 콘텐츠 인식, 특히 복잡한 대규모의 실시간 응용프로그램에서 사용하기 위한 고유한 문제를 제기합니다. 딥 러닝 알고리즘은 구현 및 사용이 어려울 뿐만 아니라 대형 비디오 파일 및 대형 출력 파일을 처리 할 때 많은 컴퓨팅 성능이 필요합니다. AWS에서 사용할 수 있는 풍부한 도구 및 서비스와 결합된 Amazon Rekognition은 이러한 많은 어려운 부분을 훨씬 쉽게 만듭니다. 이를 통해 우리는 이렇게 멋지고 유용한 응용프로그램을 구축하는 데 집중할 수 있습니다.

이 글은 비디오 파일에 대한 콘텐츠 인식을 수행하기 위해 확장성이 높고 적용 가능한 처리 파이프 라인의 핵심 구성 요소를 안내합니다.

 

아키텍처 개요

다음 아키텍처는 콘텐츠 인식을 통해 비디오를 처리하고 사용 가능한 데이터셋을 구축하는데 많은 AWS 서비스를 결합합니다.

 

 

프로세스가 새 비디오를 수집하고 보류중인 미디어 인식을 위해 메시지가 Amazon SQS 대기열로 보내지면서 시스템에서 시작됩니다. 이 대기열은 Amazon Rekognition API의 처리량을 관리하는 버퍼 역할을 합니다. 다음 단계는 SQS 대기열을 처리하고 프로세스 인식 단계 기능을 시작하기 위해 고정 요율 일정에 구성된 Amazon CloudWatch 이벤트에 의해 트리거됩니다. 이 단계 함수는 여러 AWS Lambda 함수를 조정하여 후속 Amazon Rekognition 요청 및 데이터 처리를 관리합니다.

 

Amazon Rekognition을 통한 요청 처리를 위한 스텝 기능

단계 함수는 코드 실행을 조정하는 시스템으로 생각할 수 있으며 제어 흐름 논리를 제공하여 다음에 수행할 작업을 결정할 수 있습니다. 따라서 단계 함수를 사용하여 비디오 처리 파이프 라인의 기능을 신속하게 개발, 테스트, 배포 및 개선할 수 있습니다. 이 예제의 경우 AWS Step Functions에서 생성된 단계 함수를 사용하여 여러 콘텐츠 Amazon Rekognition API 작업을 통해 비디오를 처리 할 수 ​​있는데 다음 이미지에서는 Amazon Rekognition 요청을 시작, 대기 및 처리하는 간단한 단계 함수를 보여줍니다.

 

 

이 단계 함수의 상태는 다음과 같습니다.

  1. Start Recognition – Amazon Rekognition 작업을 시작하고 추적하는 Lambda 함수입니다. 비디오의 Amazon Rekognition API 작업은 비동기식이므로 Amazon Rekognition 작업을 시작하고 완료 할 때까지 기다려야 합니다.
  2. Await Recognition – Amazon Rekognition 프로세스가 완료 될 때까지 일정 시간 동안 잠자기 상태가 되는 대기 상태입니다.
  3. Update Recognition Status– 비동기 Amazon Rekognition 작업이 완료되었다는 알림을 모니터링하는 Lambda 함수입니다. 그런 다음 계속할 수 있을 때 단계 함수로 신호를 보냅니다.
  4. Check Recognition Complete– 이전 단계를 보고 대기를 재시도할지, Amazon Rekognition 요청 실패 여부 또는 계속할지 여부를 결정하는 선택 상태입니다.
  5. Process Recognition Response- 비디오에 대한 요청된 모든 작업의 ​​응답 데이터를 응용 프로그램에 적합한 데이터셋으로 처리하는 Lambda 함수입니다.

 

단계 함수에서 Lambda 함수 사용하기

비디오 인식 처리를 위한 Lambda 함수는 세 가지 주요 AWS 서비스에 의존합니다.

  • Amazon Rekognition -이 기능은 개별 Rekognition 작업을 시작하고 상태를 검색하고 결과를 검색하는 데 사용됩니다.
  • Amazon S3 – 비디오 파일과 가공되지 않은 Amazon Rekognition 출력이 Amazon S3에 저장됩니다.
  • Amazon RDS – Amazon Rekognition 요청 및 관련 데이터는 MySQL RDS 인스턴스에 저장됩니다.

다음은 단계 함수에서 사용되는 Lambda 함수를 지원하는 데 필요한 코드의 몇 가지 예입니다. 모든 Lambda 예제는 Python으로 작성되었습니다.

 

Amazon Rekognition 시작하기

다음 코드는 DetectLabels 작업에 대한 Amazon Rekognition 요청을 시작할 수 있습니다.

client = boto3.client(‘rekognition’)

 

jobArgs = {

  ‘Video’: {

    ‘S3Object’: {

      ‘Bucket’: videoS3Bucket,

      ‘Name’: videoS3Name

    }

  },

  ‘NotificationChannel’: snsNotificationChannel

}

 

response = client.start_label_detection(jobArgs)

 

# Store the job id in the database for reference later

store_job_id(response[‘JobId’])

 

Amazon SNS 알림 수신

Amazon Rekognition API는 제공된 알림 채널에 Amazon SNS 주제를 보냅니다. 이 SNS 주제를 Lambda 함수에 연결하면 완료되는 작업에 응답하고 처리를 계속할 수 있습니다. 다음 코드는 Amazon Rekognition 결과를 검색하여 Amazon S3에 저장하고 결과로 데이터베이스를 업데이트하기 위해 Amazon SNS 알림을 수신하는 방법을 보여줍니다.

client = boto3.client(‘rekognition’)

 

jobArgs = {

  ‘JobId’: jobId

}

 

response = client.get_label_detection(jobArgs)

 

s3_client = boto3.client(‘s3’)

 

s3_client.put_object(

  Bucket=responseBucket,

  Key=responseKey,

  Body=json.dumps(response)

)

 

# Update the database so the step function can process the response

update_job_status(jobId, ‘SUCCEEDED’, responseBucket, responseKey)

 

비디오 처리 및 데이터 구조

비디오의 타임라인에서 데이터를 처리하고 상호 연관시키는 것은 어려울 수 있습니다. 비디오를 사용하면 종종 시간이 지남에 따라 레이블간에 관계를 만들고 싶어합니다. 이를 위해 Amazon Rekognition API에서 가져온 프레임 기반 데이터를 레이블 기반 데이터셋으로 변환할 수 있습니다.

다음은 DetectLabels 작업에서 반환하는 데이터의 예입니다.

[

  {“Label”: {“Confidence”: 89, “Name”: “Baseball”}, “Timestamp”: 0},

  {“Label”: {“Confidence”: 99, “Name”: “Person”}, “Timestamp”: 0},

  {“Label”: {“Confidence”: 87, “Name”: “Baseball”}, “Timestamp”: 200}

  {“Label”: {“Confidence”: 98, “Name”: “Person”}, “Timestamp”: 200},

  {“Label”: {“Confidence”: 87, “Name”: “Sports”}, “Timestamp”: 200},

  {“Label”: {“Confidence”: 84, “Name”: “Baseball”}, “Timestamp”: 400},

  {“Label”: {“Confidence”: 88, “Name”: “Sports”}, “Timestamp”: 400}

]

 

레이블 “Baseball”은 타임 스탬프 0, 200 및 400에 표시되므로 전체 비디오에 표시됩니다 (아마 Amazon Rekognition은 약 200ms마다 프레임을 감지할 것입니다). 연속 프레임에 나타나는 태그를 압축하여 다음 데이터셋을 생성 할 수 있습니다.

[

  {

    “Label”: {“Confidence”: 89, “Name”: “Baseball”},

    “Timestamp”: 0,

    “TimestampEnd”: 600

  },

  {

    “Label”: {“Confidence”: 99, “Name”: “Person”},

    “Timestamp”: 0,

    “TimestampEnd”: 400

  },

  {

    “Label”: {“Confidence”: 88, “Name”: “Sports”},

    “Timestamp”: 200,

    “TimestampEnd”: 600

  }

]

다음은 이 변환을 수행하는 Python 함수의 예입니다.

def aggregate_labels_by_time_step(labels, duration):

    ”’Function to combine labels in consecutive frames, adding end time”’

    last_time = 0

    current = {}

    aggregated = []

   

    for label in labels:

        timestamp = label[‘Timestamp’]

        timestamp_end = timestamp + 200

        name = label[‘Label’][‘Name’]

 

        if timestamp > last_time:

            # get_labels_not_in_time left out as an exercise for the reader

            aggregated += get_labels_not_in_time(current, timestamp)

 

        if name not in current:

            label[‘TimestampEnd’] = timestamp_end

            current[name] = label

        else:

            current_label = current[name]

            current_label[‘TimestampEnd’] = timestamp_end

 

        last_time = timestamp

 

    for label in current.values():

        aggregated.append(label)

 

    return aggregated

그런 다음 압축된 레이블을 응용프로그램에서 사용할 수 있도록 데이터베이스에 저장할 수 있습니다. 예를 들어, VidMob이 이 데이터와 다른 데이터를 사용하여 콘텐츠 인식 데이터를 표시하는 강력한 시각화를 만드는 방법은 다음과 같습니다.

 

 

결론

이와 관련하여 더욱 완전한 시스템을 구축하는 데에는 더 많은 세부사항들이 필요합니다. 해당 글은 AWS 도구 상자의 툴을 사용하여 확장성이 뛰어나고 적응력이 뛰어난 비디오 처리 파이프 라인을 만드는 방법에 대한 개괄적인 아이디어이니 참고 바랍니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/building-a-scalable-and-adaptable-video-processing-pipeline-with-amazon-rekognition-video/

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.