AWS 기술 블로그

프리킥 챌린지를 위한 생성형 AI 솔루션을 AWS 서비스로 구현하기

이 블로그에서 소개하는 AWS Seoul Summit 2024 “AWS 프리킥 챌린지”에서는 기존의 슈팅 속도 확인 서비스에 더해, 참가자들에게 특별한 경험을 선사하기 위해 생성형 AI 서비스를 도입했습니다. 챌린지 참가자들은 프리킥 슈팅 후 자신의 슬로우 킥 모션을 분석한 영상을 제공받으며, 자신이 유니폼을 착용한 모습으로 합성된 기념 사진을 받을 수 있습니다. 또한, 현장에 직접 참석하지 않더라도 실시간 라이브 중계를 통해 생동감 있게 챌린지를 즐길 수 있는 서비스도 포함되었습니다. 이러한 세가지 서비스는 과거에는 고가의 장비와 전문 인력이 필요했던 영상 작업들을 생성형 AI 기술을 통해 더 저렴하고 쉽게 구현할 수 있다는 것을 보여주기 위한 목적으로 구현하였습니다.

솔루션 개요

슬로우 모션 솔루션

전통적으로 초고속 슬로 모션 영상(초당 240프레임 이상)을 촬영하려면 고가의 전문 카메라가 필수적이었지만, 이러한 장비를 사용해도 화면 떨림이나 화질 저하 같은 단점이 있었습니다. 이를 해결하기 위해 FILM(Frame Interpolation for Large Motion) 같은 생성형 AI 모델이 등장했습니다. 이 모델은 실제 촬영 프레임 사이에 합성 프레임을 삽입하여 원활한 초고프레임률의 슬로 모션 영상을 만듭니다. 입력 프레임 간 움직임을 분석해 새로운 전환 프레임을 생성하는 방식입니다.

Amazon SageMaker서버리스 아키텍처를 기반으로 자동화된 파이프라인을 구축하면 낮은 지연시간으로 실시간 영상 처리가 가능하고 고가 전문 장비 없이도 고품질 슬로 모션 영상 제작이 가능합니다.

유니폼 생성 솔루션

이미지 인페인팅(Inpainting) 기술은 손상된 이미지를 복원하거나 삭제된 부분을 채워주는 기술입니다. 이러한 기술은 컴퓨터 비전, 컴퓨터 그래픽스, 영화 제작 등 다양한 분야에서 활용이 가능합니다. 과거 이미지 인페인팅은 전문적인 툴과 장비를 사용하여 수행했기 때문에 많은 비용과 시간이 소모 되었으나, 최근 생성형 AI 기술을 결합하여 정교하고 자연스러우며 일관된 결과를 얻고자하는 연구가 진행되고 있습니다.

유니폼 이미지 생성 솔루션은 Amazon의 생성형 AI 모델인 Titan Image Generator와 의상의 마스크 영상을 정확히 분리하는 Sementic Segmentation 모델을 사용하여 사용자의 의상이 축구 유니폼으로 교체된 이미지를 생성하며, 이를 통해 사용자는 실제 축구장에서 축구복을 입은 것과 같은 가상의 경험을 제공합니다.

유니폼 이미지 생성 솔루션은 워크플로우를 구성하기 위해 Amazon SageMakerAmazon Bedrock을 통해 생성형 AI 모델과 Vision AI 모델을 사용하며, 서버리스 아키텍처를 기반으로 자동화된 워크플로우를 구축하여 실시간으로 유니폼 이미지를 생성하는 비용 효율적인 솔루션을 제시합니다.

실시간 중계 솔루션

실시간 이벤트나 복잡한 상황을 전달할 때, 단순한 데이터 전송만으로는 상황을 생생하게 전달하기 어렵습니다. 특히 스포츠 경기나 게임 등의 상황에서는 수치 데이터 외에도 맥락과 해설이 필요합니다. 실시간 중계 솔루션은 이러한 문제를 해결하고자 합니다.

이 솔루션은 실시간으로 전송되는 데이터(예: 사용자의 슈팅 스피드, 거리 등)을 기반으로 상황에 맞는 텍스트 설명을 생성하여 제공합니다. 이를 통해 사용자는 단순한 수치 데이터를 넘어 상황을 보다 생동감 있게 이해할 수 있습니다.

솔루션 아키택처 설명

유니폼 합성 솔루션

  1. 유니폼 합성 솔루션은 사용자가 입장 시 이미지를 촬영합니다.
  2. 촬영한 이미지가 S3 버킷에 저장되면, S3 트리거를 통해 AWS Lambda 함수가 호출되고, 이 함수는 Amazon DynamoDB 테이블에 등록된 사용자의 성별 정보를 쿼리합니다.
  3. Amazon SageMaker에 배포된 Semantic Segmentation 모델을 통해 사용자의 복장을 픽셀 레벨로 분할하고, 마스크 이미지를 생성합니다.
  4. 촬영한 이미지와 마스크 이미지는 Amazon Bedrock에서 제공하는 이미지 생성 모델인 Titan Image Generator를 활용하여 이미지 인페인팅을 수행합니다. Amazon SageMaker에서 생성한 이미지와 원본 이미지를 기반으로 마스크 영역을 축구복으로 복원하여 사용자에게 제공합니다.
  5. 이처럼 유니폼 합성 솔루션의 핵심은 Amazon SageMaker를 통해 실시간으로 Semantic Segmentation을 수행하고, Amazon Bedrock의 Titan Image Generator 모델을 활용하여 이미지 인페인팅을 수행하는 것입니다.

Amazon SageMaker Studio에서 실행할 수 있는 모델 배포 코드와 Lambda 샘플 코드 및 노트북 코드는 GitHub에 게시되어 있습니다.

슬로우 모션 영상 솔루션

다음 그림은 카메라를 통해 전달된 영상을 기반으로 비동기 방식으로 슬로우 모션 영상을 생성하는 아키텍처를 보여줍니다. 슬로우 모션 영상은 FILM, Amazon SageMaker, AWS Lambda 를 활용하여 워크플로를 구축하였습니다.

  1. Amazon SageMaker에서 FILM 모델을 패키징한 후 비동기 추론을 위한 엔드포인트를 생성합니다.
  2. 사용자의 프리킥 챌린지가 완료되는 시점에 카메라를 통해 촬영된 영상이 콘텐츠 저장 S3 버킷에 저장됩니다.
  3. 이후 Lambda 함수가 트리거 되어서 영상을 프레임 별로 추출하고 FILM 모델에 대한 SageMaker 엔드포인트를 호출하여 합성된 비디오 프레임을 생성합니다.
  4. 이후 원본 프레임과 합성된 프레임을 높은 프레임 속도의 슬로우 모션 비디오로 조합하고 S3에 업로드 합니다.
  5. 위의 절차로 만들어진 슬로우 모션 비디오는 최종 사용자 인터페이스를 통해서 다운 받을 수 있습니다.

이처럼 이 솔루션의 핵심은 오픈소스 모델인 FILM 모델을 Amazon SageMaker 에 배포하여, 비동기 엔드포인트를 오케스트레이터에게 제공하는 것입니다.

Amazon SageMaker Studio에서 실행할 수 있는 jupyter 노트북과 샘플 코드 역시 GitHub에 게시되어 있습니다.

실시간 중계 솔루션

아래 그림은 카메라를 통해 전달된 실시간 이벤트 데이터를 기반으로 실시간 중계를 위한 해설을 생성하는 아키텍처를 보여줍니다.

  1. 카메라를 통해 전달된 실시간 이벤트 데이터를 Lambda 함수에 전달합니다.
  2. Lambda 함수에서는 전달받은 정보를 기반으로 Amazon Bedrock에 자연스러운 해설을 생성할 것을 요청합니다.
  3. Amazon Bedrock의 Claude 3 Sonnet 모델을 통해 생성된 중계 해설은 S3에서 서비스하고 있는 실시간 대시보드 앱에 전달됩니다.
  4. 최종적으로 사용자는 대시보드에서 실시간으로 중계 해설을 경험합니다.

이처럼 실시간 중계 솔루션의 핵심은 Amazon Bedrock의 Claude 3 Sonnet 모델을 활용하는 것입니다. Amazon Bedrock에서 제공하는 Claude 3 Sonnet 모델은 대규모 언어 모델로, 주어진 상황과 데이터를 기반으로 자연스러운 텍스트 생성이 가능합니다.

전체 아키텍처

전체 아키택처는 다음과 같습니다.

솔루션 세부 사항 설명

슬로우 모션 솔루션

솔루션 배포

    1. CloudFormation 템플릿 배포
      1. AWS CloudFormation 템플릿을 다운로드하세요.
      2. CloudFormation 콘솔로 이동하여 스택 생성, 새 리소스 사용(표준)을 선택합니다.
      3. 스택 생성 페이지에서 기존 템플릿 선택을 선택한 후, 템플릿 파일 업로드를 선택하고 방금 전에 다운 받은 CloudFormation 템플릿을 선택합니다.
      4. 스택 세부 정보 지정은 다음 내용을 참조하시면 됩니다.
        1. 스택 이름 : 원하는 스택 이름을 입력합니다. 여기서는 super-slow-solution을 사용하겠습니다.
        2. SageMaker용 S3 Bucket : 기본 SageMaker용 S3 버킷을 생성할 지 여부를 지정합니다. true를 선택하면 sagemaker-AWS::Region-AWS::AccountId 형식의 이름을 가지는 S3 버킷을 만듭니다.
        3. ParameterSubnet1Id : 솔루션을 배포하고자 하는 VPC의 첫 번째 SubnetId를 선택하세요.
        4. ParameterSubnet2Id : 솔루션을 배포하고자 하는 VPC의 두 번째 SubnetId를 선택하세요.
        5. ParameterVPCId : 솔루션을 배포하고자 하는 VPC의 ID를 선택하세요.
      5. 스택 생성 완료까지 몇 분 정도 소요가 됩니다.
    2. 소스 다운로드
      1. SageMaker 콘솔로 이동하여 카테고리에서 Studio를 클릭합니다. CloudFormation을 통해서 생성된 SageMakerStudioWorkshopDomain 도메인의 sagemaker-user 사용자로 Studio 열기를 수행합니다.
      2. 다음과 같은 설정으로 JupyterLab Space를 생성하고 시작합니다.
        1. Name : slow-motion
        2. Sharing : private
        3. instance : ml.g4dn.xlarge
        4. Storage : 100GB
        5. 기타 : default
      3. Open JupyterLab을 클릭하여 JupyterLab을 엽니다.
      4. 터미널의 사용하여 다음과 같이 GitHub 저장소를 복제합니다.
        git clone https://github.com/aws-samples/super-slow-motion-video-creation-using-generative-ai-on-aws.git
      5. 이 저장소의 노트북은 SageMaker Studio에서 기본 python3 커널을 사용하여 테스트되었습니다. ml.g4dn.xlarge와 같은 GPU 인스턴스가 권장됩니다.
    3. SageMaker 비동기 엔드포인트에 FILM 모델 패키징 및 배포
      1. JupyterLab에서 복제해 온 super-slow-motion-video-creation-using-generative-ai-on-aws 폴더로 이동합니다.
      2. Slow-mo.ipynb 노트북을 열고 지침에 따라 각 셀을 실행하세요. Create A Sagemaker Asynchronous Endpoint까지는 기본으로 실행하셔야 합니다.
      3. 노트북의 구현 내용은 Amazon SageMaker 비동기 추론 (asynchronous inference)을 사용하여 FILM 모델을 호스팅하는 작업입니다. 비동기식 추론은 라이브 엔드포인트를 배포하여 대량의 데이터를 비동기식으로 처리할 수 있는 SageMaker의 기능입니다. 해당 기능은 페이로드 크기가 크고(최대 1GB), 처리 시간이 길며(최대 1시간), 거의 실시간에 가까운 지연 시간이 필요한 요건에 적합합니다. 또한 비동기 추론을 사용하면 처리할 요청이 없을 때 인스턴스 수를 0으로 오토 스케일링하여 비용을 절감할 수 있으므로 엔드포인트가 요청을 처리할 때만 비용을 지불한다는 장점이 있습니다. 비디오 프레임 처리와 같은 대규모 페이로드 추론을 확장하는 관리형 방법을 제공하기 때문에 비동기 방식을 선택했습니다.
      4. 배포용 모델을 패키징하기 위해 Amazon에서 개발한 오픈 소스, 프레임워크에 구애받지 않는 모델 서버인 DJL(Deep Java Library) 서비스를 사용합니다. DJL 컨테이너를 활용하기 위해 모델 제공을 위해 하기와 같은 두가지 요소를 반드시 제공해주셔야 합니다.
        • Serving.properties : 모델이 제공되는 방식과 필요한 추론 최적화 라이브러리 유형을 정의하는 구성 파일입니다. 후자는 모델이 로드되는 방식과 추론이 제공되는 방식을 정의하는 Python의 사용자 정의 핸들러 함수입니다.
        • model.py : 모델이 로드되는 방식과 추론이 제공되는 방식을 정의하는 Python의 사용자 정의 핸들러 함수입니다.
      5. 비동기 추론이 어떻게 서비스될지 정의하는 엔드포인트 구성을 생성합니다. 최종적으로 배포를 하게 되면 다음과 같이 엔드포인트가 생성이 되는것을 확인할수 있습니다.
    4. 이후 계속하여 테스트를 위해서 SageMaker Studio에서 입력 비디오 준비, 생성한 비동기 추론 엔드포인트 호출, 슬로우 모션 비디오 생성 등 Slow-mo.ipynb 지침을 수행하실수 있습니다. 또는 건너 뛰시고 바로 Orchestrator Lambda 함수 생성을 진행하셔도 좋습니다.

Orchestrator Lambda 함수 배포

이 블로그 게시물에서는 다음과 같은 핵심 솔루션 구성 요소에 중점을 두어 설명합니다. 전체 Lambda 코드는 GitHub 저장소를 참조하세요.

  1. Lambda 함수 생성 (Python 3.12)
    1. 원본 영상이 S3에 업로드 되면 S3 트리거 설정에 의해 Lambda 함수가 호출이 되고 extract_frames 함수에서 입력 영상의 프레임을 추출합니다.
    2. 프레임과 함께 config.json 파일도 같은 폴더에 저장됩니다. 이 파일은 슬로우 모션 프레임이 보간되어야 하는 방법을 모델에 알려주는 프로세스 구성 매개변수를 지정합니다.
    3. 프레임과 config.json 파일은 단일 tar.gz 파일로 압축되어 추론을 위해 upload_file 함수를 호출하여 Amazon S3에 업로드됩니다.
    4. 업로드된 프레임 압축 파일 경로를 입력으로 Amazon SageMaker 비동기 엔드포인트를 호출하여 슬로우 모션 프레임을 생성할 수 있습니다. 새로 생성된 프레임은 프로세스가 완료되면 S3 출력 위치에 저장됩니다.
    5. 슬로우 모션 프레임 생성 작업이 완료되면 마지막 단계는 새로 생성된 프레임을 올바른 순서로 조합하여 슬로우 모션 비디오를 생성하는 것입니다. 작업 시간이 오래 걸려서 Orchestrator를 AWS Lambda에서 기타 플랫폼으로 개선 작업을 하는것을 추천 드립니다. 관련 내용은 개선 작업에서 설명 합니다.
    6. 슬로우 모션 비디오를 생성하는 create_video 함수를 호출할 때 프레임 위치, 출력 파일 이름, 최종 비디오의 프레임 속도를 제공합니다. FFmpeg가 나머지 작업을 처리하고 프레임을 .mp4 형식의 최종 슬로우 모션 비디오에 결합합니다. upload_file 함수를 호출하여 슬로우 모션 비디오를 Amazon S3에 업로드 합니다.
    7. Orchestrator는 메인 함수를 구현한 lambda_function.py 파일 (freekick-seoul-summit/slow-motion/lambda/lambda_function.py)과 사용자 정의 함수를 구현한 utils.py 파일로 (freekick-seoul-summit/slow-motion/lambda/utils.py) 구성이 되어 있습니다.메인 함수에서 원본 영상과 슬로우 모션 영상을 업로드 하기 위한 S3 bucket 정보와 Sagemaker endpoint를 코드에서 변경해주셔야 합니다. 하기 예제를 참조하세요.
      slow_mo_inference_endpoint_name = 'slow-mo-2024-05-13-04-55-29-493'
      origin_bucket_name = 'seoul-2024-free-kick-challenge-downloadable-contents'
      slow_mo_bucket_name = 'slow-motion-free-kick-summit-2024'
      output_bucket_name = 'seoul-2024-free-kick-challenge-downloadable-contents'
    8. 람다 함수의 구성에서 추가적으로 생성해야 하는 설정은 다음을 참조하세요.
      1. 일반 구성 (람다의 성능을 높이기 위한 설정) :
        • 제한 시간 : 15분으로 설정
        • 메모리 : 2048 MB
        • 임시 스토리지 : 1024 MB
      2. 권한 : 람다는 기본으로 AWSLambdaBasicExecutionRole이 포함이 되어 있는 Lambda function Role를 생성해줍니다. 기본 권한 이외에 AmazonSageMakerFullAccess, AmazonS3FullAccess 두 가지 정책을 추가해 주세요.
  2. S3 트리거 생성
    1. 예시로 CloudFormation을 통해 생성된 sagemaker-us-west-2-xxx로 시작하는 버킷에 input 이라는 폴더를 생성합니다. 이후 슬로우 모션 제작에 필요한 경로는 slow-mo 폴더에서 진행이 되고 최종 output는 /result 폴더에 저장이 되도록 설정하였습니다.
    2. 람다에서 Add trigger 이라는 버튼을 클릭하고 S3 관련 정보로 trigger configuration을 설정합니다.
      • S3 버킷은 input 폴더의 버킷 정보를 입력
      • Event Types은 “All object create events”로 설정
      • Prefix는 input/ 으로 설정
  3. 오픈 소스 비디오 처리 도구인 FFmpeg을 Lambda Layer에서 구성
    1. FFmpeg 다운로드 홈페이지로 접속하여 FFmpeg 빌드(ffmpeg-release-amd64-static.tar.xz)를 다운 받습니다.
    2. ffmpeg라는 폴더 생성하고 bin 폴더에 방금전에 다운 받은 FFmpeg 빌드 압축 파일 내의 ffmpeg 파일을 담고 zip 파일로 압축합니다.
    3. Lambda Layer로 접속하여 ffmpeg Layer를 구성하고, Step1 에서 생성한 Lambda 함수의 Layer 설정에 방금 전에 생성한 ffmpeg Layer를 추가합니다.
    4. 다음과 같은 설정이 완료 되면 최종 테스트를 수행하게 됩니다.

응답 예시

S3 input 폴더에 mp4 원본 영상을 업로드 합니다. 이후 S3 트리거 기능으로 Orchestrator Lambda 함수가 호출되고 슬로우 모션 영상을 제작하여 Output 폴더에 업로드 합니다.

그림 1과 그림 2는 원본 미디어와 3배 슬로우 모션(초당 3배 더 많은 프레임) 미디어를 나란히 비교한 비디오를 보여줍니다.

그림1. 원본 영상

그림 2. 슬로우 모션 영상 (3배 프레임)

개선 작업

SageMaker 작업 결과를 기다리는 데 약 5분 정도 소요되는 상황에서, Lambda 함수에서 이를 대기하게 하는 것은 비용 측면이나 동시성 관리 측면에서 최선의 방안으로 보기 어렵습니다. 다만, 오케스트레이터를 이와 같은 방식으로 구현하고 테스트하는 데 있어 참고할 수 있는 예시로 활용하시면 좋을 것 같습니다. 또한, 추가적인 개선이 필요할 수 있는 몇 가지 포인트들을 아래에 나열해 두었습니다.

  • 프로덕션 등에서는 Lambda에서 수행하는 전체 로직을 입력 영상의 프레임을 추출하고 Sagemaker Endpoint를 호출하는 함수와 새로 생성된 프레임을 올바른 순서로 조합하여 슬로우 모션 비디오를 생성하는 함수 두가지로 분리하고 AWS Step Functions을 활용하여 워크플로를 자동으로 조정하는 오케스트레이션을 만드는것 입니다.
  • 시스템의 병렬 처리를 극대화하기 위해 AWS Batch 작업을 활용해 프레임을 분할하고 다시 조립하는 방식을 고민해볼 필요가 있습니다.
  • 람다의 환경변수 활용을 통해 SageMaker의 엔드포인트 및 S3 버킷 정보를 관리하여 운영 효율성을 높일수 있습니다.

유니폼 합성 솔루션

사전 준비 사항

  • OpenCV Layer

유니폼 합성 솔루션

  1. 플레이어 정보 조회플레이어는 사전에 게임을 수행하기 위한 등록 페이지를 통해 사전 정보를 입력합니다. 이렇게 입력된 정보는 DynamoDB에 저장되고 유니폼 합성 사진을 만들 때 현재 게임을 수행하는 플레이어의 성별 정보를 쿼리하고, Titan Image Generator 모델에서 활용할 프롬프트에 사용합니다.
  2. 이미지 세그멘테이션입력 이미지가 S3에 업로드되면 S3 트리거를 통해 플레이어가 착용한 옷의 영역을 마스킹 하기위한 Lambda 함수를 호출합니다.위 솔루션에서는 플레이어의 옷 영역을 마스킹 하기 위해 Transformer 구조를 Semantic Segmentation에 사용한 Segformer 모델을 파인튜닝하여 활용합니다. Segformer는 네트워크 추론 속도 향상에 중점을 두는 모델이며, 최소한의 파라미터로 성능을 극대화한 모델입니다. 그러므로 최소한의 파라미터로 동일한 파라미터 대비 CNN, Transformer 기반의 모든 모델들의 성능을 능가하였으며, 가벼운 버전의 Segformer의 경우 실시간의 추론까지 가능합니다.유니폼 생성 솔루션에서는 Segformer를 Image Segmentation 작업에 활용함으로써 CPU 리소스에서의 추론에서도 실시간에 가까운 추론과 성능을 얻을 수 있었습니다.
  3. 마스크 이미지 생성착용한 옷을 구분하기 위한 Segformer 모델은 Amazon SageMaker의 실시간 추론 형식으로 배포하여 즉각적인 추론이 가능하도록 구성하였습니다. 유니폼 생성 솔루션에서는 파인튜닝된 모델에서의 일부 카테고리만을 사용하지만, 모델은 아래와 같은 종류의 옷의 카테고리를 분류할 수 있으므로 활용하고자 하는 유즈 케이스에 맞춰서 다양하게 활용할 수 있습니다.
    Label Index Label Name Category Accuracy Category IoU
    0 Background 0.99 0.99
    1 Hat 0.73 0.68
    2 Hair 0.91 0.82
    3 Sunglasses 0.73 0.63
    4 Upper-clothes 0.87 0.78
    5 Skirt 0.76 0.65
    6 Pants 0.90 0.84
    7 Dress 0.74 0.55
    8 Belt 0.35 0.30
    9 Left-shoe 0.74 0.58
    10 Right-shoe 0.75 0.60
    11 Face 0.92 0.85
    12 Left-leg 0.90 0.82
    13 Right-leg 0.90 0.81
    14 Left-arm 0.86 0.74
    15 Right-arm 0.82 0.73
    16 Bag 0.91 0.84
    17 Scarf 0.63 0.29


    Segformer 모델을 통해 추론을 수행하면 다음과 같이 옷의 종류에 따라 마스크 이미지를 생성할 수 있습니다.

    Bedrock의 Titan Image Generator에 카테고리별 결과를 순차적으로 입력하여 이미지를 생성할 수도 있으나, 인페인팅시 상/하의의 일관된 생성을 위하여 카테고리별로 생성한 마스크 이미지를 하나의 영상으로 병합합니다.

    Amazon Titan Image Generator의 이미지 인페인팅 기능은 마스크 내부 픽셀의 값이 (0,0,0)인 값이 수정됩니다. 유니폼 생성 솔루션에서는 옷 마스크 영역이 수정되어야 하므로 병합 과정을 수행할 때 아래와 같이 색상을 반전시킵니다.

  4. 유니폼 색상 선택유니폼 생성 솔루션에서는 플레이어의 다양한 축구 유니폼을 생성하기 위해 color 테이블을 정의합니다. 솔루션에서는 총 11가지의 색상을 정의하여 Amazon Titan Image Generator에서 인페인팅시 랜덤한 색상을 선택할 수 있도록 합니다.
    color = ['black', 'white', 'red', 'blue', 'green', 'yellow', 'orange', 'purple', 'pink', 'brown', 'gray']
    random.shuffle(color)
  5. Amazon Titan Image Generator 모델 설정 및 프롬프트 정의Amazon Titan Image Generator의 인페인팅 기능은 마스크로 정의된 이미지 영역 내부의 픽셀을 변경하여 주변 영역과 자연스럽게 일치하도록 수정합니다. 마스크 픽셀값이 (0,0,0) 인 픽셀은 수정되며, (255,255,255)인 픽셀은 그대로 유지가 됩니다. 이를 통해 위 단계에서 수행한 마스크 이미지 영역을 기반으로 플레이어의 축구 유니폼을 생성할 수 있습니다.프롬프트는 일반적인 축구 유니폼을 생성하도록 작성이 되어 있지만, 위 단계에서 수집한 성별 정보와 색상 정보를 파라미터로 입력함으로써 다양한 색상 및 모양을 생성할 수 있게 합니다.이미지 생성 모델에서는 negativeText를 통해 생성하고 싶지 않은 이미지 특성을 지정합니다. 위 솔루션에서는 bad qualitylow res를 지정함으로써 이미지 품질 향상을 도모합니다.

    최종적인 Titan Image Generator의 프롬프트와 전송 데이터는 아래와 같이 정의됩니다.

    if gender is not None and gender != 'none':
        prompt = f"{gender}'s soccer uniform shorts of {color[0]} color"
    else:
        prompt = f"{color[0]} color soccer uniform shorts"
    body = json.dumps({
        "taskType": "INPAINTING",
        "inPaintingParams": {
            "text": prompt,
            "negativeText": "bad quality, low res",
            "image": base64.b64encode(image).decode('utf8'),
            "maskImage": mask_bytes
        },
        "imageGenerationConfig": {
            "numberOfImages": 1,
            "height": 512,
            "width": 512,
            "cfgScale": 8.0
        }
    })
  6. 이미지 생성 요청완성된 전송 데이터를 이용하여 Amazon Bedrock의 invoke_model 메소드를 통해 Amazon Titan Image Generator를 호출합니다.
    response = bedrock.invoke_model( body=body, modelId=model_id, accept=accept, contentType=content_type )

    추론 결과에서 이미지 데이터를 추출하기 위해 아래와 같은 과정을 거치면 응답에서 실제 이미지 바이트를 얻을 수 있습니다.

    base64_image = response_body.get("images")[0] 
    base64_bytes = base64_image.encode('ascii') 
    image_bytes = base64.b64decode(base64_bytes)

응답 예시

플레이어의 사진과 사전 정보를 Amazon Bedrock과 Computer vision 모델을 이용하면 자연스러운 유니폼 사진을 생성할 수 있습니다. 이를 통해 플레이어는 현장에서 경기에 몰입 할 수 있으며, 축구복을 입은 것과 같은 가상의 경험을 제공할 수 있습니다.

경기 후에는 기념사진과 영상이 생성형AI 기술로 제작되어 이를 확인하실 수 있습니다.

실시간 중계 솔루션

단계

  1. 데이터 수집카메라와 사전 입력된 데이터를 통해 실시간 이벤트 데이터(닉네임, 속도, 거리, 골 여부, 랭킹, 슈팅 횟수)를 수집합니다. 수집된 데이터를 Claude 3 Sonnet 모델에 전달하기 위해 사전 정의된 JSON 구조로 변환합니다.
    {
        "player_name": "Sarah",
        "shot_speed": 110,
        "shot_distance": 20,
        "shot_goal": False,
        "leaderboard_ranking": 2,
        "shots_done": 18
    }
  2. 시스템 프롬프트 정의시스템 프롬프트를 작성하는 이유는 AI 모델에게 작업의 맥락과 목표를 명확히 전달하기 위함입니다. 잘 설계된 프롬프트는 모델이 요구사항을 정확히 이해하고 원하는 결과물을 생성할 수 있도록 돕습니다.시스템 프롬프트는 다음과 같은 기능을 합니다.
    1. 맥락 제공: 프롬프트에는 해당 작업의 맥락과 배경 정보가 포함됩니다. 예를 들어, 골대를 향해 슛을 하는 상황 등의 정보를 제공합니다.
    2. 목표 설명: 프롬프트는 AI 모델이 달성해야 할 목표를 명시합니다. 이 경우 빠르고 강한 슛을 설명하는 문장을 생성하는 것이 목표입니다.
    3. 입력 데이터 형식 정의: 프롬프트에는 모델에 제공될 입력 데이터의 형식과 속성이 정의됩니다. 여기서는 JSON 형식의 슛 속도, 거리, 성공 여부 등의 데이터가 제공된다고 명시합니다.
    4. 출력 형식 지정: 프롬프트는 모델이 생성해야 할 출력 형식을 지정합니다. 이 경우 한 문장으로 매력적인 해설을 생성하라고 요구합니다.

    잘 설계된 시스템 프롬프트를 사용하면 AI 모델이 작업 요구사항을 명확히 이해하고 원하는 결과물을 더 정확하게 생성할 수 있습니다. 또한 프롬프트를 통해 모델의 출력을 일관되고 예측 가능한 형태로 유도할 수 있습니다.

    # 시스템 프롬프트 정의
    system_prompt = """플레이어는 골대를 향해 슛을 날립니다. 
    목표는 가능한 한 세게, 빠른 슛 속도로 슛하는 것입니다. 
    
    시스템은 각 샷에 대해 다음과 같은 속성을 json으로 생성하여 전달합니다. 
    shot_speed는 km/h로 측정됩니다. 
    shot_distance는 미터 단위입니다. 
    shot_goal은 목표에 맞으면 참이고, 그렇지 않으면 거짓입니다. 
    leaderboard_ranking은 이 샷의 현재 순위를 나타냅니다. 
    shots_done은 이 사람이 이미 시도한 샷의 수입니다. 
    
    한 문장으로 매력적인 해설을 생성합니다."""

    이 프롬프트는 AI 모델에게 축구 슈팅 상황에 대한 맥락과 입력 데이터 형식, 그리고 요구사항을 제시하고 있습니다. 모델은 제공된 JSON 데이터를 기반으로 한 문장으로 구성된 매력적인 슈팅 해설을 생성해야 합니다. 프롬프트를 통해 모델은 작업의 목표와 기대 출력 형식을 명확히 이해할 수 있으며, 이에 따라 적절한 결과물을 생성할 수 있습니다.

  3. 프롬프트 정의
    # 프롬프트 정의
    prompt = f"""프리킥에 결과에 대한 다음 정보 {event_data}를 사용하여 축구 해설 스타일로 흥미롭고 재미있는 짧은 문장을 하나 생성합니다.
    m/s에서 km/h로 변환된 공의 속도와 순위와 같은 통계를 포함합니다.
    값 목표가 거짓이면 이것은 실점입니다,
    참이면 골이며, 값 순위는 현재 {players}명의 선수가 있는 순위표에서만 해당 선수의 순위입니다.
    결과를 소개하지 말고 현재 시제로 작성하세요.
    
    축구 해설자처럼 흥미진진한 스타일로 한국어로 작성하세요."""

    위 프롬프트는 AI 모델에게 축구 경기 중 프리킥 상황에서의 슈팅 결과를 설명하는 짧은 문장을 생성하도록 요청하고 있습니다. 이를 위해 모델에게 입력 데이터 형식, 출력 형식, 문체 및 스타일, 언어 등에 대한 구체적인 지침을 제공하고 있습니다. 프롬프트를 통해 모델은 작업의 맥락과 목표를 명확히 이해하고, 요구사항에 맞는 결과물을 생성할 수 있습니다.

  4. 입력 파라미터 정의
    # 입력 파라미터 정의
    input_params = {
        "prompt": prompt,
        "max_tokens_to_sample": 1024,
        "temperature": 0,
        "top_k": 250,
        "top_p": 0.5,
        "stop_sequences": []
    }

    실시간 생성되는 실시간 중계 문장의 품질과 일관성을 유지하기 위해서는 모델의 출력을 적절히 제어할 필요가 있습니다. 이를 위해 Amazon Bedrock의 Claude 3 Sonnet 모델에 다양한 파라미터 값을 전달하고 있습니다.

    • 첫째, max_tokens_to_sample 파라미터는 모델이 생성할 수 있는 최대 토큰 수를 지정합니다. 이 값을 1024로 설정함으로써 모델이 충분한 길이의 문장을 생성할 수 있도록 허용합니다.
    • 둘째, temperature 파라미터는 모델의 출력 다양성을 조절합니다. 값이 높을수록 더 다양하고 창의적인 출력이 생성되지만, 너무 높으면 비정상적인 결과가 나올 수 있습니다. 이를 고려하여 0.3의 중간 값을 설정했습니다. 이렇게 하면 실시간 중계가 일정 수준의 다양성을 유지하면서도 지나치게 이상한 문장은 생성되지 않습니다.
    • 셋째, top_ktop_p 파라미터는 모델의 출력 분포를 제한하여 더 높은 확률의 토큰이 선택되도록 합니다. top_k=250은 상위 250개의 토큰만 고려하고, top_p=0.5는 누적 확률 상위 50%의 토큰만 고려한다는 의미입니다. 이를 통해 비정상적인 낮은 확률 토큰이 선택되는 것을 방지할 수 있습니다.
    • 마지막으로 stop_sequences 파라미터는 모델이 특정 시퀀스를 만나면 생성을 중지하도록 합니다. 이 경우 빈 리스트가 전달되어 모델이 자연스럽게 문장을 종료하도록 설정되어 있습니다.

    이렇게 다양한 파라미터 값을 적절히 조정함으로써 실시간 중계 솔루션은 매력적이고 일관성 있는 실시간 해설 문장을 생성할 수 있게 됩니다.

  5. AWS Bedrock Claude 3 Sonnet 모델 호출
    # 모델 ID 정의
    model_id = "anthropic.calude-3-sonnet-20240229-v1.0"
    
    # Amazon Bedrock Claude 3 Sonnet 모델 호출
    response = bedrock_client.generate(
        modelId=model_id,
        systemPrompt=system_prompt,
        inputParams=json.dumps(input_params)
    )
        
    # 응답 결과 반환
    return response['result']

    AWS Lambda 함수 내에서 Amazon Bedrock Claude 3 Sonnet 모델을 호출하여 축구 경기 상황에 대한 해설 문장을 생성합니다. 먼저 시스템 프롬프트와 입력 데이터를 포함한 실제 프롬프트를 정의합니다. 그리고 모델 실행을 위한 파라미터를 설정한 후, Amazon Bedrock 클라이언트를 통해 모델을 호출하고 생성된 해설 문장을 반환합니다.

응답 예시

아래는 실시간 이벤트 데이터를 기반으로 생성된 실시간 중계 예시입니다.

Summit 님는 오늘의 18번째 샷을 위해 줄을 섭니다.
Summit 님은 놀라운 힘으로 첫번째 공을 감아 쳐냅니다!
슛은 시속 110km의 엄청난 속도로 그의 발에서부터 날아갑니다!
하지만, 엄청난 속도에도 불구하고 슛은 20미터 밖에서 골대를 빗나가며 빗나갑니다.
아, 아슬아슬하네요! Summit 님는 15위였던 순위를 끌어올리고 싶었지만,
다음 기회를 노려야 할 것 같습니다.

실시간 중계 솔루션을 구축하기 위해서는 이와 같은 단계를 거쳐 먼저 이벤트 데이터를 수집해야 합니다. 그리고 이 데이터를 기반으로 Amazon Bedrock Claude 3 Sonnet 모델에 적절한 프롬프트와 파라미터를 전달하여 호출합니다. 모델은 입력 데이터와 프롬프트를 분석하여 자연스러운 해설 문장을 생성하게 되며, 이를 통해 실시간 중계 솔루션을 완성할 수 있습니다.

결론

이 글에서는 AWS 서비스 기반의 “프리킥 챌린지” 이벤트 현장에 생성형 AI 기술을 적용한 슬로우 모션, 유니폼 합성, 실시간 중계 등 솔루션의 구현 방법에 대해서 자세하게 작성하였습니다.

FILM이라는 생성 AI 모델을 통해 슈퍼 슬로우 모션 비디오 솔루션을 구현하였습니다. SageMaker 비동기 엔드포인트에서 실행하여 실시간에 가까운 저지연 성능을 제공하며, 람다를 활용한 서버리스 오케스트레이션을 통해 안정적인 시스템을 구축했습니다. 이러한 방식은 프리킥 챌린지의 슬로우 모션 제작뿐만 아니라 해상도 증가, 누락된 프레임 채우기, 객체 제거 등 다양한 비디오 향상 작업에 활용될 수 있습니다.

또한 Amazon Bedrock과 Computer Vision 모델을 사용하여 플레이어의 사진과 사전 정보를 바탕으로 자연스러운 유니폼 사진을 생성했습니다. 이를 통해 플레이어들은 실제 경기에서 축구복을 입은 것 같은 가상의 경험을 할 수 있으며, 경기 후에는 기념사진과 영상이 생성형 AI 기술로 제작되어 제공됩니다.

마지막으로, Amazon Bedrock의 대규모 언어 모델을 사용하여 현장에서 수집된 실시간 데이터를 바탕으로 자연스러운 텍스트 해설을 생성했습니다. 이 실시간 중계는 현장의 분위기를 생생하게 전달하여 관람객들에게 현장에 있는 것 같은 경험을 제공합니다.

이 세 솔루션은 AWS Seoul Summit 프리킥 챌린지 뿐만 아니라 다양한 영역에서도 적용 가능한 혁신적인 기술로, 스포츠, 엔터테인먼트, 교육 등 여러 분야에서 유용한 레퍼런스로 활용될 수 있기를 기대합니다.

Cheolmin Ki

Cheolmin Ki

기철민 솔루션즈 아키텍트는 AIML 및 소프트웨어 개발 경험을 바탕으로 미디어 및 엔터테인먼트 기업 고객이 원하는 비즈니스 결과를 얻을 수 있도록 아키텍처를 최적화하고, 최적의 클라우드 솔루션을 제공하는 역할을 담당하고 있습니다.

Hyeong Sik Yang

Hyeong Sik Yang

양형식 솔루션즈 아키텍트는 다양한 데이터베이스 및 시스템 운영 경험을 바탕으로 리테일 기업 고객들의 요구사항에 맞춰 아키텍처를 제안하고, 비즈니스 성과 달성을 위해 최적의 클라우드 솔루션을 제공하고 있습니다.

Yongzhe Ren

Yongzhe Ren

렌(Yongzhe Ren) 솔루션즈 아키텍트는 다양한 분야의 엔지니어 경험을 바탕으로, 고객의 비즈니스 성과를 달성하도록 최적의 아키텍처를 구성하는 역할을 수행하고 있습니다.