Notice
Recent Posts
Recent Comments
Today
Total
03-29 01:50
Archives
관리 메뉴

Jeongchul Kim

AWS Lambda OpenCV 라이브러리 빌드 video processing 본문

AWS

AWS Lambda OpenCV 라이브러리 빌드 video processing

김 정출 2018. 12. 6. 12:41


AWS Lambda OpenCV 라이브러리 빌드 video processing

오늘은 비디오 프로세싱을 위해 Lambda와 S3를 이용한 프로젝트를 진행해보겠습니다.


S3에 비디오를 올리면 다른 버킷(bucket)에 Video processing의 결과의 이미지들이 저장됩니다. Lambda에는 open-cv 라이브러리를 빌드해 처리할 것입니다.


https://opencv-python.readthedocs.io/en/latest/doc/02.videoStart/videoStart.html



자세한 이전 과정은 다음의 글을 확인해주세요.

AWS Lambda Python 라이브러리 numpy 배포 패키지 만들기 matmul 실행

AWS Lambda PIL 라이브러리 빌드 image data augmentation


Lambda 함수 생성

처음해야 할 작업은 Lambda 함수를 생성하는 일입니다. video_processing 함수명으로 작성하고, Python 2.7 버전을 선택합니다. role도 설정해야 하는데 Lambda, S3에 Full Access를 주셔도 무방합니다.


생성된 ARN 주소를 기억해주세요. AWS EC2에서 빌드할 때 update-code를 실행하기 위해 Function ARN이 필요합니다.


충분한 메모리 설정이 필요합니다! 메모리와 TimeOut을 설정해주세요.


S3 Bucket 생성

다음은 이미지를 업로드할 버킷과 데이터 확대를 하고 나서 저장될 버킷 2개를 생성해야 합니다.

웹사이트에서 사용자에 의해 업로드되거나 테스트할 이미지를 업로드할 버킷은 video-pre-store 이라고 하겠습니다.




비디오 프로세싱(processing)으로 생성된 결과 이미지를 저장할 버킷은 result-video-processing 이라고 하겠습니다.



AWS EC2 OpenCV 라이브러리 빌드

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/current-supported-versions.html


Lambda 전용 AMI 이미지를 선택하고 인스턴스를 시작합니다. 저는 t2.medium을 사용하였습니다.


자동화 스크립트 다음과 같습니다.

https://github.com/KimJeongChul/aws-lambda/blob/master/s3/lambda/video-processing/opencv_build_script.sh


#!/bin/bash

development_install () {
sudo yum -y upgrade
sudo yum -y groupinstall "Development Tools"
}

create_virtualenv () {
cd ~
virtualenv --python=python2.7 opencv
source ~/opencv/bin/activate
}

pip_install () {
pip install opencv-python
}

zip_library () {
     cd ~/opencv/lib64/python2.7/dist-packages/
zip -r9 ~/OpenCV.zip .
}

main () {
development_install
create_virtualenv
pip_install
zip_library
}

main



우선 설치해야 할 것은 다음의 패키지입니다.

$ sudo yum -y upgrade

$ sudo yum -y groupinstall "Development Tools"


pip install을 진행할 가상 환경을 생성합니다.

$ virtualenv --python=python2.7 opencv

$ source ~/opencv/bin/activate


$ pip install opencv-python


$ cd opencv/lib64/python2.7/dist-packages/

$ ls


numpy도 자동으로 설치된 모습이 보입니다.

Python 코드 작성

https://opencv-python.readthedocs.io/en/latest/doc/02.videoStart/videoStart.html


코드는 GitHub에 올려 놓았습니다.

https://github.com/KimJeongChul/aws-lambda/blob/master/s3/lambda/image-data-augmentation/lambda_function.py


$ mkdir ~/video-processing

$ cp OpenCV.zip ~/video-processing/VideoProcessing.zip

$ cd ~/video-processing

$ vi lambda_function.py


import boto3
import os
import sys
import uuid
import cv2

s3_client = boto3.client('s3')

TMP = "/tmp/"
FILE_PATH_INDEX = 0
FILE_NAME_INDEX = 2

Video Processing 함수입니다.

Video를 읽어와 프레임 단위의 이미지로 나누고 이미지를 Resize하여 저장합니다.


def video_processing(file_name, video_path):
   result_file_path = []

   video = cv2.VideoCapture(video_path)
   idx = 0

   print "Video Processing Start ..."

   while(video.isOpened()):
       ret, frame = video.read()
       width = video.get(3)
       height = video.get(4)

       if idx == 100:
           break

       if ret < 0:
           break

       frame = cv2.resize(frame, (720, 480))
       result_path = video_path.split(".")[FILE_PATH_INDEX]+str(idx)+".jpg"
       result_file_path.append(result_path)

       cv2.imwrite(result_path, frame)

       idx += 1

   vido.release()
   print "Video Processing Done ..."
   return result_file_path

Lambda Handler에서는 S3에 업로드된 비디오의 이벤트에서 이름과 key를 받아 /tmp/에 다운을 받고 video_processing 결과의 이미지 파일을 S3 버킷에 업로드합니다.


def lambda_handler(event, context):
   for record in event['Records']:
       bucket = record['s3']['bucket']['name']
       key = record['s3']['object']['key']
       download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)

       s3_client.download_file(bucket, key, download_path)
       file_name = key

       result_path = video_processing(file_name, download_path)

       for upload_path in result_path:
           s3_client.upload_file(upload_path, 'result-video-processing', upload_path.split("/")[FILE_NAME_INDEX])

       print "S3 Upload Done ..."



$ zip -g VideoProcessing.zip lambda_function.py

AWS Lambda Function deploy

aws cli를 사용하기 이전에 user의 secret key와 access key를 등록하고 사용하려는 region을 지정해야 사용 가능합니다.

$ aws configure


AWS EC2에서 aws cli를 이용해 Lambda에 함수를 업데이트 합니다. 이 때 update-function-code를 이용합니다.


$ aws lambda update-function-code --function-name arn:aws:lambda:us-east-1:741926482963:function:video_processing --zip-file fileb://VideoProcessing.zip

S3 - Lambda

Lambda 콘솔로 이동해서 S3를 Trigger로 설정합니다.



밑에서 Trigger를 발생할 Bucket을 고르고 Event type으로 ‘All object create events’를 설정합니다.

테스트

자 연동 작업도 마무리를 지었으니 테스트를 진행해봅시다.

실제로 vido-pre-store 버킷에 비디오를 업로드 해봅시다.



업로드를 완료했습니다.

CloudWatch

CloudWatch에서 Lambda 함수의 로그를 확인하여 진행 사항을 볼 수 있습니다.

결과

결과는 result-video-processing에서 확인할 수 있습니다.







Comments